현재 진행 중인 프로젝트에서, API 를 설계할 때 공통 응답 포맷을 어떤 형식으로 할지 프론트엔드 분들과 상의를 한 결과 다음과 같은 포멧으로 응답 형식을 지정했다.
{
"success" : true,
"data" : ...,
"code" : "C001",
"message" : "..."
}
이와 같이 구성한 이유는 다음과 같다.
@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ApiResponse<T> {
private boolean success;
private T data;
private String code;
private String message;
public static ApiResponse<Void> ofSuccess() {
return new ApiResponse<>(true, null, null, null);
}
public static <T> ApiResponse<T> ofSuccess(T data) {
return new ApiResponse<>(true, data, null, null);
}
public static ApiResponse<Void> ofFail(ErrorCode errorCode, String message) {
return new ApiResponse<>(false, null, errorCode.getCode(), message);
}
}
@Getter
public enum ErrorCode {
// CLIENT
URL_NOT_FOUND(HttpStatus.NOT_FOUND, "C001"),
METHOD_NOT_ALLOWED(HttpStatus.METHOD_NOT_ALLOWED, "C002"),
METHOD_ARGUMENT_TYPE_MISMATCH(BAD_REQUEST, "C003"),
MISSING_REQUEST_PARAMETER(BAD_REQUEST, "C004"),
MEDIA_TYPE_NOT_SUPPORTED(UNSUPPORTED_MEDIA_TYPE, "C005"),
// SERVER
SERVER_ERROR(INTERNAL_SERVER_ERROR, "S001");
private final HttpStatus httpStatusCode;
private final String code;
ErrorCode(HttpStatus httpStatusCode, String code) {
this.httpStatusCode = httpStatusCode;
this.code = code;
}
public static class DetailMessage {
private DetailMessage() {
}
// CLIENT
public static final String URL_NOT_FOUND = "%s : 해당 경로는 존재하지 않는 경로입니다.";
public static final String METHOD_NOT_ALLOWED = "%s : 해당 HTTP 메소드는 지원되지 않습니다. 허용 메소드 : %s";
public static final String METHOD_ARGUMENT_TYPE_MISMATCH = "요청 파라미터에서 %s 값은 %s 타입이어야 합니다.";
public static final String MISSING_REQUEST_PARAMETER = "요청 파라미터에서 %s 값은 필수입니다.";
public static final String MEDIA_TYPE_NOT_SUPPORTED = "%s : 지원하지 않는 media type 입니다. 지원 type : %s";
// SERVER
public static final String SERVER_ERROR = "서버 내부에 문제가 생겼습니다.";
}
}