보통 REST API를 구성할 때, 범하는 실수가 요청이 성공했을 때 단순 HTTP 응답에서 상태 코드로 200 OK
만 반환하는 것이다.
200 OK
로 물론 해당 요청이 성공했음을 알 수는 있지만, 정확히 어떠한 결과를 낳았는지 알기 어려울 때가 있다.
2xx
코드의 종류는 아래와 같다.
201 Created
(새로운 리소스가 생성됨)Location
헤더 필드로 식별한다.202 Accepted
(요청 접수가 완료됐지만, 예약된 시간에 실행될 것임)204 No Content
(서버가 요청을 성공적으로 수행했지만, 응답 페이로드 본문에 보낼 데이터가 없음)물론 실제 개발 환경에서는 모든 개발팀이 규약을 정하고 정해진 규칙대로 코드를 사용하는 것이 가장 이상적이다.
@PostMapping("")
// @RequestBody: HTTP 요청 Body 영역에 User 객체가 올 것이다.
public ResponseEntity<User> addUser(@RequestBody User user) {
User savedUser = service.save(user);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedUser.getId())
.toUri();
return ResponseEntity.created(location).build();
}
기존에는 단순히 User
를 생성만 했다면, 이번에는 동작이 조금 바뀌었다.
ServletUriComponentBuilder
로 location
에 사용될 URI 생성ResponseEntity
객체를 통해 HTTP Status code 201(created()
)로 응답하고 어떤 리소스가 생성되었는지 location
도 헤더를 통해 올바르게 반환하였다.올바르게 201 Created
로 응답이 오고, location
에 우리가 생성한 리소스에 접근하는 경로까지 출력해준다.
ResponseEntity
객체에서는 created(201)
뿐만 아니라, accepted(202)
, noContent(204)
, badRequest(400)
, internalServerError(500)
, notFound(404)
등 자주 쓰이는 상태코드를 가독성 좋은 메소드로 제공한다.