HttpStatus code 204 NO CONTENT

보람찬하루·2024년 10월 31일
2
post-thumbnail

문제 상황

픽플에서는 게스트가 원하는 클래스를 신청 후 참가비를 입금해야 지식 공유자인 스픽커에게 명단이 보일 수 있게 되어있다. 이때 운영진이 입금을 확인하고 신청 상태값을 승인대기로 변경해주는 api가 필요해서 구현하게 되었다.
우리는 클래스를 신청한 사람들에 대한 정보를 db에 테이블로 관리하고 있었는데 승인 대기 요청이 성공했을 때 db에서의 변화만 발생하기 때문에 이 의미를 담아 응답코드를 204(No Content)로 내려주고자 했다.
근데 이때 기본적으로 구현해놓은 ApiResponseDto형태로도 나타나지 않는 상황이 발생하였다.

스크린샷 2024-08-29 오후 5.41.46.png
)

문제 상황에서 설명한 것 처럼 구현이 완료되었고 api가 정상적으로 작동하였지만 postman에 위와같이 응답이 아무것도 담겨있지 않는것을 확인할 수 있다.

코드

해당 상황을 자세히 살펴보기 위해 구현되어있던 코드를 먼저 살펴보겠다.

  • controller
        @PatchMapping("v2/moimSubmission/{moimSubmissionId}")
        public ApiResponseDto updateMoimSubmissionStateToPendingApproval(@PathVariable Long moimSubmissionId) {
            moimSubmissionCommandService.updateMoimSubmissionStateToPendingApproval(moimSubmissionId);
            return ApiResponseDto.success(SuccessCode.MOIM_SUBMISSION_STATE_UPDATE_SUCCESS);
        }
  • ApiResponseDto
    @Builder
    public record ApiResponseDto<T>(
            @JsonIgnore HttpStatus httpStatus,
            int status,
            @NonNull String message,
            @JsonInclude(value = NON_NULL) T data
    ) {
        public static <T> ApiResponseDto<T> success(final SuccessCode successCode) {
            return ApiResponseDto.<T>builder()
                    .httpStatus(successCode.getHttpStatus())
                    .status(successCode.getCode())
                    .message(successCode.getMessage())
                    .data(null)
                    .build();
        }
    }
  • SuccessCode
    @Getter
    @AllArgsConstructor
    public enum SuccessCode {
        MOIM_SUBMISSION_STATE_UPDATE_SUCCESS(20400, HttpStatus.NOCONTENT, "모임 신청 내역 승인 대기로 변경 성공 성공");
    
        private final int code;
        private final HttpStatus httpStatus;
        private final String message;
    }

당시 내가 기대한 응답의 body는 아래와 같았다.

{
		"status" : 20400,
		"mesage" : "모임 신청 내역 승인 대기로 변경 성공"
}

해결 과정

왜 안나올까?

이때 평소와 다르게 구현한 부분은 HttpStatus를 NOCONTENT로 내려준 것 밖에 없었고 혹시나하는 마음에 아래와같이 OK로 바꿔줬다.

스크린샷 2024-08-29 오후 5.41.14.png

그랬더니 나의 기대값과 동일하게 body에 응답이 담기는 것을 확인할 수 있었다.

204 No Content

204 상태코드는 성공 상태 응답 코드로 요청이 성공했으나 content가 없다는 코드이다. 이는 클라이언트가 현재 페이지에서 벗어나지 않아도 된다는 것을 나타낸다. 사용되는 경우는 저장 후 편집 계속되는 것처럼 현재 페이지를 다른 페이지로 대체해서는 안되는, 즉 새로 데이터를 보여줄 필요가 없을 때 사용한다.

참고했던 사이트에선 서버에서 잘못된 본문을 포함한 응답을 전달하는 경우가 존재할 수 있기 때문에 사용에 주의해야한다고 한다.

나의 결론

  • 204 No Content가 유리한 경우는 아래와 같다
    1. 비동기 처리 완료 확인 : 클라이언트가 상태 확인을 주기적으로 서버에 요청하고 이에 대한 응답이 단순한 완료 이후에 전달할 내용이 없는 경우

    2. PUT/PATCH 요청 : 클라이언트가 리소스를 수정했을 때 변경사항을 서버에 반영하고, 추가적인 확인이나 결과가 필요하지 않은 경우

      위와같은 경우에 클라이언트와 서버 간의 불필요한 데이터 전송을 줄여 네트워크 성능에 이점이 있다고 생각한다.

위와같이 204 응답코드에 대해 알아보았다. 고민해본 결과 우리가 내려주는 응답 코드에 따라 클라이언트가 추가 작업이 진행했기 때문에 HttpStatus를 204 No Content가 아닌 200 Ok로 변경해주었다! 사소하게 지나칠 수 있는 응답에 대해 알아볼 수 있는 시간이었다.


참고 자료

profile
를 만들어 가자

0개의 댓글