1. ResponseEntity
Spring 에서는 HttpEntity 라는 클래스를 제공한다. HttpEntity 는 HTTP 요청이나 응답에 사용되는 객체를 구현한 클래스로 HttpHeaders 와 HttpBody 를 포함하는 클래스이다. 이러한 HttpEntity 를 상속받아서 구현한 클래스가 ResponseEntity 와 RequestEntity 클래스이다. ResponseEntity 는 사용자의 HttpRequest 에 대한 응답 데이터를 포함하는 클래스이다. 그렇기 때문에 HttpEntity 로부터 상속받은 HttpHeaders, HttpBody 와 응답코드인 HttpStatus 를 포함한다.
ResponseEntity 는 status code, headers, body 등과 같은 모든 HTTP 응답을 표현한다. Spring 에서는 end point 의 반환 타입으로 ResponseEntity 를 사용하여 HTTP 응답을 표현할 수 있다. ResponseEntity 는 generic type 이기 때문에 어떤 타입으로도 response body 를 작성할 수 있다.
- Reponse Entity 사용 예제
@GetMapping("a")
public ResponseEntity<String> getHello() {
return new ResponseEntity<>("hello", HttpStatus.OK);
}
@GetMapping("b")
public ResponseEntity<String> getWithHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("Custom-Header", "headers");
return new ResponseEntity<>("with custom headers", headers, HttpStatus.OK);
}
@GetMapping("c")
public ResponseEntity<String> getHelloOk() {
return ResponseEntity.ok("hello")
}
@GetMapping("d")
public ResponseEntity<String> getNotFound() {
return ResponseEntity.notFound().build();
}
@GetMapping("e")
public ResponseEntity<String> getWithParams(@RequestParam String param) {
return ResponseEntity.ok().body(param);
}
위의 예제는 Spring MVC 의 Controller 에서 ResponseEntity 를 사용하여 HTTP Response 를 보내는 예제들이다.
기본적으로 ResponseEntity 클래스의 생성자를 사용하여서 header 나 body 의 값들을 정의할 수 있다. 위의 예제에서 "a" 와 "b" 요청에 대해서 각각 body 값과 status code, header 등을 사용하여 ResponseEntity 객체를 생성하고 이 결과를 반환하고 있다.
이외에도 ResponseEntity 는 builder 패턴을 제공하는데, HeadersBuilder 인터페이스와 BodyBuilder 인터페이스 기반의 builder 메서드를 제공한다. 각각의 메서드는 이름대로 HTTP Reponse 의 header 와 body 를 각각 정의할 수 있도록 해주는 메서드 인터페이스 들이다. 위의 예제에서 "e" 요청에 사용된 ok() 는 BodyBuilder, "d" 에서 사용된 notFound() 는 HeadersBuilder 인터페이스 타입의 메서드들이다. 이때 "c" 의 ok() 는 ResponseEntity 를 반환하는 메서드로 "e" 의 ok() 메서드와는 오버로딩 관계이기 때문에 잘 주의해서 사용하도록 한다.
- @ResponseBody
기본적으로 Spring MVC 의 endpoint 는 View, HTML 페이지를 렌더링하여 결과롤 반환한다. 그러나 때로는 페이지가 아닌 실제 데이터를 반환해야 하는 경우가 있다. 이 경우에 @ResponseBody 어노테이션을 사용할 수 있다. 해당 어노테이션을 request handler method 에 지정해주면 해당 메서드의 return 타입이 ResponseEntity 가 아니어도 메서드의 결과를 HTTP Response 의 body 에 포함시켜서 반환한다.
- @ResponseStatus
request handler method 의 결과의 Response Status code 를 어노테이션을 추가하여 지정할 수 있다.
@ResponstStatus 에 Http Status 를 지정해주면 해당 Status code 를 헤더에 추가한 response 를 반환한다. 이 방법은 주로 예외 처리 시에 많이 사용한다.
[Reference]
'Tech > Spring | SpringBoot' 카테고리의 다른 글
[Spring] lombok - @Builder (0) | 2023.01.30 |
---|---|
[Spring] MapStruct (1) | 2023.01.08 |
[SpringBoot] 예외처리 - 3 (@ExceptionHandler, @ResponseStatus, @ControllerAdvice) (0) | 2022.12.20 |
[SpringBoot] 예외처리 - 2 (HandlerExceptionResolver) (0) | 2022.12.08 |
[SpringBoot] 예외처리 - 1 (BasicErrorController) (0) | 2022.12.07 |