ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 예외처리
    개발/spring 2021. 12. 19. 22:49

    예외처리를 할때 try{}catch를 사용을 주로 합니다. 

    근데 이럴 경우 코드가 엄청 지저분해집니다...  그리고 예외가 여러개면 그나마 괜찮은데 단순 NPE라던가 하나의 에러에 대한 예외 처리를 하게 되면 굳이 .. 이걸 try , catch로 써야하나 이런 생각이 들수도 있습니다. 

     

    이럴 경우에 스프링에서는 @ExceptionHandler를 이용하여 애노테이션에 선언된 예외 및 하위 예외에 대해 특정 메서드가 처리할 수 있도록 할 수 있습니다. 

     

    좀 더 설명을 드리자면 특정 컨트롤러 내에서 에러를 감지할 경우 @ExceptionHasndler를 사용하는 메서드 내에서 오류에 대한 분기 처리를 할 수 있습니다.  

    예를 들면 아래와 같이 작성할 경우 해당 컨트롤러에서 작성된 에러의 경우 감지하여 handle에서 처리할 수 있습니다. 

    메서드에 사용된 Exception에 대해서는 인터페이스로 구현하여 현재 상황에 맞는 Exception을 설정할 수 있으며 이는 기타 여러 Exception 처리도 가능합니다. 

    cf) 예제에는 전체 Exception을 넣었지만 IOException , NullPointException 등을 넣을 수 있습니다. 

    @Controller
    public class TestController {
        
        @ExceptionHandler(value=RuntimeException.class)
        public ResponseEntity<String> handle(Exception ex) {
            
        }
    }

     

    이를 만약 사용중인 한 컨트롤러가 아닌 전체 컨트롤러로 확장을 하고 싶다면 @ControllerAdvice을 사용하면 가능합니다. 

    아래와 같이 구현을 할 경우 컨트롤러에 별다른 구현을 하지 않아도 Exception이 발생하면 각 Exception에 대한 핸들러가 동작합니다. 

    @ControllerAdvice
    class TestControllerAdvice {
    
        @ExceptionHandler(SQLException.class)
        public ResponseEntity<String> sqlExceptionHandle(){
    
        }
    
        @ExceptionHander(IOException.class)
        public ResponseEntity<String> ioExceptionHandle(){
            
        }
    
    }

     

    이 단점의 경우 컨틀롤러로 부터 시작하는 동작이기에 별도 서비스단이나 dao단에서만 예외로 동작하게 처리할 수는 없습니다. 

     

    @ControllerAdvice 와 동일한 역할을 하는 @RestControllerAdvice도 있습니다. 

    @RestControllerAdvice의 의미는 @ControllerAdvice + @ResponseBody의 의미 입니다. 

     

    '개발 > spring' 카테고리의 다른 글

    springboot JPA  (1) 2022.03.26

    댓글

Designed by Tistory.