• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

ApiResponse에 HttpStatus를 설정하는것의 의미 관련 질문

23.10.06 10:25 작성 23.10.06 10:29 수정 조회수 641

4

  • 안녕하십니까! 항상 좋은 강의 감사드립니다.

ApiResponse에 HttpStatus를 필드로 두어,

응답 상황에 따라 적절한 HttpStatus를 설정하도록 강의에서 의도해주셨습니다.

실제로 저도 이런식으로 사용하고 있었는데요,

그런데 이번에 테스트 하면서 알게 된 것이지만,
ApiResponse에 HttpStatus를 넣어준다고 하더라도

실제 응답 HTTP의 status에는 반영이 되지 않고,

단순히 응답 body에만 설정한 status가 쓰여졌습니다.

아래 첨부한 사진을 보면 201로 setting 하였지만,

실제 응답은 200 인걸 예로 확인할 수 있었습니다.

스크린샷 2023-10-06 오전 10.19.37.png

그래서 제가 질문 드리고 싶은 부분은,

"그렇다면 응답을 어떻게 해야 하는가?" 입니다.

  1. ApiResponse라는 공통 응답을 한번 더

     

    ResponseEntity<> 안에 감싸서 보내는 방법을 생각해 볼 수 있을 것 같습니다.


    단 이방식은 ApiResponse의 status를 ResponseEntity의 status로 동기화 시켜주는 작업과,
    그리고 응답 타입도 ResponseEntity<ApiResponse<>>
    이런식으로 depth가 2번 생기게 되는
    단점이 있을 것 같습니다.
    (depth가 2번 생긴다는게 올바른 표현인지는 모르겠으나,
    서비스 응답을 ApiResponse로 한번 감쌌는데,
    이를 한번 더 ResponseEntity로 감싼 것을 2번의 depth로 표현하였습니다.)

  2. 두 번째로는 오직 응답 바디에 있는 값 만을 사용하기로 프론트와 규약을 정하고 사용하는 방법이 있을 것 같습니다.
    이렇게 하면 굳이 한번 더 ResponseEntity<>로 감쌀 수고는 덜어질 것 같습니다.

     


    제가 생각한 방식은 이렇게 두가지가 있을 것 같고,

     

    제가 속한 회사에서 기존 방식은 2번째 방식을 사용하고 있었습니다.

    그런데 , 저는 신규 프로젝트에 투입되어 있는 상황 이여서
    코드를 제가 원하는 대로? 짤 수 있는 상황
    인데요,,
    그래서 위 두가지 방식중에 어떤것이 좋을지,
    혹은 더 나은 방식이 있을지 질문 드리고 싶습니다.

    제가 3개월 차라 .. 경험이 많이 부족해서,,
    강사님 경험에 기반하여 답변해주시면 정말 감사하겠습니다.


 

답변 2

·

답변을 작성해보세요.

3

안녕하세요, khd1692 님! :)

저도 말씀주신 2번째 방법, 즉 클라이언트와 규약을 정하고 사용하는 방법으로 접근합니다. ㅎㅎ
ApiResponse라는 커스텀 객체를 만든 이유부터가, 클라이언트와의 원활한 협업, 그리고 공통 응답을 관리함으로써 오는 유지보수의 편리함 등 때문인데요.

추가적으로, 최근에는 이런 방법도 사용해보고 있어요.

  • 정상 응답의 경우 : 포장하지 않고 단순히 data만 응답 (ApiResponse에서 꺼내는 것도 일종의 일이므로)

  • 에러 응답의 경우 : 에러 응답에 대한 포맷을 정의하여 에러코드, 예외메시지 등을 포함한 정보를 넘김

    • ex) Spring 6.0.x 부터 추가된 ProblemDetail 사용(RFC 7807)

도움이 되셨기를 바랍니다.
감사합니다. :)

1

인프런 AI 인턴님의 프로필

인프런 AI 인턴

2023.10.08

안녕하세요, 인프런 AI 인턴이에요.

ApiResponse에 HttpStatus를 설정하는 것은 응답의 상태 코드를 지정하기 위한 것입니다. 일반적으로 API 응답 상황에 따라 다른 상태 코드를 반환해야 합니다. 예를 들어, 성공적으로 생성되었다면 201(Created) 상태 코드를 반환해야 하고, 실패했다면 400(Bad Request)나 500(Internal Server Error) 등 적절한 상태 코드를 반환해야 합니다.

하지만 단순히 ApiResponse에 HttpStatus를 넣어준다고 해서 실제 응답의 HTTP 상태 코드에 반영되지는 않습니다. ApiResponse의 HttpStatus는 단지 응답 body에 포함되는 상태 코드로 사용되는 정보일 뿐입니다.

따라서 ApiResponse의 HttpStatus 외에도 실제 응답의 상태 코드를 설정해주어야 합니다. 이를 위해 ResponseEntity를 사용하여 ApiResponse를 감싼 후, ResponseEntity의 상태 코드를 설정하고 응답을 반환하면 됩니다. 이 방식을 사용하면 ApiResponse의 HttpStatus와 ResponseEntity의 HttpStatus를 동기화시킬 수 있습니다. 단, 이 방식은 ApiResponse와 ResponseEntity 사이에 한 번의 추가적인 레이어가 존재한다는 단점이 있습니다.

즉, ResponseEntity<responseentity<apiresponse<t>>>와 같이 중첩된 형태가 생기게 됩니다. 이를 통해 ApiResponse의 상태 코드와 ResponseEntity의 상태 코드를 동일하게 설정할 수 있지만, 중첩된 형태가 복잡해지고 코드 가독성이 떨어질 수 있습니다. 이 부분에 대해서는 개발자의 판단에 따라 적절한 방식을 선택하시면 됩니다.</responseentity<apiresponse<t>

계속해서 궁금한 점이 있으시면 언제든지 물어보세요! 좋은 하루 되세요.