💥 문제
@PostMapping
요청 성공 시 반환값으로 SuccessResponse.created()
를 사용했는데,
실제 응답은 201 CREATED
가 아닌 200 OK
가 반환되었다.
@PostMapping
public SuccessResponse<UserCreateResponse> signup(
@Valid @RequestBody UserCreateRequest request) {
return SuccessResponse.created("회원가입이 완료되었습니다.", userService.signup(request));
}
@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;
}
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);
}