프로젝트 (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 응답을 이해하고 사용하기 쉽게 만들어, 전반적인 개발 경험을 향상시킵니다.