커스텀 예외들은 표준 자바 예외부분이 아닌 속성 정보 및 비즈니스 로직 정책에 의한 예외들을 핸들링 할 수 있는 유연성을 제공한다.
이러한 특징은 애플리케에션에 에러코드 같은 부가정보를 저장할 수 있고, Runtime상에서 사용자에게 발생한 에러를 예외 처리하거나 보여주기 위해 사용한다.
@ExceptionHandler
특정 핸들러 클래스 및 / 또는 핸들러 메소드에서 예외를 처리하기위한 어노테이션이다.
https://docs.spring.io/spring/docs/5.2.5.RELEASE/javadoc-api/
CustomExceptionHandler
@RestControllerAdvice
public class CustomExceptionHandler {
@ExceptionHandler(BaseException.class)
public ResponseEntity<?> handleApiException(BaseException exception) {
ErrorResponse response = ErrorResponse.builder()
.status(exception.getHttpStatus())
.message(exception.getMessage())
.build();
return ResponseEntity.status(exception.getHttpStatus()).body(response);
}
}
@RestControllerAdvice 는 REST controller에서 예외가 발생하면, @ExceptionHandler가 @ResponseBody 형태로 조언을 전달하듯이 예외처리한다.
@ExceptionHandler 에는 인자로 일반적인 예외 또는 보다 구체적인 예외를 선언한다. 어노테이션 인자에는 구체적인 예외를 선언하기 위한 BaseException 추상 클래스를 생성한다.
BaseException
public abstract class BaseException extends RuntimeException {
public abstract HttpStatus getHttpStatus();
public abstract String getMessage();
}
BaseException 클래스를 Unchecked Exception인 RuntimeException을 상속받아 추상 메서드들을 선언한다.
AccounNotFoundException
public class AccountNotFoundException extends BaseException {
@Override
public HttpStatus getHttpStatus() {
return HttpStatus.NOT_FOUND;
}
@Override
public String getMessage() {
return "일치하는 사용자 정보가 없습니다.";
}
}
사용자 정보를 찾을 수 없을 때, 예외를 throw할 AccounNotFoundException을 생성하고 BaseException 추상 클래스에서부터 상속받은 메소드들을 오버라이딩해서 return 값을 커스터마이징한다.
AccountService
@Transactional(readOnly = true)
public Account get(Long id) {
return accountRepository.findById(id)
.orElseThrow(AccountNotFoundException::new);
}
클라이언트에서 요청이들어와 id를 통해 찾으려는 계정이없으면 AccountNotFoundException를 리턴하면 CustomExceptionHandler 클래스의 @ExceptionHandler(BaseException.class) 에서 예외를 처리한다.
다시말해 AccountNotFoundException -> BaseException에 전달해 예외를 처리하는 방식이다.
ExceptionHandler argument value's description
Modifier and Type | Optional Element and Description |
Class<? extends Throwable>[] | value
Exceptions handled by the annotated method. |
최종결과
'Spring' 카테고리의 다른 글
Could not write JSON: Infinite recursion (0) | 2020.07.09 |
---|---|
스프링 빈 순환 참조 (The dependencies of some of the beans in the application context form a cycle) (0) | 2020.05.05 |
스프링 시큐리티 코어 (0) | 2020.05.04 |
[Lombok] @Builder와 @NoArgsConstructor 동시 사용시 주의사항 (0) | 2020.04.13 |