예외를 처리할때 각각의 메서드에서 try-catch를 이용해서 처리하게 되면 코드의 라인이 길어지고 더불어 가독성도 떨어지게된다. 이렇게 되면 같이 협업하는 동료 입장에서도 업무 효율이 떨어지게 된다. 이럴때 사용할 수 있는 것이 공통 예외 핸들러를 통해서 관리하는 방법이다.
@RestControllerAdvice를 활용한 예외처리
@ControllerAdvice
먼저 @ControllerAdvice는 @ExceptionHandler, @ModelAttribute, @InitBinder 가 적용된 메서드들에 AOP를 적용하여 컨트롤러단에 적용하기 위해 고안된 어노테이션이다. 해당 어노테이션을 통해 모든 @Controller에 대해서 전역적으로 발생할 수 있는 예외를 잡아서 처리할 수 있다.
@RestControllerAdvice
@RestControllerAdvice는 @Controller와 @RestController와 같이 @ControllerAdvice + @ResponseBody를 합쳐놓은 어노테이션이다. @ControllerAdvice와 동일한 역할을 수행하고 추가적으로 @ResponseBody를 통해서 객체를 리턴할 수 있다. 즉, 예외만 처리하고 싶다면 @CoantrollerAdvice를 사용하면 되고 응답으로 객체를 리턴까지 해야된다면 @RestControllerAdvice를 사용하면 된다.
두 어노테이션 모두 적용 범위를 클래스 또는 패키지 단위로 제한이 가능하며 제한 시 해당 어노테이션의 옵션 basePackageClasses 를 통해 주면 된다.
@ControllerAdvice와 @RestControllerAdvice(@ControllerAdvice 포함하고 있으므로) 둘 다 @Component 어노테이션을 통해 따로 등록하지 않고 빈으로 등록 가능
@ExceptionHandler
해당 어노테이션을 메서드에 선언하고 특정 예외 클래스를 지정해주면 해당 예외가 발생했을 때 선언한 메서드가 실행되게 된다. @ControllerAdvice 또는 @RestControllerAdvice에 정의를 하지 않고 일반 @Controller단에서 사용하게 되면 해당 컨트롤러 단에서만 적용되게 된다.
추가적으로 Controller와 RestController에만 적용이 가능하며 @Sevice등의 빈에서는 적용되지 않으니 참고한다.
사용방법
사용방법은 간단하다. 해당 클래스에 @ResControllerAdvice 명시 후 예외 발생시 실행하고자 하는 메서드를 생성해주고 @ExceptionHandler를 명시해준다. value 값으로는 예외를 캐치하고자 하는 예외 클래스를 명시해준다.
위에서 말한것과 같이 @RestControllerAdvice를 사용하게 되면 객체를 반환할 수 있으니 아래 코드를 참고해서 중간에 필요 로직이 있다면 추가해주면 된다.
추가적으로 @Throws 어노테이션은 코틀린 함수가 예외를 던질 수 있다는 것을 의미하는 어노테이션이다. 자바에서는 throws IOException 과 같이 사용을 할 수 있지만 코틀린에서는 다음과 같은 코드를 제공하지 않기 때문에 @Throws 어노테이션을 통해 명시할 수 있다.
'Spring' 카테고리의 다른 글
스프링 트랜잭션 @Transactional(readOnly=true) (0) | 2022.12.09 |
---|---|
Spring - Event Publisher Listener (1) 정의 (0) | 2022.10.19 |
Spring - 서블릿과 디스패쳐서블릿 (0) | 2022.09.04 |
@NotFound 어노테이션 (0) | 2022.08.03 |
Spring Data JPA - Pageable을 이용한 Pagenation 처리 방법 (0) | 2022.07.17 |
댓글