상태 코드, 뭘 줘야할까?
상태 코드란?
어떤 상태 코드를 전달할지 고민하기 전에, 간단하게 상태 코드란 무엇인지 간단하게 짚고 넘어가자.
상태 코드는 말 그대로 클라이언트와 서버 간의 통신상태를 나타내는 약속된 코드다.
클라이언트는 이 상태 코드를 통해서 서버에게 보낸 요청이 어떻게 처리되었는지 일차적으로 알 수 있다.
적절한 상태 코드는 클라이언트가 서버의 응답 결과에 대한 후처리를 방식을 정하는 좋은 지표가 될 것이다.
50여 개의 3 자릿수 코드가 존재하고 백의 자리의 수에 따라 그룹을 구분한다.
1xx는 정보 응답, 2xx는 성공 응답, 3xx는 리다이렉트, 4xx는 요청오류, 5xx는 서버오류다.
x00번이 해당 그룹의 대표로 쓰이며 뒤의 숫자마다 각기 다른 세부 정보를 포함한다.
대표적으로 사용되는 코드들은 다음과 같다.
200 OK - 요청 성공
201 Created - 요청에 따른 새로운 리소스 생성 성공
204 No Content - 요청은 성공했지만 딱히 보내줄 내용이 없음
400 Bad Request - 잘못된 요청
401 Unauthorized - 비인증 요청
403 Forbidden - 비승인 요청
404 Not Found - 존재하지 않는 리소스에 대한 요청
500 Internal Server Error - 서버 에러
503 Service Unavailable - 서비스가 이용 불가능함
상태 코드에 대한 더 자세한 정보는 MDN web docs에서 확인할 수 있다.
// in PostConroller.java
@PostMapping("posts")
public ResponseEntity<Void> createPost(@RequestBody @Valid PostCreateRequest request,
@LoginMember Member member) {
PostCreateResponse response = postService.createPost(request, member);
return ResponseEntity.created(URI.create("/posts/" + response.getId())).build();
}
@GetMapping("posts/{postId}")
public ResponseEntity<PostResponse> showPost(@PathVariable Long postId) {
PostResponse response = postService.showPost(postId);
return ResponseEntity.ok(response);
}
// in CommonAdvice.java
@ExceptionHandler(RuntimeException.class)
public ResponseEntity<ErrorResponse> handleUnexpectedException(RuntimeException e) {
return ResponseEntity.badRequest()
.body(new ErrorResponse(e));
}
이제 상태 코드에 대해 알았으니, 위처럼 응답으로 적절한 코드를 전달해주기만 하면 될 것이다.
그렇다면 여기서 말하는 적절한 코드는 과연 무엇인가?
어떤 상태 코드를 줄까?
4xx vs 5xx
두 종류의 상태 코드는 서버 입장에서 요청이 잘못된 경우와 요청의 처리 과정 중 잘못된 경우로 나뉜다.
4xx 에러는 서버 측에서 예상할 수 있는 에러다.
GET posts/{id}
에 id 값이 아닌 해괴한 문자열을 넣은 요청이나 인증되지 않은 사용자의 요청 등이 있다.
대부분 클라이언트의 잘못된 요청이 해당 에러를 발생시킨다.
5xx 에러는