본문 바로가기
스프링

ResponseEntity - Spring Boot에서 응답하기

by 위대한초밥V 2023. 9. 20.

웹 서비스에서는 많은 데이터를 정해진 형식에 맞게 가공하여 전달한다. 대표적인 요청 및 데이터 형식을 HTTP(HyperText Transport Protocol)이라고 한다.

HTTP 응답은 status code, header, body로 구성되어 있다. 이 세 가지 요소를 갖춘 객체를 생성하는 것이 ResponseBodyResponseEntity이다.

 

ResponseBody

ResponseBody는 HttpEntity를 상속받아 데이터와 상태 코드를 제어하는 클래스이다. HttpMessageConverter가 해당 Annotation이 붙은 객체를 response body에 직렬화하여 동작한다.

다음과 같이 @ResponseBody 어노테이션을 명시하면 응답 형식을 설정할 수 있다. 다만 데이터만 제공하고, Header, Status에 대해 따로 설정해줘야 한다.

@ResponseBody
public RostInfoResponse createPost(@RequestHeader(name = "token") String token,
								   @RequestBody PostCreateRequest requestDto) {
	PostInfoResponse postInfoResponse = postService.createPost(token, requestDto);
	return postInfoResponse;
}

 

ResponseEntity

ResponseEntity는 Annotation이 아닌 변환할 정보를 담은 요소를 객체로 만들어서 반환한다.

  • HttpMessageConverter에서 응답이 되는 본문을 처리하고
  • RESTTemplate에 나머지 구성 요소은 status를 넘겨준다.

ResponseEntity 선언 구조

직접 status code를 지정할 수 있다. 나머지 부분들은 상속받은 HttpEntity에 구현되어 있다.

public class ResponseEntity extends HttpEntity {
	private final Object status;
}

 

HttpEntity 선언 구조

ResponseEntity는 HttpEntity를 상속한다.

public class HttpEntity<T> {
	public static final HttpEntity<?> EMPTY = new HttpEntity<>();
  
    private final HttpHeaders headers;
  
    @Nullable
    private final T body;
}

HttpEntity는 필드 타입의 HttpHeaders와 Generic 타입의 body를 갖는다.

Generic 타입의 body는 바깥에서 Wrapping 될 타입을 지정할 수 있고, 이 객체들은 자동으로 HTTP 규격에서 Body로 들어갈 수 있도록 반환된다.

 

constructor vs Builder

ResponseEntity는 Builder를 활용하여 객체를 생성할 것을 권장한다. 이유는 상태 코드를 넣을 때, 잘못된 숫자를 넣을 수 있기 때문이다.

 

constructor 사용

@GetMapping
public ResponseEntity<Page<PostInfoResponse>> findAllPost(@RequestParam(name = "page") int page,
                                                          @RequestParam(name = "size") int size) {
	Page<PostInfoResponse> pageResponse = postService.findPostPage(page, size);
	return new ResponseEntity<Page<PostInfoResponse>>(pageResponse, HttpStatus.valueOf(200));
}

Builder 패턴 사용

@GetMapping
public ResponseEntity<Page<PostInfoResponse>> findAllPost(@RequestParam(name = "page") int page,
                                                          @RequestParam(name = "size") int size) {
	Page<PostInfoResponse> pageResponse = postService.findPostPage(page, size);
	return ResponseEntity.ok().body(pageResponse);
}

 

⚡ Summary
Spring에서는 Http 응답 객체를 간편하게 생성할 수 있는 ResponseBody와 ResponseEntity를 제공합니다. ResponseBody는 @ResponseBody 애노테이션을 붙여서 사용하면 됩니다. 다만 Body 데이터만 제공하고, Header, Status는 따로 설정해줘야 합니다.
ResponseEntity는 HttpEntity를 상속받아 변환될 정보를 담아 응답 객체로 만들어 반환합니다. HttpEntity 클래스에 Generic 타입의 Body와 Field 타입의 HttpHeader가 있어, Header, Body, Status를 모두 다룰 수 있습니다. 객체 생성은 Builder 패턴을 사용할 것을 권장합니다.
반응형