기존 구조
@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
@Schema(description = "API 응답 공통 포맷")
public class ApiResponse<T> {
@Schema(description = "성공 여부", example = "true")
private boolean success;
@Schema(description = "응답 데이터")
private T data;
@Schema(description = "메시지", example = "요청 성공")
private String message;
@Schema(description = "에러 정보")
private ErrorDetail error;
지금 구조는 ApiResponse 하나에 성공/실패를 모두 때려 넣은 구조
문제점
목표
핵심 아이디어
공통 상위 인터페이스
package com.chukchuk.haksa.global.common.response;
import io.swagger.v3.oas.annotations.media.Schema;
// 공통 상위 인터페이스
@Schema(description = "API 응답 공통 인터페이스")
public interface ApiResponse {
boolean isSuccess();
}
API 성공 응답 포맷
@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
@Schema(description = "API 성공 응답 포맷")
public class SuccessResponse<T> implements ApiResponse {
@Schema(description = "성공 여부", example = "true")
private final boolean success = true;
@Schema(description = "응답 데이터")
private final T data;
@Schema(description = "메시지", example = "요청 성공")
private final String message;
private SuccessResponse(T data, String message) {
this.data = data;
this.message = message;
}
public static <T> SuccessResponse<T> of(T data) {
return new SuccessResponse<>(data, null);
}
public static <T> SuccessResponse<T> of(T data, String message) {
return new SuccessResponse<>(data, message);
}
}
API 실패 응답 포맷
package com.chukchuk.haksa.global.common.response;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
@Schema(description = "API 실패 응답 포맷")
public class ErrorResponse implements ApiResponse {
@Schema(description = "성공 여부", example = "false")
private final boolean success = false;
@Schema(description = "에러 상세")
private final ErrorDetail error;
private ErrorResponse(ErrorDetail error) {
this.error = error;
}
public static ErrorResponse of(String code, String message) {
return new ErrorResponse(new ErrorDetail(code, message, null));
}
public static ErrorResponse of(String code, String message, Object details) {
return new ErrorResponse(new ErrorDetail(code, message, details));
}
}
리팩토링 구조의 장점