POST 요청 성공 시 응답코드로 설정한 `201 CREATED`가 아닌 `200 OK`로 반환되는 문제

류넹·2024년 9월 8일
1

Trouble Shooting

목록 보기
15/18

💥 문제

  • @PostMapping 요청 성공 시 반환값으로 SuccessResponse.created()를 사용했는데,
    실제 응답은 201 CREATED가 아닌 200 OK가 반환되었다.
  • 작성한 API 코드
@PostMapping
public SuccessResponse<UserCreateResponse> signup(
                                       @Valid @RequestBody UserCreateRequest request) {
    return SuccessResponse.created("회원가입이 완료되었습니다.", userService.signup(request));
}
  • SuccessResponse 클래스
@Getter
public class SuccessResponse<T> {
    private HttpStatus success;
    private String message;
    private T data;

    public SuccessResponse(HttpStatus success, String message, T data) {
        this.success = success;
        this.message = message;
        this.data = data;
    }
    
    // 기대한 SuccessResponse.created() 반환값
    public static <T> SuccessResponse<T> created(String message, T data) {
        return new SuccessResponse<>(HttpStatus.CREATED, message, data);
    }
}


❓ 원인

  • SuccessResponse.created 메서드가 HttpStatus.CREATED를 반환하도록 설정하더라도,
    Spring은 기본적으로 ResponseEntity를 사용하지 않으면 HTTP 상태 코드를 자동으로 설정하지 않는다.
  • Spring MVC는 컨트롤러 메서드에서 반환된 객체를 HTTP 응답 본문으로 직렬화하지만,
    상태 코드를 명시적으로 설정하지 않으면 기본값인 HttpStatus.OK(200)가 반환된다.
  • 즉, SuccessResponse.created()가 내부적으로 HttpStatus.CREATED를 설정하고 있어도, 이 정보는 응답의 실제 HTTP 상태 코드에 반영되지 않는다.


💡 해결

  • 반환값을 ResponseEntity<>로 감싸서 상태 코드를 명시적으로 설정했다.
    수정 후, 실제로 201 CREATED 상태 코드가 반환되었다.
@PostMapping
public ResponseEntity<SuccessResponse<UserCreateResponse>> signup(@Valid @RequestBody UserCreateRequest request) {
    SuccessResponse<UserCreateResponse> response = SuccessResponse.created("회원가입이 완료되었습니다.", userService.signup(request));
    return new ResponseEntity<>(response, HttpStatus.CREATED);
}
profile
학습용 커스터마이징 간단 개발자 사전

0개의 댓글