@ResponseStatus
응답으로 보낼 데이터의 HttpStatus를 명시해주는 방법이다. 컨트롤러에서 Body 데이터만 반환하는 경우 HttpStatus를 명시하기 위해 사용한다.
1
2
3
4
5
6
@ResponseStatus(HttpStatus.OK)
@GetMapping("/article")
public ArticleListDto getArticles(SelectArticlesQuery query) {
ArticleListDto articleListDto = articleService.getArticleList(query);
return articleListDto;
}
ResponseEntity
스프링에선 HTTP 요청 혹은 응답을 나타내기 위해 제공하는 HttpEntity라는 클래스가 존재하며, HttpEntity는 HttpHeader와 HttpBody를 포함하는 클래스이다.
이러한 HttpEntity를 상속하여 추가적으로 HttpStatus 속성을 더 가지는 클래스가 RequestEntity, ResponseEntity 클래스이다.
제네릭으로 선언되어있으며 해당 부분은 HttpBody 타입을 나타낸다.
1
2
3
4
5
@GetMapping("/article")
public ResponseEntity<ArticleListDto> getArticles(SelectArticlesQuery query) {
ArticleListDto articleListDto = articleService.getArticleList(query);
return ResponseEntity.ok(response);
}
@ResponseStatus의 단점
@ResponseStatus는 단 하나의 응답 상태 코드를 지정하는 것 외에 다른 작업이 불가능하다는 것이 가장 큰 단점이다. 따라서 보통 @ResponseStatus는 에러 핸들링 컨트롤러에서 주로 사용하고, 실제 서비스를 담당하는 컨트롤러에서는 사용하기에 불편하다.
ResponseEntity의 경우 필요하다면, 컨트롤러 메서드 내부에서 오류 상태 코드를 지정하여 오류를 보낼 수 있다. 또한 Header에 대한 설정도 가능하다. 따라서 @ResponseStatus에 비해 유연성이 좋다.
출처
https://joojimin.tistory.com/54