티스토리 뷰

Spring을 처음 배울때 AOP 부분을 이해하기 힘들었다. 막 Spring이 본격적으로 쓰이던 시기라 설명도 다 직역으로 되어 있고 (영어를 잘 못함..) 머리도 썩 좋은 편이 아니라 어려웠던것 같다. 역시 정답은 계속 써보는것 밖에 없는것 같다. 하지만 Springboot이 나오고 이런 Spring의 기본 개념을 확실하게 모르더라도 기능들을 막강하게 제공을 해주다보니 Spring을 처음 접하는 사람도 진입장벽 없이 들어올 수 있게 만들어 놓은것 같다. 그중 하나가 오늘 다룰 내용인 @RestControllerAdvice 인것 같다. 이름에서부터 감이 올수도 있겠지만 이것은 @RestController와 @ControllerAdvice를 합쳐 놓은 것이다. 즉 Controller 단에서 쉽게 AOP를 사용할 수 있도록 만들어진 애너테이션이라고 보면 된다. 

 

그럼 Controller에서 AOP를 사용하는 일은 무엇이 있을까? 여러가지 일을 할수 있지만 가장 대표적인 것이 Exception을 처리하는 것이다. 이 @RestControllerAdvice를 이용해 아주 손쉽게 Exception 처리를 할 수 있다. 

 


@RestControllerAdvice를 사용하기 위해서는 다음과 같은 dependency가 필요하다. 

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

아마도 기본으로 끼고 시작하는 dependency라 별도로 추가할 일은 없을듯 하다. 즉 기본 제공 기능이란 얘기다.

 

그리고 Controller에서 Exception 을 한번 내보자. 

@RestController
public class RestControllerAdviceSample {

    @GetMapping("/sayHello")
    public String sayHello() {
        throw new IllegalArgumentException();
    }
}

사용자 정의 Exception을 만들기 귀찮아서 그냥 아무 Exception 이나 던졌다. 

 

그리고 브라우저에서 /sayHello 를 호출해 보면 

 

Whitelabel Error Page

별도의 Exception Page를 설정하지 않아 Whitelabel Error Page가 출력이 되고 500 에러인것을 확인할 수 있다. 

 

이렇게 IllegalArgumentException이 발생을 했을때 처리를 해주도록 해보자.

 

ExceptionAdvice.java

@RestControllerAdvice
public class ExceptionAdvice {

    @ExceptionHandler(IllegalArgumentException.class) 
    public String illegalArgumentExceptionAdvice(IllegalArgumentException e) { 
        return "IllegalArgumentException Occurred!!!!!!!!!!!!!";
    }
}

main 클래스 하위에 위와 같은 @RestControllerAdvice 클래스를 하나 만든다. 그리고 @ExceptionHandler로 IllegalArgumentException를 정의하고 이것이 들어왔을때 처리하는 방법에 대해서 기술하면 된다. 일반적으로 IllegalArgumentException대신 사용자 정의 Exception을 두고 사용하는 경우가 많다. 이렇게 클래스와 메소드를 추가하고 다시 기동하고 브라우저에서 /sayHello 를 호출해 보면 

 

   

위와 같이 Whitelabel Error Page가 나오지 않고 내가 의도한대로 Exception이 출력이 되는것을 확인할 수 있다. 위와 같이 설정을 하면 모든 @RestController에 대해 Exception을 처리하는것이고 특정 클래스만 처리를 하고 싶은 경우에는 

@RestControllerAdvice(annotations = RestControllerAdviceSample.class)
public class ExceptionAdvice {

이렇게 특정 클래스를 지정해 줄 수도 있다. 

 

또한 여러개의 Exception들에 대해 하나의 메소드에서 처리를 하고 싶은 경우에는 

@ExceptionHandler(value = {IllegalArgumentException.class, NoSuchElementException.class}) 
public String someExceptionAdvice(RuntimeException e) { 
    return "RuntimeException Occurred!!!!!!!!!!!!!";
}

이렇게 여러개의 Exception 유형을 하나의 메소드에서 처리해 줄 수 있다. 단 위와 같이 공통된 상위 Exception을 가져야 한다. 

 

끝!

댓글
최근에 올라온 글
최근에 달린 댓글
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31