역할
- 서비스 레이어에서 발생하는 커스텀 예외 정의
- ErrorCode와 메시지를 함께 전달하여 글로벌 예외 처리에 사용
1. 핵심 구조
public class ApiException extends RuntimeException {
private static final long serialVersionUID = 1L;
private final ErrorCode errorCode; // 내부 코드 + HTTP 상태 정보
private final String customMessage; // 사용자 정의 메시지
// 기본 메시지 사용
public ApiException(ErrorCode errorCode) {
super(errorCode.getDefaultMessage());
this.errorCode = errorCode;
this.customMessage = null;
}
// 커스텀 메시지 사용
public ApiException(ErrorCode errorCode, String customMessage) {
super(customMessage);
this.errorCode = errorCode;
this.customMessage = customMessage;
}
public ErrorCode getErrorCode() {
return errorCode;
}
// 실제 내려줄 메시지
public String getMessageToSend() {
return customMessage != null ? customMessage : errorCode.getDefaultMessage();
}
}
2. 설명
- RuntimeException 상속 → 체크 예외가 아니므로 try-catch 없이 throw 가능
- ErrorCode 연계 → HTTP 상태 코드, 내부 에러 코드, 기본 메시지 관리
- 커스텀 메시지 지원 → 프론트/사용자에게 보여줄 메시지 선택 가능
- 글로벌 예외 핸들러(
GlobalExceptionHandler)에서 catch 후 API 응답 처리
3. 포인트
getMessageToSend() → 커스텀 메시지 우선, 없으면 ErrorCode 기본 메시지
- ErrorCode 기반 → 표준화된 API 에러 응답 구현 가능
- RuntimeException → 서비스 레이어에서 자유롭게 throw 가능, 전역 처리 추천