백엔드

REST API 상태 코드 관리

do_hyuk 2024. 2. 1. 22:00

Spring관련 공부를 하다가 HTTP Status Code 제어 파트가 나왔다.

좋은 REST API를 설계하는 방법 중 하나는 서버로부터 적절한 상태코드를 반환시키는 것이다.

때문에 그에 대해 더 알고싶어서 찾아보게 되었다.

 

이 글은 POST 201 상태코드에 대한 내용을 정리하였고, 차차 ResponseEntity를 이용한 상태코드 관리법을

더 정리할 예정이다.

(HTTP 상태 코드란?)


UserController에서 새로운 user를 저장하는 코드를 가지고 왔다.

@PostMapping("/users")
public void createUser(@RequestBody User user) {
	User savedUser = service.save(user);
 }

Post를 사용하고, http요청의 본문(body)를 통째로 자바 객체로 변환하여 매핑된 메소드 파라미터로 전달해준다.

 

@RequestBody는 HttpMessageConverter가 HTTP RequestBody내의 데이터를
객체로 변환(역직렬화)하도록 시키는 애노테이션이다.

 

PostMan을 통해 위의 코드로 진행하면,

상태코드가 200이 나오는 것을 알 수 있다.

그러나 나는 POST를 사용하였기때문에 201이 나오는 것이 더 좋은 설계가 될 것이다.

 

때문에 코드를 아래와 같이 수정해주었다.

@PostMapping("/users")
public ResponseEntity createUser(@RequestBody User user) {
	User savedUser = service.save(user);
    
    URI location = ServletUriComponentsBuilder.fromCurrentRequest()
                .path("/{id}")
                .buildAndExpand(savedUser.getId())
                .toUri();
	return ResponseEntity.created(location).build();
}

 

ServletUriComponetsBuilder 사용자의 요청에 따른 작업을 처리한 후, 결과 값을 토대로 URI를 생성해주는 역할을 한다. 위의 코드를 보면, /users 등록 작업을 요청하였으니, 등록이 성공한 다음에는 클라이언트에게 성공 여부와 상세 정보페이지에 대한 URI 값을 전달하기 위해 URI객체를 생성하는데 사용된다. 생성된 객체는 클라이언트의 response header 또는 response body에 포함하여 전달할 수 있다.

 

fromCurrentRequest()를 사용하여 현재 요청된 Request값을 사용한다

 

path는 반환시킬 위치를 의미한다.

 

builAndExpand에 새롭게 설정한 id값을 path에 지정시켜준다.

 

toUri를 통해 URI로 반환시켜준다.

 

그전에는 리턴값이 없어 void를 주었지만, 이번에는 ResponseEntity를 통해 User를 반환하게 한다.

.created() 메소드는 반환 객체에 대한 response타입을 결정하는데, created로 할 경우 201코드를 반환하여 준다.

 

ResponseEntity.status(상태코드).body(객체) 
이런식으로 상태코드를 지정할수도있으며, body가 없을 경우 build()를 사용할 수 있다.

ResponseEntity.ok(member)를 사용하면 상태코드와 body를 한번에 사용할 수 있다.

상태코드가 201로 나오는 것을 확인할 수 있다.

이는 요청이 성공적이었고, 그 결과 새로운 리소스가 생성되었음을 알려준다.

 

또한 Header의 Location에는 새로 추가된 URI를 확인할 수 있다.

이렇게 POST 메소드의 반환값에 URI를 추가하면 다시한번 서버에 id값을 물어볼 필요가 없어 그만큼 네트워크 트래픽을 줄일 수 있다.