프로젝트 (Java)/예약마켓

[프로젝트] 26. ResponseBodyAdvice를 활용한 공통 응답 형식 추가

hihyuk 2024. 1. 31. 09:34

프로젝트에 ResponseBodyAdvice를 활용하여 모든 응답에 공통 응답 형식을 추가하는 것은 API 응답의 일관성을 보장하고, 클라이언트 측에서 응답을 처리하기 용이하게 만듭니다. 이 접근 방식을 사용함으로써, 성공적인 요청의 결과뿐만 아니라 에러 응답까지도 표준화된 형태로 관리할 수 있게 됩니다.

 

SuccessResponse 클래스 구현

SuccessResponse 클래스는 API 응답의 공통 형식을 정의합니다. 이 클래스는 응답의 성공 여부, HTTP 상태 코드, 실제 데이터, 그리고 타임스탬프를 포함합니다.

package com.myshop.global.utils;

import java.time.LocalDateTime;
import lombok.Getter;

@Getter
public class SuccessResponse {

    private final boolean success = true;
    private final int status;
    private final Object data;
    private final LocalDateTime timeStamp;

    public SuccessResponse(int status, Object data) {
        this.status = status;
        this.data = data;
        this.timeStamp = LocalDateTime.now();
    }
}

 

SuccessResponseAdvice 구현

SuccessResponseAdvice 클래스는 ResponseBodyAdvice 인터페이스를 구현하여, 모든 컨트롤러 메소드의 응답 바디를 가공합니다. 이 클래스는 성공적인 응답에 대해 SuccessResponse 형태로 포장하여 반환합니다.

@RestControllerAdvice(basePackages = "com.myshop")
public class SuccessResponseAdvice implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(
            Object body,
            MethodParameter returnType,
            MediaType selectedContentType,
            Class selectedConverterType,
            ServerHttpRequest request,
            ServerHttpResponse response) {
        HttpServletResponse servletResponse =
                ((ServletServerHttpResponse) response).getServletResponse();

        int status = servletResponse.getStatus();
        HttpStatus resolve = HttpStatus.resolve(status);

        if (resolve == null) {
            return body;
        }

        if (resolve.is2xxSuccessful()) {
            return new SuccessResponse(status, body);
        }

        return body;
    }
}

 

응답 형식

이 구현을 통해 API에서 반환하는 모든 응답은 다음과 같은 표준화된 JSON 형식을 갖게 됩니다.

{
  "success": true,
  "status": 200,
  "data": {},
  "timeStamp": "2024-01-31T09:13:28.36657"
}

 

결론

이 접근 방식은 API 응답의 일관성을 보장하고, 프론트엔드에서 응답을 처리할 때 예측 가능한 구조를 제공합니다. 또한, 클라이언트 개발자가 API 응답을 이해하고 사용하기 쉽게 만들어, 전반적인 개발 경험을 향상시킵니다.