사용자로 인해 혹은 서버에서 에러가 발생했을 때, 예외의 내용이나 에러코드가 난잡하게 프론트로 전달된다면 매우 난감한 상황이 될 것입니다. 그래서 팀원과 상의하여 예외의 내용과 에러코드를 설정하고 이를 일관된 형태로 전달할 수 있도록 예외 class를 작성했습니다.
주요 로직은 ErrorCode, BusinessException, ErrorResponse class 입니다.
프로젝트에서 사용한 Exception class의 구조입니다.
구현 코드의 주요 부분입니다.
@Getter
public class BusinessException extends RuntimeException {
private ErrorCode errorCode;
public BusinessException(String message, ErrorCode errorCode) {
super(message);
this.errorCode = errorCode;
}
public BusinessException(ErrorCode errorCode) {
super(errorCode.getCode());
}
}
public class EntityNotFoundException extends BusinessException{
public EntityNotFoundException(String message) {
super(message, ErrorCode.ENTITY_NOT_FOUND);
}
}
@Getter
public class JsonLoginAuthenticationException extends AuthenticationException {
private ErrorCode errorCode;
public JsonLoginAuthenticationException(String message, ErrorCode errorCode) {
super(message);
this.errorCode = errorCode;
}
public JsonLoginAuthenticationException(ErrorCode errorCode) {super(errorCode.getCode());}
}
@Getter
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum ErrorCode {
// 공통
INVALID_INPUT_VALUE(400, "C001", "Invalid Input Value"),
METHOD_NOT_ALLOWED(405, "C002", "Invalid Input Value"),
ENTITY_NOT_FOUND(400, "C003", "Entity Not Found"),
INTERNAL_SERVER_ERROR(500, "C004", "Server Error"),
INVALID_TYPE_VALUE(400, "C005", "Invalid Type Value"),
// User
EMAIL_DUPLICATION(409, "U001", "Email is duplicated"),
// Product
OUT_OF_STOCK(400, "P001", "Out of Stock"),
// Cart
INVALID_QUANTITY(400, "CA001", "Invalid Quantity of CartProduct")
// More
;
private final String code;
private final String message;
private final int status;
ErrorCode(final int status, final String code, final String message) {
this.status = status;
this.code = code;
this.message = message;
}
}
Talend API를 통해 진행했습니다.
예외 처리를 구현하는 것은 어렵지 않지만 이를 도메인 별로 관리를 할지 아니면 예외의 종류 별로 관리를 해야할지 고민이 많았다. 그러던 중 최상위 Exception Class를 만들고 Error Code 또한 한 곳에서 관리하며 일관된 예외 처리 데이터를 던지도록 하는 좋은 글을 보게 되었다.
바로 프로젝트에 도입하여 이를 프로젝트의 사용자 인증 부분에도 녹여냈고 어떤 도메인이든 손쉽게 예외를 만들어 사용할 수 있다는 좋은 성과가 있었다.
하지만 서비스가 커지고 도메인이 더욱 많아진다면 계속해서 늘어나는 예외를 어떻게 관리할 것인지에 대한 고민도 필요해보인다.
[Spring Guide - Exception 전략] https://cheese10yun.github.io/spring-guide-exception/