티스토리 뷰
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 를 호출해 보면
별도의 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을 가져야 한다.
끝!
'Framework > Spring' 카테고리의 다른 글
Springboot Graceful Shutdown (since 2.3) (0) | 2021.04.28 |
---|---|
Springboot 프로젝트에서 mvnw, mvnw.cmd 는 무엇일까? (0) | 2021.04.27 |
Springboot + Redis 연동하는 예제 (3) - Cluster 설정하기 (0) | 2021.04.21 |
Springboot + Redis 연동하는 예제 (2) 세션 클러스터링 (0) | 2021.04.16 |
Springboot + Redis 연동하는 예제 (1) 기본 (1) | 2021.04.16 |