TIL Day52 Spring MVC에서 예외처리

Colleen·2023년 5월 9일
0
post-thumbnail
post-custom-banner

일단 예외 처리에 대해서 이야기를 하기전에 MVC가 뭔지 다시 생각하고 가보자

MVC 란?

MVC (모델-뷰-컨트롤러) 는 사용자 인터페이스, 데이터 및 논리 제어를 구현하는데 널리 사용되는 소프트웨어 디자인 패턴입니다. 소프트웨어의 비즈니스 로직과 화면을 구분하는데 중점을 두고 있습니다. 이러한 "관심사 분리" 는 더나은 업무의 분리와 향상된 관리를 제공합니다. MVC 에 기반을 둔 몇 가지 다른 디자인 패턴으로 MVVM (모델-뷰-뷰모델), MVP (모델-뷰-프리젠터), MVW (모델-뷰-왓에버) 가 있습니다.

그럼 MVC 패턴인데 스프링에서는 어떤 구조로 돌아 갈까?

스프링 MVC 수행흐름

일단 우리는 간단한 구성을 보고자 하는 거니까 이 그림만 보고 알고 가자!

Spring에서의 예외처리 방법

컨트롤러단에서 처리하는 방법 Controller Level : @ExceptionHandler
전역 처리 방법 Global Level : @ControllerAdvice
메서드단위 처리 Method Level : try/catch 또는 throws

Controller 레벨에서의 예외처리 (@ExceptionHandler)

@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)

예외를 컨트롤러가 아닌 전체 어플리케이션에 적용할 수 있게 만들어 준다. 아래 어노테이션을 사용하면 된다.
@ControllerAdvice

  • 모든 Controller에서 발생하는 예외를 처리할 수 있게 해준다.
  • DispatcherServlet에서 발생하는 예외를 전역적으로 처리해준다.
    *Controller 의 @ExceptionHandler와 Controlleradvice의 @ExceptionHandler가 겹치는경우, @ExceptionHandler가 우선적으로 처리된다.

*오늘 발표중 알게된 이야기
Filter에서의 예외
스프링의 처리과정중 예외가 발생하는 부분은 크게 두가지로 나눴을 때
Dispatcher Servlet내에서 발생하는 예외
Dispatcher Servlet 전의 서블릿(Filter) 에서 발생하는 예외가 존재한다.
Filter에서 예외가 발생한 경우 Web Application레벨에서 처리를 해주어야한다.

profile
이상한 나라의 개발하는 예대생
post-custom-banner

0개의 댓글