[Shopping Mall] Exception 처리

이정민·2023년 12월 7일
0

쇼핑몰 프로젝트

목록 보기
2/5
post-thumbnail
post-custom-banner

사용자로 인해 혹은 서버에서 에러가 발생했을 때, 예외의 내용이나 에러코드가 난잡하게 프론트로 전달된다면 매우 난감한 상황이 될 것입니다. 그래서 팀원과 상의하여 예외의 내용과 에러코드를 설정하고 이를 일관된 형태로 전달할 수 있도록 예외 class를 작성했습니다.

패키지 구조

주요 로직은 ErrorCode, BusinessException, ErrorResponse class 입니다.

Exception의 상속과 Error Code 관리

프로젝트에서 사용한 Exception class의 구조입니다.

  • 최상위 Exception을 상속 받는 RuntimeException을 상속 받아 Custom하여 사용합니다.

구현 코드의 주요 부분입니다.

BusinessException.java

  • RuntimeException class를 상속 받는 BusinessException class 대부분의 서비스 로직 예외는 이 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());
    }
}

EntityNotFoundException.java

  • 자주 발생하는 예외는 공통적으로 사용합니다.
public class EntityNotFoundException extends BusinessException{

    public EntityNotFoundException(String message) {
        super(message, ErrorCode.ENTITY_NOT_FOUND);
    }
}

JsonLoginAuthenticationException.java

  • 방식은 같으나 security filter에서 발생하는 예외인 AuthenticationException을 상속 받아 구현합니다.
@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());}
}

ErrorCode.java

  • 도메인 구분 없이 하나의 class에서 모든 에러코드 관리합니다.
@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/

전체 코드

https://github.com/SudalKing/Shopping_mall/tree/main

post-custom-banner

0개의 댓글