본문 바로가기
스프링 부트/A-ger

[A-ger] @ExceptionAdvice로 에러 처리

by illlilillil 2022. 3. 2.

API 호출하며 생기는 에러에 대한 공통 처리를 해주기 위해 ExceptionAadvice를 선언합니다.

 

  • @RestControllerAdvice : Exception 발생 시 JSON으로 반환받기 위하여 생성합니다.
  • @ExceptionHandler: Bean에서 발생하는 에러를 잡아 처리합니다.
/**
 * @Class : ExceptionAdvice
 * @Description : 도메인에 대한 공통 에러 처리
 **/
@RestControllerAdvice
@RequiredArgsConstructor
@Slf4j
public class ExceptionAdvice {
    private final ResponseService responseService;

    @ExceptionHandler(ExpiredAccessTokenException.class)
    public ResponseEntity<CommonResult> expiredAccessTokenException(ExpiredAccessTokenException e) {
        CommonResult commonResult = responseService.getFailResult(CommonResponse.EXPIREDACCESSTOKEN);
        log.error("[ERROR]:ExpiredAccessTokenException");
        return new ResponseEntity<>(commonResult, HttpStatus.UNAUTHORIZED);
    }
}

 

[ExpiredAccessTokenException.class]: 에러 클래스 선언

/**
 * @Class : ExpiredAccessTokenException
 * @Description : 액세스 토큰 만료 에러 처리
 **/
public class ExpiredAccessTokenException extends RuntimeException {
    public ExpiredAccessTokenException() {
        super();
    }
}

 

[throw new로 에러 던지기]

throw new ExpiredAccessTokenException();

 

[orElseThrow로 에러 던지기]

find 메소드를 통해 조회를 하게 되면 반환 타입이 Optional로 설정됩니다. 따라서 Optional을 orElseThrow로 처리한 후에 마음껏 객체를 쓰는 방법이 쉽고 편한 방법이 되겠습니다.

/**
 * @Method : findAccountByAccessToken
 * @Description : 액세스 토큰으로 계정 조회
 * @Parameter : [accessToken]
 * @Return : Account
 **/
public Account findAccountByAccessToken(String accessToken) {
    return accountRepository.findAccountByAccessToken(accessToken).orElseThrow(NotFoundException::new);
}

댓글