Springboot
[스프링 부트] Api 공통 spec
코딩 못하는 감자
2024. 7. 10. 20:50
먼저 상황에 따라 status code를 다양하게 내려주기 위해서
Enum 클래스로 새로운 status code를 만들어준다.
이때 Enum 클래스는 상속이 되지 않기 때문에 interface를 통해 틀을 잡아준다.
status code를 인터페이스로 구현함으로써 확장성을 챙기고 관리하기 용이해진다.
public interface ErrorCodeIfs {
Integer getHttpStatusCode();
Integer getErrorCode();
String getDescription();
}
@AllArgsConstructor
@Getter // 자동으로 오버라이드
public enum ErrorCode implements ErrorCodeIfs{ //enum클래스는 상속 x
OK(200, 200, "성공"),
BAD_REQEUST(HttpStatus.BAD_REQUEST.value(), 400, "잘못된 요청"),
SERVER_ERROR(HttpStatus.INTERNAL_SERVER_ERROR.value(), 500, "서버 에러"),
NULL_POINT(HttpStatus.INTERNAL_SERVER_ERROR.value(), 512, "Null Point")
;
private final Integer httpStatusCode;
private final Integer errorCode; //내부 코드
private final String description;
}
status code를 result에 이용한다.
오버로딩을 통해 다양한 상황에서 status code를 result로 만들어준다.
@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class Result {
private Integer resultCode;
private String resultMessage;
private String resultDescription;
public static Result OK() {
return Result.builder()
.resultCode(ErrorCode.OK.getErrorCode())
.resultMessage(ErrorCode.OK.getDescription())
.resultDescription("에러발생")
.build();
}
public static Result ERROR(ErrorCodeIfs errorCodeIfs){ // 외부에서 인자 주입 받음
return Result.builder()
.resultCode(errorCodeIfs.getErrorCode())
.resultMessage(errorCodeIfs.getDescription())
.resultDescription("성공")
.build();
}
public static Result ERROR(ErrorCodeIfs errorCodeIfs, Throwable tx){ //
return Result.builder()
.resultCode(errorCodeIfs.getErrorCode())
.resultMessage(errorCodeIfs.getDescription())
.resultDescription(tx.getLocalizedMessage()) //실제로 찍힌 메시지
.build();
}
public static Result ERROR(ErrorCodeIfs errorCodeIfs, String description){
return Result.builder()
.resultCode(errorCodeIfs.getErrorCode())
.resultMessage(errorCodeIfs.getDescription())
.resultDescription(description)
.build();
}
}
마지막으로 result와 body내용을 래핑하는 Api 메서드를 정의하였다.
에러 발생 시 body 부분은 비기 때문에
OK를 제외한 다른 메서드에서는 제네릭 타입 대신 Object를 넣어주었다.
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Api<T> { // Json 모양
private Result result;
@Valid
private T body;
public static <T> Api<T> OK(T data){
var api=new Api<T>();
api.result=Result.OK();
api.body=data;
return api;
}
public static Api<Object> ERROR(Result result){
var api=new Api<Object>();
api.result=result;
return api;
}
public static Api<Object> ERROR(ErrorCodeIfs errorCodeIfs){
var api=new Api<Object>();
api.result=Result.ERROR(errorCodeIfs);
return api;
}
public static Api<Object> ERROR(ErrorCodeIfs errorCodeIfs, Throwable throwable){
var api=new Api<Object>();
api.result=Result.ERROR(errorCodeIfs, throwable);
return api;
}
public static Api<Object> ERROR(ErrorCodeIfs errorCodeIfs, String description){
var api=new Api<Object>();
api.result=Result.ERROR(errorCodeIfs, description);
return api;
}
}