본문 바로가기

🌈 백엔드/스프링 MVC

스프링_예외처리

반응형
SMALL

 

 

[1] 예외 처리 구조


(1) 예외 처리 절차

 

 

(2) 예외 처리시 필요한 도구 : jsp, controller , catcher

 

예외 원인 별 처리방법을 설정한 catcher

에러 발생시 보일수 있는 view 화면 (error.jsp) 

Model m에 ex 예외사항을 담을수 있을때

 

모델을 사용하지 않고 예외를 가지고 올때 

 

 

 

예외를 발생시킨 동작을 실행한 컨트롤러 

 

(3) 예외 처리하는 종류

  1. try-catch 방법 
  2. @ExceptionHandler 공통 메서드 
  3. @ControllerAdvice 전역 예외 클래스 > @ExceptionHandler 공통 메서드
  4. 예외 종류별 뷰 설정 방법 SimpleMappingExceptionResolver
  5. 응답 상태 코드 별 뷰 설정 방법 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 일때만 가능하다. 

반응형
LIST