[Spring] Exception 해결 전략

kshired·2022년 8월 12일
1

Try Catch

  1. try catch를 최대한 지양.
  2. try catch로 에러를 삼키고 다음으로 진행하는 방식도 지양. 만약 사용할 것이면, 로그를 명확하게 제대로 남기자.
  3. try catch를 사용하게 된다면, 로그를 제대로 남기던가 더 구체적인 Exception을 throw하자.

Exception

  1. 미리 처리해서 피할 수 있는 부분은 처리를 먼저하자. ( try-catch 사용 지양. )

    • 그래도 try-catch를 사용해야한다면, 2와 같이 명확한 Exception을 throw해서 Advice가 처리하도록 하자.
  2. Exception이 발생가능한 부분은 명확하게 Exception Throw를 하자.

    1. Custom한 Exception 클래스 사용하기.
      1. Custom Exception을 통해 로그를 정확하고, 의미있게 남기자.
      2. Client에게 Exception의 클래스에 따라 더욱 명확하고 구분 가능한 Response를 주자.
      3. Global level로 최상단에서 Exception에 따라 처리하자. ( 2와 결국 내용은 같다. )
  3. 최상단에서 처리를 하게 될 때, 특정 Exception들은 RestControllerAdvice를 이용한 Handler로 처리

    • @ControllerAdvice 는 프로젝트 전역에서 발생하는 모든 예외를 잡아줌.
    • @ExceptionHandler 는 발생한 특정 예외를 잡아서 하나의 메소드에서 공통 처리 가능.

    따라서 둘을 같이 사용하면 모든 예외를 잡은 후에 Exception 종류별로 메소드를 공통 처리가 가능해진다.

    예시 코드.

    @Slf4j
    @RestControllerAdvice
    public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
    
        @ExceptionHandler(value = { ConstraintViolationException.class, DataIntegrityViolationException.class})
        protected ResponseEntity<ErrorResponse> handleDataException() {
            log.error("handleDataException throw Exception : {}", DUPLICATE_RESOURCE);
            return ErrorResponse.toResponseEntity(DUPLICATE_RESOURCE);
        }
    
        @ExceptionHandler(value = { CustomException.class })
        protected ResponseEntity<ErrorResponse> handleCustomException(CustomException e) {
            log.error("handleCustomException throw CustomException : {}", e.getErrorCode());
            return ErrorResponse.toResponseEntity(e.getErrorCode());
        }
    }
profile
글 쓰는 개발자

0개의 댓글