ResponseEntity?
Java Spring의 문서를 보면 ResponseEntity를 다음과 같이 이야기한다.
Extension of HttpEntity that adds an HttpStatusCode status code. Used in RestTemplate as well as in @Controller methods.
HttpStatusCode 상태 코드를 추가한 HttpEntity의 확장이라고 설명하고 있다.
HttpEntity
public class HttpEntity<T> {
public static final HttpEntity<?> EMPTY = new HttpEntity<>();
private final HttpHeaders headers;
@Nullable
private final T body;
...
}
ResponseEntity`
public class ResponseEntity<T> extends HttpEntity<T> {
private final Object status;
public ResponseEntity(@Nullable T body, @Nullable MultiValueMap<String, String> headers, HttpStatusCode status) {
this(body, headers, (Object) status);
}
...
// Static builder methods
...
}
비교
HttpEntity에서 존재하지 않았던 Status라는 Object 변수가 추가되었다.
ResponseEntity에서 직접적으로 Status를 설정할 수 있게 되었다.
String 반환과 ResponseEntity<> 반환 차이
@RestController를 사용하여 ResponseBody로 인해 Json형식으로 리턴이 가능할 때, 반환 타입은 사실 크게 차이나 보이지 않는다.
ResponseEntity 사용
@RestController
@RequestMapping("/api/v1")
public class CodeRestController {
@GetMapping("/hello")
public ResponseEntity<String> hello(){
return ResponseEntity.ok().body("hello");
}
}
String 사용
@RestController
@RequestMapping("/api/v1")
public class CodeRestController {
@GetMapping("/bye")
public String bye(){
return "bye";
}
}
상태코드..?
상태 코드를 따로 넣어야 하는 상황이 발생했을 때, 어떻게 될까?
ResponseEntity의 경우에는 status를 사용해서 원하는 상태코드를 바로 입력할 수 있으나, String 반환 타입의 경우에는 HttpServletResponse를 사용하여 set명령어로 상태코드를 입력해주어야 한다.
@RestController
@RequestMapping("/api/v1")
public class CodeRestController {
@GetMapping("/hello")
public ResponseEntity<String> hello(){
return ResponseEntity.status(400).body("hello");
}
@GetMapping("/good")
public String good(HttpServletResponse response){
response.setStatus(400);
return "good";
}
}
정리
HTTP의 Header의 유연하지 않음과 Status를 따로 설정해줘야 하는 문제점을 해결하여 HTTP의 필요 반환 정보를 모두 담아 객체로 만들어 반환한다.
또한 ResponseEntity에서는 Builder 패턴을 제공(ResponseEntity 클래스의 2/3가 빌더 패턴을 위한 코드 같다)해서 가독성 좋게 설정할 수도 있다..!
일단 좀 더 고민해보자.
레퍼런스
'Server > Java' 카테고리의 다른 글
동시성을 해결하기 위한 방법 (0) | 2023.05.21 |
---|---|
[Java] Javadoc Export 명령어 (0) | 2023.05.16 |
[Java] Builder 패턴이란? @Builder (0) | 2023.05.03 |
[Spring] Lombok @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor (0) | 2023.04.26 |
[JDBC] 데이터베이스 연결 (0) | 2022.11.08 |