
들어가기
HTTP 응답을 제어할 수 있는 ResponseEntity 객체에 대해서 알아보자.
ResponseEntity
ResponseEntity는 HttpEntity를 상속하여 구현되어 있다. HttpEntity의 구현 필드를 살펴보자.
public class HttpEntity<T> {
public static final HttpEntity<?> EMPTY = new HttpEntity();
private final HttpHeaders headers;
@Nullable
private final T body;
...
}
HttpEntity는 HttpHeader를 설정할 수 있는 필드와, 제네릭 타입으로 Body 필드를 가지고 있다. 다음으로 이를 상속하는 ResponseEntity의 필드를 보자.
public class ResponseEntity<T> extends HttpEntity<T> {
private final HttpStatusCode status;
...
}
ResponseEntity는 필드로 HttpStatus를 설정하는 필드를 가지고 있고, HttpEntity를 상속하기 때문에 HttpEntity의 필드들도 제어할 수 있다. 실제로 어떻게 프로젝트에서 적용할 수 있는지 다음 코드를 보자.
@PostMapping("/api/articles")
public ResponseEntity<Article> addArticle(@RequestBody AddArticleRequest request) {
Article savedArticle = blogService.save(request);
return ResponseEntity.status(HttpStatus.CREATED).body(savedArticle);
}
@GetMapping("/api/articles")
public ResponseEntity<List<ArticleResponse>> findAllArticles() {
List<ArticleResponse> articles = blogService.findAll()
.stream()
.map(ArticleResponse::new)
.toList();
return ResponseEntity.ok().body(articles);
}
ResponseEntity를 사용할 때에는 제네릭으로 사용한다. 즉, ResponseEntity<반환 타입>으로 지정한다. 위에서 설명했듯이 HTTP 응답에 필요한 요소로 HttpHeader, Body, HttpStatus를 입력해서 사용한다. 추가로, 사용할 때 Builder(빌더) 패턴을 사용하는 것을 권장하고 있다. 이렇게 사용하면 HttpStatus 코드를 잘못 입력하는 실수를 막을 수 있기 때문이다.
HTTP Status Code(HTTP 응답 코드)
- 200 OK : 요청이 성공적으로 수행되었음.
- 201 Created : 요청이 성공적으로 수행되었고, 새로운 리소스가 생겼음.
- 400 Bad Request : 유효하지 않은 요청으로 요청에 실패함.
- 403 Forbidden : 권한이 없어서 요청에 실패함.
- 404 Not Found : 요청한 자원의 리소스가 없어서 요청에 실패함.
- 500 Internal Server Error : 서버 오류로 요청 실패함.