▫️ 커스텀 예외
- 커스텀 예외를 필요할 때 구현 ex) NotFoundException, ValidationException
- 각각의 커스텀 예외는 ErrorCode 인터페이스를 들고있음
- 각 도메인별 에러메세지는 ErrorCode 를 구현한 enum 에서 관리
code
변수는 각 도메인별 앞글자 + 순서 넘버링
으로 구성
@Getter
public class ValidationException extends RuntimeException {
private final ErrorCode errorCode;
private ValidationException(ErrorCode errorCode) {
super(errorCode.getMessage());
}
}
@Getter
@RequiredArgsConstructor
public enum ProductError implements ErrorCode {
INVALID_PRICE_ATTRIBUTE("상품 가격 정보가 올바르지 않습니다.", "P_001"),
PRODUCT_NOT_FOUND("상품 정보를 찾을 수 없습니다.", "P_002"),
INVALID_PRODUCT_MAIN_IMAGE("상품 메인 사진 정보를 찾을 수 없습니다.", "P_003"),
INVALID_PRODUCT_DESCRIPTION("상품 설명 정보가 올바르지 않습니다.", "P_004"),
TOO_LONG_PRODUCT_DESCRIPTION("상품 설명 정보가 제약조건 이상의 길이입니다.", "P_005"),
INVALID_PROMOTION("상품 프로모션 정보가 올바르지 않습니다.", "P_006"),
MINUS_APPLIED_PROMOTION_PRICE("상품 프로모션 할인 적용가는 음수일 수 없습니다.", "P_007");
private final String message;
private final String code;
}
▫️ 예외 응답 스펙
public record ErrorResponse(
String message,
String code
) {
}
▫️ 예외 핸들링
- RestControllerAdvice
- 커스텀 예외별로 핸들러를 구성
- 개발할 때 탐지하지못하는 예외들도 핸들링해서 서버 내부 에러로 전달 ex) Exception
- @Valid 에서 발생하는 예외 핸들러 구성
▫️ 예외 로깅
- 로거는 @Slf4j 사용
- 예외를 핸들링 할 때는 반드시 로그 추가
- ex) log.error(”~~ 예외 : ”, e);
▫️ 예외 메세지 관리
- ErrorCode 를 구현한 enum 타입으로 도메인별로 관리