실습 코드 : https://github.com/castello/spring_basic/blob/main/ch2/error.jsp
error.jsp, ExceptionController를 만든다. ExceptionController는 예외를 일부러 발생시킨다.
com.fastcampus.ch2.ExceptionController.main(ExceptionController.java:10) 이렇게 예외가 발생했는데 처리를 안하면 톰캣이 500 error를 발생한다.
Try/catch Block을 이용해서 예외처리를 해준다.
예외처리를 하니 404 error로 바뀐다. 반환 타입이 void이기 때문에 view를 mapping된 ex.jsp로 찾는다.
반환 타입을 수정하고 error.jsp가 출력되도록 바꾼다.
메서드를 1개 더 만들게 되면 중복 코드가 생긴다.
@ExceptionHandler 어노테이션을 붙이고 어떤 예외를 처리할지(예외 처리할 종류) 적는다. -> Exception.class
위 코드를 Try/catch block이라 생각하면 된다.
다른 예외 NullPointerException가 발생하면 Try/catch block처럼 계속해서 추가할 수 있다.
view에 내용을 추가하기 위해서 Model 객체를 만들어서 전달한다. 이 때, addAttribute( "key", value ) 메서드를 사용한다.
예외 내용이 출력된다.
FileNotFoundException와 같이 예외 처리 메서드를 따로 만들지 않으면 어떻게 될까?
처리가 된다. Exception.class은 예외의 최고 조상이기 때문에 모든 예외 처리가 가능하다.
하나의 ExceptionHanlder로 2개 이상의 예외를 처리하고 싶을 때는 배열을 이용한다.
Exception.class를 주석처리해도 예외 처리된다.
예외 처리 메서드는 클래스 내에서만 사용할 수 있다. 따라서 @ControllerAdvice 어노테이션을 사용해서 모든 Controller에서 발생하는 예외를 처리하게 만들 수 있다.
예외 처리가 잘 된다. Controller안에는 예외 처리가 없고 이를 GlobalCather 클래스가 대신해서 처리한다.
예외 처리가 중복되면 가까운 곳에 있는 메서드로 처리한다. 공통으로 GlobalCatcher를 만들어 관리하고 예외적으로 처리하고 싶을 때 해당 클래스 안에서 따로 만들어 관리한다.
가까운 예외처리를 실행한다.
@ControllerAdvice에 패키지명을 적으면 지정된 패키지에서 발생한 예외만 처리하고, 적지 않으면 모든 패키지에 있는 예외를 처리한다.
패키지를 제대로 적지 않으니 오류가 발생한다. 꼭 눈으로 확인하자.
@ExceptionHandler에서 사용하는 Model과 main 메서드에서 사용하는 Model이 다르다. 만약 같은 Model이라면 main 메서드가 먼저 실행되므로 m.addAttribute("msg","message");에 담았던 내용이 console에 출력되야 한다. 하지만 다른 내용이 나오므로 둘은 다른 객체임을 알 수 있다.
'스프링의 정석 > Ch. 02 Spring MVC' 카테고리의 다른 글
30. 데이터의 변환과 검증(1) (0) | 2023.08.18 |
---|---|
29. DispatcherServlet 파헤치기 (0) | 2023.08.18 |
26. 세션(Session) - 실습(2) (0) | 2023.08.15 |
25. 세션(Session) - 실습(1) (0) | 2023.08.14 |
24. 세션(Session) - 이론 (0) | 2023.08.14 |