“예외를 어떻게 처리해야 효율적일까”에 대한 고민을 했습니다.

고려 사항은 다음과 같습니다.

  1. 어떤 예외가 발생하였는지 쉽게 알아볼 수 있을 것
  2. 너무 많은 Custom예외 클래스를 생성하여 관리가 복잡하지 않을 것
  3. 추가적으로 작성하는 예외에 대해 확장이 용이할 것
  4. 예외 처리를 전역적으로 관리할 수 있으면 좋겠다.
  5. HTTP 상태 코드 별로 예외를 분류하여 클라이언트에게 알릴 수 있으면 좋겠다.

위 5가지를 생각하였습니다.

이번 프로젝트에서 DDD(Domain Driven Design)을 적용하기로 하였기 때문에, 도메인 로직에 대한 예외 처리를 잘 해놓으면 좋겠다고 생각하였습니다.

따라서 도메인 로직을 수행하며 발생할 수 있는 예외 상황들을 Custom 예외를 작성하고 싶은 마음이 컸습니다.

하지만 모든 Custom 예외를 별개의 클래스로 만들면 어떤 예외가 발생하였는지 쉽게 알아볼 수 있지만, 관리하기가 힘들겠다고 생각했습니다.

그래서 하나의 BusinessException 클래스를 다음과 같이 생성했습니다.

@Getter
public class BusinessException extends RuntimeException {

    private final String invalidValue;
    private final String fieldName;
    private final HttpStatus httpStatus;
    private final String message;

    public BusinessException(Object invalidValue, String fieldName, ErrorCode errorCode) {
        super(errorCode.getMessage());
        this.invalidValue = invalidValue != null ? invalidValue.toString() : null;
        this.fieldName = fieldName;
        this.httpStatus = errorCode.getHttpStatus();
        this.message = errorCode.getMessage();
    }
}

멤버 변수로 예외가 발생한 필드명, 필드 값, 상태 코드, 예외 메시지를 가지도록 하였습니다.