REST API를 구현할 때는, 적절한 http status code를 반환하는 것이 중요하다.
하지만, 바로 앞 포스팅의 실행결과에서는, POST method 성공 시 얻어야 할 응답상태는 201인데, 200(spring에서 기본으로 제공해주는 상태코드)가 뜬 것을 확인할 수 있었다 ‼️
이번 포스팅에서 올바른 http response status code를 리턴할 수 있도록 코드를 짜주자!
response status code에 맞게 메서드가 여러 개 있고, 그 중에서 필요한 response status 관련 메서드를 사용하면 된다.
// POST /users
@PostMapping("/users")
public ResponseEntity<User> CreateUser(@RequestBody User user) {
service.save(user);
return ResponseEntity.created(null).build();
}
빌더를 이용해 CREATED statuc code(201)를 생성했다.
그 결과,
하지만 아직 코드를 개선할 사항은 남아있다. 코드를 개선할 때는 항상 API 사용자 입장에서 생각해야 한다. 만일, REST API 사용자가 create user를 하려고 한다.
user resource가 추가되면 201 response status code를 반환하는 건 이미 만들었는데, 새로 추가된 user resource의 정보만 반환해서 REST API 사용자에게 보여줄 수는 없을까?
예를 들어, 추가된 /users/4의 정보만 반환해줄 수는 없을까?
@PostMapping("/users")
public ResponseEntity<User> CreateUser(@RequestBody User user) {
User savedUser = service.save(user);
// /users/4 => /users/{id}, user.getID
URI location = ServletUriComponentsBuilder.fromCurrentContextPath()
.path("/{id}").buildAndExpand(savedUser.getId()).toUri();
return ResponseEntity.created(location).build();
}
보통 생성된 resource의 URL을 반환할 때 사용하는 HTTP 헤더로 location 헤더
를 사용한다!
또한, ResponseEntity의 created메서드는 URL location헤더를 매개변수로 받을 수 있다.
/users/4 => /users/{id}, user.getID
/users 부분을 pick up하고, 거기야 /{id}를 append하고, id부분에는 user.getID 부분이 들어가야 한다.
fromCurrentContextPath()
→ 현재 request의 url을 반환해준다. 즉 /users를 반환
path()
→ 현재 url에 /{id} url를 append시키고,
buildAndExpand
로 path parameter값을 추가된 유저의 id로 replace시키고,
toUri()
→ URI 클래스 형태로 반환시켜준다
POST method로 정적 데이터 값 3개를 가진 User에서 데이터값을 user resource 1개를 추가한 결과,
참고 및 출처
이 시리즈는 Udemy 강의의 내용을 정리한 것입니다.
https://www.udemy.com/course/spring-boot-and-spring-framework-korean/