본 포스팅은 인프런 - Spring Boot를 이용한 RESTful Web Service 개발 강의를 바탕으로 공부하고 정리한 글입니다.
HTTP Status Code 제어하기
클라이언트가 요청을 보내면 서버는 그 요청을 처리한 뒤 응답코드를 반환한다.
이때 응답코드로 적절한 상태코드를 반환하는 것이 좋은 REST API 설계하는 방법이다.
성공 응답이라 하여 그냥 200 OK만을 응답코드로 반환하는 것보다, 새로운 객체(인스턴스)생성이 있는 경우에는 201 Created와 함께 생성된 객체를 확인할 수 있는 정보를 함께 반환해준다면 더할나위 없이 좋을 것이다!
그럼 어떻게 상태코드를 제어할 수 있을까?
예제를 통해 알아보자.
간단하게 사용자를 등록하는 예제이다.
👉🏻 사용자 도메인 클래스
@Data
@AllArgsConstructor
public class User {
private Integer id;
private String name;
private Date joinDate;
}
👉🏻 사용자 서비스 클래스
@Service
public class UserDaoService {
private static List<User> users = new ArrayList<>();
private static int usersCount = 0;
public User save(User user) {
if (user.getId() == null) {
user.setId(++usersCount);
}
users.add(user);
return user;
}
}
응답코드 제어 전
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserDaoService service;
@PostMapping("/users")
public void createUser(@RequestBody User user) {
User savedUser = service.save(user);
}
}
컨트롤러의 반환타입이 void로 요청이 오면 사용자 등록을 하고, 등록에 성공한다면 응답코드로 단순히 성공응답인 200 상태코드를 반환하는 것을 확인할 수있다.
응답코드 제어 후
@RestController
@RequiredArgsConstructor
public class UserController {
private final UserDaoService service;
@PostMapping("/users")
public ResponseEntity<User> createUser(@RequestBody User user) {
User savedUser = service.save(user);
URI location = ServletUriComponentsBuilder.fromCurrentRequest()
.path("/{id}")
.buildAndExpand(savedUser.getId())
.toUri();
return ResponseEntity.created(location).build();
}
}
컨트롤러의 반환 타입을 void가 아닌 ResponseEntity로 지정해 응답코드를 제어해줄 수 있다.
사용자 등록 요청의 경우 새로운 객체가 생성되는 결과를 가지기 때문에 200보다는 201로 처리해주는 것이 더욱 적절하다.
201 응답코드를 전달함으로써 새로운 사용자가 추가되었음을 명시해줄 수 있기 때문이다.
또한 사용자의 id값은 서버에서 자동으로 생성되는 것이기 때문에 클라이언트 측에서 알 수가 없기때문에 클라이언트는 현재 생성된 사용자의 id값이 무엇인지 서버한테 다시 한번 물어봐야 한다.
이때 ServletUriComponentsBuilder를 사용해 요청 결과 값으로 생성된 id값을 함께 전달하면 그만큼 네트워크 트래픽이 감소하고 조금 더 효율적인 어플리케이션을 만들 수 있다.
'🌱 Spring > REST' 카테고리의 다른 글
REST API를 설계할 때 고려해야 할 사항 (0) | 2022.09.22 |
---|---|
Response 데이터 제어하기 : @JsonIgnore, @JsonIgnoreProperties, SimpleBeanPropertyFilter (0) | 2022.09.15 |
Exception Handling (0) | 2022.09.06 |
REST API (0) | 2022.08.28 |