스프링에서 제공하는 ResponseEntity 타입은 개발자가 직접 결과 데이터와 HTTP 상태코드를 제어할 수 있는 클래스다.
// ResponseEntity 선언 구조
public class ResponseEntity extends HttpEntity {
private final Object status;
}
ResponseEntity의 구조를 보게 되면, 위과 같이 Status만 필드값으로 가지고 있다.
이는 ResponseEntity에서 직접적으로 Status Code 를 지정할 수 있다는 것을 의미한다.
| HttpBody | HttpHeaders | HttpStatus |
👉 ResponseEntity 클래스를 사용하면 (결과값, 상태코드, 헤더값) 을 모두 프론트에 넘겨줄 수 있고, 에러코드 또한 섬세하게 설정해서 보내줄 수 있다는 장점이 있다
@RequiredArgsConstructor
@RestController
public class ResponseEntityController {
private final ResponseEntityService service;
@GetMapping("/user/{id}")
public ResponseEntity<MyDto> findByid(@PathVariable Long id) {
User user = service.getUser();
MyDto dto = new MyDto();
HttpHeaders header = new HttpHeaders();
header.setContentType(new MediaType("application", "json", Charset.forName("UTF-8")));
dto.setStatus(StatusEnum.OK);
dto.setData(user);
dto.setMessage("메세지메세지!");
return new ResponseEntity<>(dto, header, HttpStatus.OK);
}
}
ResponseEntity를 뜯어보면 이미 생성자가 다양하게 작성되어 있어 status값만 넣거나, body만 넣어도 ResponseEntity의 나머지 값은 null로 들어가는 것을 알 수 있다.
@PostMapping("/post")
public ResponseEntity<PostResponseDto> createPost(@RequestBody PostRequestDto request, @AuthenticationPrincipal UserDetailsImpl userDetails){
PostResponseDto response = postService.createPost(request, userDetails.getUser());
return new ResponseEntity<>(HttpStatus.OK);
return new ResponseEntity<>(response, HttpStatus.CREATED);
return new ResponseEntity<>(response, new HttpHeaders(HttpHeaders.EMPTY), HttpStatus.CREATED);
}
ResponseEntity를 사용 시 생성자 사용보다는 Builder 사용을 권장하고 있다.
그 이유는 숫자 상태 코드를 넣을 때, 잘못된 숫자를 넣는 실수가 발생할 수 있기 때문이다.
@PostMapping("/post")
public ResponseEntity<void> createPost(@RequestBody PostRequestDto request, @AuthenticationPrincipal UserDetailsImpl userDetails){
PostResponseDto response = postService.createPost(request, userDetails.getUser());
return return ResponseEntity.ok().build();
}
@PostMapping("/post")
public ResponseEntity<PostResponseDto> createPost(@RequestBody PostRequestDto request, @AuthenticationPrincipal UserDetailsImpl userDetails){
PostResponseDto response = postService.createPost(request, userDetails.getUser());
return return ResponseEntity.ok(response);
}
https://thalals.tistory.com/268