본문 바로가기
Spring

@RestControllerAdvice를 활용한 예외처리

by devLog by Ronnie's 2022. 9. 6.

예외를 처리할때 각각의 메서드에서 try-catch를 이용해서 처리하게 되면 코드의 라인이 길어지고 더불어 가독성도 떨어지게된다. 이렇게 되면 같이 협업하는 동료 입장에서도 업무 효율이 떨어지게 된다. 이럴때 사용할 수 있는 것이 공통 예외 핸들러를 통해서 관리하는 방법이다.

 

 

@RestControllerAdvice를 활용한 예외처리

 

@ControllerAdvice


@ControllerAdvice
@ControllerAdvice

먼저 @ControllerAdvice는 @ExceptionHandler, @ModelAttribute, @InitBinder 가 적용된 메서드들에 AOP를 적용하여 컨트롤러단에 적용하기 위해 고안된 어노테이션이다. 해당 어노테이션을 통해 모든 @Controller에 대해서 전역적으로 발생할 수 있는 예외를 잡아서 처리할 수 있다.

 

@RestControllerAdvice


@RestControllerAdvice
@RestControllerAdvice

@RestControllerAdvice는 @Controller와 @RestController와 같이 @ControllerAdvice + @ResponseBody를 합쳐놓은 어노테이션이다. @ControllerAdvice와 동일한 역할을 수행하고 추가적으로 @ResponseBody를 통해서 객체를 리턴할 수 있다. 즉, 예외만 처리하고 싶다면 @CoantrollerAdvice를 사용하면 되고 응답으로 객체를 리턴까지 해야된다면 @RestControllerAdvice를 사용하면 된다.

 

 

두 어노테이션 모두 적용 범위를 클래스 또는 패키지 단위로 제한이 가능하며 제한 시 해당 어노테이션의 옵션 basePackageClasses 를 통해 주면 된다.

@RestControllerAdvice
@RestControllerAdvice

@ControllerAdvice와 @RestControllerAdvice(@ControllerAdvice 포함하고 있으므로) 둘 다 @Component 어노테이션을 통해 따로 등록하지 않고 빈으로 등록 가능

 

 

@ExceptionHandler


해당 어노테이션을 메서드에 선언하고 특정 예외 클래스를 지정해주면 해당 예외가 발생했을 때 선언한 메서드가 실행되게 된다. @ControllerAdvice 또는 @RestControllerAdvice에 정의를 하지 않고 일반 @Controller단에서 사용하게 되면 해당 컨트롤러 단에서만 적용되게 된다.

 

추가적으로 Controller와 RestController에만 적용이 가능하며 @Sevice등의 빈에서는 적용되지 않으니 참고한다.

 

 

사용방법


사용방법은 간단하다. 해당 클래스에 @ResControllerAdvice 명시 후 예외 발생시 실행하고자 하는 메서드를 생성해주고 @ExceptionHandler를 명시해준다. value 값으로는 예외를 캐치하고자 하는 예외 클래스를 명시해준다.

위에서 말한것과 같이 @RestControllerAdvice를 사용하게 되면 객체를 반환할 수 있으니 아래 코드를 참고해서 중간에 필요 로직이 있다면 추가해주면 된다.

@ExceptionHandler
@ExceptionHandler

추가적으로 @Throws 어노테이션은 코틀린 함수가 예외를 던질 있다는 것을 의미하는 어노테이션이다. 자바에서는 throws IOException 같이 사용을 있지만 코틀린에서는 다음과 같은 코드를 제공하지 않기 때문에 @Throws 어노테이션을 통해 명시할 있다.

 

 

댓글