예외처리에 사용한 클래스
1. ApiExceptionAdvice
2. DomainException
3. ExceptionResponse
4. ExceptionCode
5. ExceptionType
ExceptionCode :
- 예외의 코드를 관리하는 enum 클래스.
ExceptionType :
- 각 예외 유형을 미리 정의하고 관리하는 enum 클래스.
- HttpStatus, ExceptionCode, 메시지, 로그 레벨(LogLevel)을 포함하여 예외 처리를 일관되게 유지.
ApiExceptionAdvice :
- @RestControllerAdvice를 사용하여 전역적으로 예외를 감지하고 처리하는 클래스.
- 발생한 예외를 감지하고, 적절한 HTTP 응답을 반환함.
DomainException :
- RuntimeException을 상속받아 도메인에서 발생하는 예외를 처리하는 커스텀 예외 클래스.
- ExceptionType을 기반으로 예외의 유형을 결정하며, 예외 발생 시 이를 ApiExceptionAdvice에서 감지하여 처리.
ExceptionResponse :
- 예외 응답(JSON)을 제공하기 위한 DTO 클래스.
[클래스 설명]
1. ExceptionType에 에러코드 정의

2. ExceptionCode에 에러코드와 함께 메시지 작성.

3. ExceptionResponse를 통해 Json으로 에러메시지 반환

4. DomainException.class

5. @RestControllerAdvice는 예외가 발생되면 실행

실행 과정
1. DomainException 호출
throw new DomainException(ExceptionType.ORDER_NOT_FOUND);
2. DomainException.class 의 생성자 실행
public DomainException(ExceptionType exceptionType) {
super(exceptionType.getMessage());
this.exceptionType = exceptionType;
this.data = null;
}
- 이때 exceptionType = ExceptionType.ORDER_NOT_FOUND(1번 과정)
- super(exceptionType.getMessage())를 실행하여 RunTimeException에 예외 메시지를 저장. -> ExceptionCode에 정의한 메시지
3. ApiExceptionAdvie의 @ExceptionHandler에서 예외를 감지
예외가 발생하면 전역 예외 처리기(@RestControllerAdvice가 달린 ApiExceptionHandler)에서 감지하고 처리
@ExceptionHandler(DomainException.class)
public ResponseEntity<ExceptionResponse> handleCoreException(DomainException e) {
switch (e.getExceptionType().getLogLevel()) {
case ERROR -> log.error("domainException : {}", e.getMessage(), e);
case WARN -> log.warn("domainException : {}", e.getMessage(), e);
default -> log.info("domainException : {}", e.getMessage(), e);
}
return ResponseEntity.status(e.getExceptionType().getStatus())
.body(ExceptionResponse.from(e.getExceptionType(), e.getData()));
}
4. ExceptionResponse 객체 생성
위에 3번코드에서
ExceptionResponse.from(e.getExceptionType(), e.getData())
가 실행
5. ExceptionResponse 객체가 생성되고 JSON으로 응답해줌.
[JSON] 응답 예시
{
"exceptionCode": "P01",
"message": "해당 주문을 찾을 수 없습니다.",
"data": null
}
사용하는 방법
1. ExceptionCode에 코드 생성
2. ExceptionType에 생성한 코드와 함께 message 작성
3. 예외가 발생하는 곳에 DomainException(ORDER_NOT_FOUND)와 같이 예외 선언
