-
예외처리를 할때 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