일단 예외 처리에 대해서 이야기를 하기전에 MVC가 뭔지 다시 생각하고 가보자
MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다. 이러한 "관심사 분리" 는 더나은 업무의 분리와 향상된 관리를 제공합니다. MVC 에 기반을 둔 몇 가지 다른 디자인 패턴으로 MVVM (모델-뷰-뷰모델), MVP (모델-뷰-프리젠터), MVW (모델-뷰-왓에버) 가 있습니다.
그럼 MVC 패턴인데 스프링에서는 어떤 구조로 돌아 갈까?
일단 우리는 간단한 구성을 보고자 하는 거니까 이 그림만 보고 알고 가자!
컨트롤러단에서 처리하는 방법 Controller Level : @ExceptionHandler
전역 처리 방법 Global Level : @ControllerAdvice
메서드단위 처리 Method Level : try/catch 또는 throws
@ExceptionalHandler 어노테이션 사용하여 같은 컨트롤러의 요청 처리 메소드에 의해 발생하는 예외처리를 구체화 할 수 있다. 위 컨트롤러 내에서 발생하는 TestException에 대해 예외 발생시 ControllerExceptionHandler메소드에서 처리된다.
Controller메소드 내의 하위 서비스에서 예외가 발생하더라도 중간에 처리하지 않으면 Controller단까지 예외가 던져지므로 @ExceptionHandler가 예외를 처리하게 된다.
@RestController
public class TestController {
private final Logger logger = LoggerFactory.getLogger(UserController.class);
// 예외 핸들러
@ExceptionHandler(value = TestException.class)
public String controllerExceptionHandler(Exception e) {
logger.error(e.getMessage());
return "/error/404";
}
@GetMapping("hello1")
public String hello1() {
throw new TestException("hello1 에러 "); // 강제로 예외 발생
}
@GetMapping("hello2")
public String hello2() {
throw new TestException("hello2 에러 "); // 강제로 예외 발생
}
}
예외를 컨트롤러가 아닌 전체 어플리케이션에 적용할 수 있게 만들어 준다. 아래 어노테이션을 사용하면 된다.
@ControllerAdvice
*오늘 발표중 알게된 이야기
Filter에서의 예외
스프링의 처리과정중 예외가 발생하는 부분은 크게 두가지로 나눴을 때
Dispatcher Servlet내에서 발생하는 예외
Dispatcher Servlet 전의 서블릿(Filter) 에서 발생하는 예외가 존재한다.
Filter에서 예외가 발생한 경우 Web Application레벨에서 처리를 해주어야한다.