본문 바로가기
Spring

Spring - @ExceptionHandler & @ControllerAdvice & @RestControllerAdvice

by devLog by Ronnie's 2022. 3. 21.

들어가며


개발에 있어서 예외 처리는 아주 중요한 작업이다. 예외처리를 해주지 않는다고 해서 잘 돌아가는 로직이 안 돌아가는 것은 아니지만 유지 보수 측면에서 보았을때 더 안정적이고 효율을 높이기 위해서는 예외처리 작업이 아주 중요하다. 예외를 처리하는 방법은 일반적으로 메서드 내에서 예외 상황을 try-catch로 잡아서 처리하는 방법이 있지만 이렇게 처리를 하게 되면 한두개를 처리할때는 상관이 없지만 서비스의 규모가 커짐에 따라 협업함에 있어서 코드는 복잡해지고 유지보수성이 떨어지게 된다. 하여 비즈니스  로직에 집중하기 어려워지고 이러한 비즈니스 로직보다 예외처리 관련 코드가 더 많아지는 경우도 생기게 된다.

 

이러한 문제를 개선해줄수 있는 @ExceptionHandler & @ControllerAdvice & @RestControllerAdvice 에 대하여 정리한다.

 

@ExceptionHandler


해당 어노테이션은 @Controller, @RestController 적용된 Bean 내에서 발생하는 예외를 잡아서 하나의 메서드에서 예외처리를 해주는 기능을 제공한다.

 

아래 예제를 보면 @ExceptionHandler 내에 캐치하고 싶은 예외클래스를 적어주면 적용이 가능하며,

@ExceptionHandler({ Exception1.class, Exception2.class}) 이렇게 여러개도 가능하다.

TestRestController 내의 해당하는 빈에서 NPE가 발생하게 되면 nullex 메서드가 실행되게 된다.

@RestController
public class TestRestController {
	
    ... 
    
    ...
    
    @ExceptionHandler(NullPointerException.class)
    public Object nullex(Exception e) {
    	System.err.println(e.getClass()); 
        return "Service"; 
    } 
}

 

@ExceptionHandler 사용시 참고사항


  • @Controller, @RestController 에만 적용이 가능 (service, repository 등의 어노테이션에서는 적용 x)
  • @ExceptionHandler 등록한 컨트롤러 내에서만 사용이 가능하다. -> 다른 컨트롤러에서 Exception 발생하더라도 적용 x (뒤에서 알아볼 @ControllerAdvice 통해 전역에서 발생하는 Exception 관리 가능)

 

@ControllerAdvice & @RestControllerAdvice


앞서 봤던 전역처리를 도와주는 @ControllerAdvice 어노테이션이다. @RestControllerAdvice 마찬가지로 전역에 적용 된다. 둘의 차이점은 @RestControllerAdvice는 @ControllerAdvice와 @ResponseBody를 합쳐놓은 어노테이션으로 @ControllerAdvice와 동일한 역할을 수행하면서 추가적으로 @ResponseBody를 통해 객체를 리턴할 수 있다. 

 

이 말은 즉, 단순히 예외처리만 할 것이면 @ControllerAdvice를 사용하면 되고 응답이 필요한 상황이면 @RestControllerAdvice를 사용하면 된다. 두개의 어노테이션 모두 basePackageClasses 옵션을 통해 적용 범위를 클래스로 제한하거나 basePackages 옵션을 통해 패키지 단위로 제한이 가능하다. (아무것도 안쓰면 전역에 적용)

 

 

 

댓글