[Spring] ResponseEntity가 무엇일까

stanley.·2022년 11월 17일

Spring

목록 보기
2/4
post-thumbnail

개요

컨트롤러 코드를 작성하며, Get, Post 등 각 api의 메소드의 리턴 값으로 ResponseEntity를 무의식적으로 수업 중에 쓰는 경우가 있었습니다.이에 대해 알아봐야 할 필요성이 있음을 느꼈고, ResponseEntity의 역할에 대해 공부해보려고 합니다. 이제, ResponseEntity가 무엇인지 알아보도록 합시다.

ResponseEntity

  • 요청에 대한 응답을 HTTP 형식의 코드로 우리가 직접 작성하는 것은 쉬운일이 아닙니다.
  • 그러나, 이 (응답 메시지)를 만들어주는 ResponseEntity를 통해, 쉽게 규격에 맞는 HTTP 응답을 생성할 수 있습니다.
  • ResponseEntity는 HTTP 응답을 빠르게 만들어주기 위한 객체로
  • @ResponseBody와 달리 Annotation이 아닌 객체로 사용됩니다. 즉, 응답으로 변환될 정보를 모두 담은 요소들을 객체로 만들어서 반환해줍니다.
  • 객체의 구성요소에서 HttpMessageConverter는 응답이 되는 본문을 처리해준 뒤에, RestTemplate에 나머지 구성 요소인 Status를 넘겨주게 되는 원리이죠.
  • 이는 유연한 헤더 설정을 할 수 없는 @ResponseBody의 문제점을 해결할 수 있습니다.

ResponseEntity의 구조를 뜯어보자

//ResponseEntity 선언 구조
public class ResponseEntity extends HttpEntity {

  private final Object status;
}
  • ResponseEntity의 구조를 보게 되면, 다음과 같이 status만 필드값으로 가고 있다.
    • 이는, ResponseEntity에서 직접적으로 Status Code를 지정할 수 있다는 것을 의미
  • 나머지 부분은 HttpEntity 부분에 구현되어 있는데, 이는 RequestEntity와 여러 설정들을 공유하기 때문이다.

HttpEntity의 구현 부분

//HttpEntity 선언 구조
public class HttpEntity<T> {
    public static final HttpEntity<?> EMPTY = new HttpEntity<>();
  
  
    private final HttpHeaders headers;
  
    @Nullable
    private final T body;
}
  • 위와 같이 ResponseEntity는 HttpEntity를 상속하여 구현이 됩니다.
  • HttpEntity에는 Generic 타입으로 Body가 될 필드 값을 가질 수 있습니다.
    • 제네릭 타입으로 인해, Body는 외부에서 Wrapping될 타입을 지정할 수 있게 되겠죠?
    • Wrapping된 객체들은 자동으로 HTTP 규격에서 body에 들어가도록 변환됩니다.
  • 또한, Field에 HttpHeaders 오브젝트를 가지고 있는데, 이는 ResponseBody와 다르게 객체 안에서 Header를 설정해줄 수 있음을 암시합니다.

ResponseEntity 활용 예제


    @GetMapping("/{id}")
    public ResponseEntity<UserResponseDTO> getUser(@PathVariable Long id){
        		UserResponseDTO userResponseDTO = userService.findById(id);
        		return ResponseEntity.ok().body(userResponseDTO);
    }

ResponseEntity.ok().body(body)

A shortcut for creating a {@code ResponseEntity} with the given body
and the status set to {@linkplain HttpStatus#OK OK}.

  • 위의 메시지는, 파라미터로 주어진 body로 http 응답 메시지의 body 값을 만들어주고, ok 즉 상태 코드를 200으로 설정해주는 빠른 방식을 의미합니다.
  • 즉, 응답 body에 body값을 설정해주고, 상태 코드 또한 설정해주는 것을 볼 수 있습니다.

결론

ResponseEntity는 @ResponseBody가 해주지 못하는 유연한 헤더 설정을 가능하게 해준다.

[ref]

ResponseEntity - Spring Boot에서 Response를 만들자

profile
🖥 Junior Developer.

0개의 댓글