ResponseEntity vs @ResponseBody+DTO

이민정·2024년 6월 4일

HTTP body에 메시지를 설정하는 2가지 방법에 대해 소개하려 한다.
졸프를 하면서 해당 방법에 대해 고민을 많이 했는데, 내가 찾아본 정보들과 졸프에 어떤 방법을 적용할 것인지 정리할 예정이다.

ResponseEntity vs @ResponseBody+DTO

  1. ResponseEntity 사용
    ResponseEntity = HttpStats + HttpHeader + HttpBody
    ResponseEntity 사용 시 생성자 대신 빌더 패턴을 사용하는 것이 좋음
@PostMaping
public ResponseEntity<Void> save(@RequestBody 
  UserRequest userRequest){
  userService.save(userRequest);
  return ResponseEntity.created().build(); //상태 코드만 반환
}
  
@GetMapping
public ResponseEntity<UserResponse> save(Long UserId) {
    UserResponse response = userService.find(usesrId);
    return ResponseEntity.ok(response);//body까지 반환
}  

  1. @ResponseBody + DTO 사용
    @ResponseBody를 사용하면 자바 객체를 HTTP 응답 본문의 객체로 변환해 반환할 수 있음 -> @RestController에는 @ResponseBody가 포함되어 있으므로 @RestController 사용
    @ResponseStatus를 이용해 HTTP 상태 코드 설정 가능
@ResponseStatus(value = HttpStatus.CREATED)
@PostMapping
public void save(@RequestBody UserRequest userRequest) {
    userService.save(userRequest);
}

// 200인 경우 생략 가능
@GetMapping
public UserResponse find(Long userId) {
    return userService.find(userId);
}

각 방식을 언제쓰면 좋을까?

ResponseEntity

  • HTTPEntity 정보(헤더, status code)를 변경해야 할 때
  • 해당 요청이 여러 응답 형태로 내려갈 때

@ResponseBody + DTO

  • 응답을 strict하게 관리할 경우(요청,응답을 DTO로 관리할 때)


졸프에 적용한 방법

결론적으로 말하면 2번 방법인 @ResponseBody + DTO를 사용하기로 했다.
Controller에서는 응답으로 200만 핸들링하고, DTO를 반환했다는 것 자체가 이미 성공을 의미하므로 굳이 body에 message 또는 status code를 넣어 리턴하는 것이 비효율적이라고 생각했다.(프론트 개발자도 body에 message나 status code가 필요 없다고 했음)

찾다보니 정답은 없고 각 프로젝트에 맞게 사용하면 될 것 같다.

profile
🍳🎀🕶️👑🧸

2개의 댓글

comment-user-thumbnail
2024년 7월 11일

이건 나도 좀 찾아봐야 할 듯.. 잘 보고 갑니다 ㅎ
추가적으로 Velog 코드 넣을 때 ``` 옆에 java 붙이면 java 코드처럼 인식해줘서 보기 편함!

1개의 답글