[1] 예외 처리 구조
(1) 예외 처리 절차
(2) 예외 처리시 필요한 도구 : jsp, controller , catcher
예외 원인 별 처리방법을 설정한 catcher
에러 발생시 보일수 있는 view 화면 (error.jsp)
Model m에 ex 예외사항을 담을수 있을때
모델을 사용하지 않고 예외를 가지고 올때
예외를 발생시킨 동작을 실행한 컨트롤러
(3) 예외 처리하는 종류
- try-catch 방법
- @ExceptionHandler 공통 메서드
- @ControllerAdvice 전역 예외 클래스 > @ExceptionHandler 공통 메서드
- 예외 종류별 뷰 설정 방법 SimpleMappingExceptionResolver
- 응답 상태 코드 별 뷰 설정 방법 error-page
(4) 예외 발생시키기
[2] 예외 처리 방법
(1) try-catch 예외 처리 방법
예외처리할 항목을 선택한뒤
surround with > try/catch block 선택한다
자동으로 try - catch 처리를 한다
try-catch 작성 전에는 상태코드가 500 서버 오류였는데
try-catch 작성 후에는 상태코드가 400 클라이언트 오류로 바뀐다
상태코드 400에러가 뜬 이유는 ex.jsp라는 파일을 찾을수 없기 때문에 뜬 오류이다.
jsp를 지정하지 않을경우 주소/ex와 동일한 jsp를 찾아서 적용하는데 파일이 없기 때문에 오류가 떴다
이제 예외가 발생했을때 보이게 하는 화면 뷰(jsp파일)를 지정하자
(2) @ExceptionHandler 공통 예외 처리
공통으로 사용되는 예외 메서드를 묶음으로 만드는 메서드이다.
처리할 예외 종류를 배열로 기재할수도 있다.
(3) @ControllerAdvice 전역 예외 처리 클래스
컨트롤러 클래스 파일이 여러개일 경우 각 클래스 마다 @ExceptionHandler를 만들면 비효율 적이기 때문에
전체 패키지에 적용이 가능한 @ControllerAdvice 전역 예외 클래스를 만들고
수정이 필요한 클래스는 별도로 지정하여 @ExceptionHanlder를 적용시킬수 있다.
(" 패키지명") 을 작성하지 않으면 전체 패키지에 적용되고 패키지명을 작성하면 해당 패키지에만 적용된다
모든 클래스에 예외가 발생했을때 처리하는 @ControllerAdvice 클래스에 만들면
/ex3 과 /ex4 가 예외처리가 가능하다
예외처리를 할때
@ControllerAdvice로 공통 예외 설정을 하고
별도로 컨트롤러에 다른 내용의 예외설정을 할경우에는 @ExceptionHandler를 새로 작성한다면 그 예외 설정이 제일 가까운 내용이기 때문에 적용된다
패키지 이름 "com.fastcampus.ch2" 을 넣는다면 패키지에만 적용이 되고
패지키 이름을 안넣는다면 모든 패키지에 적용되게 만든다
[3] view 설정 방법
(1) 예외 종류별 뷰 설정 방법
SimpleMappingExceptionResolver
web.xml 파일에서
예외발생시 예외 종류가 "MyException" 일때 error400.jsp 을 호출하도록 한다
statsCode 상태코드는 400으로 나오게하게끔 설정할수 있다.
뷰 error400.jsp 파일에서 isErrorPage ="false"로 수정한다
수정을 하는 이유는 컴파일시 예외가 발생시 상태코드를 500으로 하라고 설정되어있기 때문에 500이 나오나
상태코드 400은 클라이언트 오류이므로 500이 아닌 400으로 뜨기 위해서
isErrorPage ="false" 으로 바꿔야한다.
이렇게 설정하면
특정 예외에서 특정 뷰를 보이게 설정할수 있다.
(2) 응답 상태 코드 별 뷰 설정 방법
error-page
특정 상태코드일때 적용하는 뷰를 지정할수 있다.
예를 들어 400번, 500번 일경우 각각 /error400.jsp 와 /error500.jsp 뷰를 지정하려고 한다.
jsp파일은 webapp에 파일을 저장하고
web.xml 파일에서 400번 , 500번일때 해당하는 jsp로 뷰를 설정하는 코드를 집어 넣는다.
그럼 아래 처럼 지정한 jsp 뷰로 출력이 가능하다
[4] 예외 심화 버전
(1) 예외 내용을 뷰로 출력한다.
모델 객체에 예외 내용을 담아 error.jsp에 출력한다
배열로 예외항목을 가져와서 담을수도 있다
(2) @ResponseStatus 상태코드 변경
목적1 : 응답 메세지의 상태코드 변경
목적2 : 디폴트 상태코드가 아닌 상세코드를 제출하기 위해 사용자 정의 예외 클래스 앞에 사용한다
에러가 발생하였을때 error.jsp가 처리되어 상태코드 정상 200이 뜬다.
하지만 실제 에러가 처리된것은 아니기 때문에 상태코드는 500 로 나와야하기 때문에
이를 변경할 경우에 사용한다
(3) 예외 객체 사용 isErrorPage ="true"
Model이 아닌 exception 객체를 사용한다
error.jsp 에서 isErrorPage="true" 기재를 하면
컨트롤러에서 Modle 객체에 대해 사용하지 않아도 된다
(4) 사용자 정의 메서드
사용자 정의한 메서드 MyException 메서드를 선언하고
/ex3 에 MyException 예외 발생을 시켰을때
상태코드 오류 500이 뜬다
하지만 상태코드 400으로 변경을 하려고 한다면
@ResponseStatus(변경할 상태코드) 를 넣으면 상태코드가 수정된다
(5) url 찾을수 없을때 404 페이지 설정하기
[5] 예외 처리 메모리 관리
(1) try-catch - finally + Close()
close()를 호출하다가 예외가 발생할 수 있으므로, try-catch로 감싸야한다.
close()의 호출순서는 생성된 순서의 역순으로 처리한다.
finally 와 close를 사용하지 않을것이라면 try-catch-resources 구문으로 사용한다.
try() 에 해당하는 부분은 AutoCloseable 일때만 가능하다.
'🌈 백엔드 > 스프링 MVC' 카테고리의 다른 글
스프링_ WebDataBinder & 데이터변환 (0) | 2023.08.29 |
---|---|
스프링_DispatcherServlet (0) | 2023.08.29 |
스프링_세션과 서버 부담 (0) | 2023.08.28 |
스프링_Session 세션 (0) | 2023.08.25 |
스프링_Redirect VS Forward 요청 응답 과정 (0) | 2023.08.24 |