IT/development

[spring] @ControllerAdvice, @ExceptionHandler를 이용한 예외처리

알 수 없는 사용자 2022. 12. 4. 11:15
반응형

목차

    역시나 미래의 내가 보기 위해 기록한다.

    기존에는 try catch문으로 예외를 처리했었는데 예외처리가 필요한 여러군데 코드에 적용을 해야 되니.. 클린하지가 않아 구글링 해보니 스프링에서 제공하는 @ControllerAdvice, @ExceptionHandler이 있었다.

    왜 이걸 이제야 알게 되었는지.. 😥

    테스트 개발환경은 아래와 같다.

    @ExceptionHandler 😄

    @Controller나 @RestController가 선언된 Bean에서 발생한 예외만 처리할 수 있다.

    @Service나 @Repository와 같은 곳에서의 예외는 처리할 수 없음에 유의할 것

    사용방법은 간단하다.

    컨트롤러 내에 메소드를 만들고 @ExceptionHandler를 선언하고 value값으로 예외처리 클래스를 입력한다.

    그리고 parameter로 Exception을 받아서 예외처리를 할 구문을 적어준다.

    아래의 경우는 @ExceptionHandler이 선언된 컨트롤러 클래스에서 NullPointerExceptinon 발생 시 Exception의 메시지를 출력한다.

     

    @ExceptionHandler(value = {NullPointerException.class})
        public void nullPointerExceptionHandel(NullPointerException npe) {
            log.info("nullPointerException ::: {}", npe.getMessage());
        }

    이제 테스트 해보겠다.

    위에서 String타입의 변수 str을 null로 초기화 한 다음 length()를 체크 해서 npe를 고의로 발생 시켰고

    결과는 아래와 같다.

    컨트롤러에 만든 nullHandle()에서 작성한 로그가 정상적으로 출력되었다.

     

    이런식으로 컨트롤러 내에서 Npe뿐 아니라 여러 종류의 예외를 처리할 수 있게 되었다.

    하지만 이렇게 되면 당연히 아래처럼 코드가 클린 하지 않다. 

    지금은 예시니까 urlMapping 메소드가 1개뿐이지만 실무에선 당연히 여러가지 매핑 메소드가 있을건데

    이 메소드와 예외처리 메소드가 같이 있으면.. 전혀 깔끔하지 못하다.

    무슨 좋은 수가 없을까? 스프링에서 뭔가 만들어 놨을 것 같은데.. 🤔


    @ControllerAdvice 😎

    컨트롤러의 예외들을 전역적으로 처리할 수 있는 기능이다.

    아까 컨트롤러에 작성한 @ExceptionHandler가 선언된 메소드를 제거 후 컨트롤러의 예외처리를 전역으로 담당할 클래스를 하나 만들고 여기서 처리하면 된다.클래스레벨에 @ControllerAdvice 애노테이션을 붙이고 @ExceptionHander를 선언한 예외처리 메소드를 만든다.

    @ControllerAdvice를 따라가보면 아래처럼 컴포넌트 스캔으로 빈으로 만들고, 대상이 Type으로 되어있다.

    타입은 클래스, 인터페이스, enum이 있다.

    @ExceptionHandler는 대상이 메소드다.

    아래처럼 컨트롤러를 2개를 더 만들고 둘 다 npe를 고의로 발생 시키는 코드를 작성했다.


    브라우저 호출 결과

    HomeController

    BoardController

    UserController

     

    정상적으로 GlobalExceptionHandler 클래스에서 작성한 메소드로 들어와서 로그가 출력된다.브레이크 포인트를 걸어도 아래처럼 내가 만든 GlobalExceptionHandler 클래스의 nullPointerHandle 메소드에 걸린다.

     

    스프링에서 제공해주는 애노테이션을 활용해서 좀 더 효율적인 예외처리를 할 수 있을 듯 하다.

    반응형