본문 바로가기

Spring

@ExceptionHandler를 통한 예외처리

 

 

커스텀 예외들은 표준 자바 예외부분이 아닌 속성 정보 및 비즈니스 로직 정책에 의한 예외들을 핸들링 할 수 있는 유연성을 제공한다.

이러한 특징은 애플리케에션에  에러코드 같은 부가정보를 저장할 수 있고, Runtime상에서 사용자에게 발생한 에러를 예외 처리하거나 보여주기 위해 사용한다.

 

 

@ExceptionHandler

특정 핸들러 클래스 및 / 또는 핸들러 메소드에서 예외를 처리하기위한 어노테이션이다.

https://docs.spring.io/spring/docs/5.2.5.RELEASE/javadoc-api/

 

Spring Framework 5.2.5.RELEASE API

 

docs.spring.io

 

 

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.

 

 

 

최종결과

API 요청시 예외가 발생했을때 응답