서블릿 예외 처리 - 시작
스프링에서 예외처리를 하는 방법을 이해하려면, 먼저 서블릿 예외 처리를 알아야 이해를 할 수 있으므로, 서블릿 예외처치를 먼저 학습한다.
서블릿은 2가지 방식으로 예외처리를 지원한다.
- Exception
- response.sendError(Http 상태 코드, 오류 메시지) [여기서 response는 HttpServletResponse)
Exception
자바 직접 실행 vs 웹 애플리케이션
자바
main이라는 이름의 쓰레드가 실행된다.
실행 도중에 예외를 잡지 못하고 main메서드를 넘어 예외가 발생하면, 쓰레드가 종료된다.
웹 애플리케이션
각 사용자 요청별로 쓰레드가 할당된다.
애플리케이션에서 예외를 잡지 못하고, 서블릿 밖으로 예외 전달 시 아래와 같이 동작한다.
WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
Exception은 서버 내부에서 처리할 수 없는 오류로 간주하고 HTTP 상태코드 500 코드를 반환한다.
유효하지 않은 url요청 시 404 NotFound 오류를 볼 수 있다.
response.sendError(Http 상태 코드, 오류 메시지)
[여기서 response는 HttpServletResponse)
WAS(sendError 호출 기록 확인) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러
컨트롤러에서 서블릿 컨테이너에게 오류가 발생했다는 점을 전달한다. 상태 코드 및 오류 메시지를 함께 전달할 수 있다.
sendError() 호출 시 response내부에 오류가 발생했다는 상태를 저장한다.
서블릿 컨테이너는 고객 응답 전에 response내부에 sendError가 호출되었는지 확인하고, 호출되었으면 설정한 오류코드에 맞게 오류페이지를 보여준다.
서블릿 예외 처리 - 오류 화면 등록
서블릿 컨테이너가 제공하는 기본 오류화면은 사용자에 친화적이지 않으므로 서블릿이 제공하는 오류화면 기능을 사용한다.
과거에는 xml 파일로 등록했지만 지금은 스프링 부트를 통해 서블릿 컨테이너를 실행하므로 스프링 부트가 제공하는 기능으로 오류페이지를 등록한다.
1. Component 애노테이션으로 스프링 컨테이너에 등록한 후에, 서블릿에 등록하기 위해 상속받는다.
2. HTTP 상태코드와 RuntimeException이 발생했을 때 경로를 설정하고, 등록한다.
3. 컨트롤러로 View를 반환한다.
서블릿 예외 처리 - 오류 페이지 작동 원리
서블릿은 Exception이 발생해서 서블릿 밖으로 전달되거나 response.sendError()가 발생됐을 때 설정된 오류 페이지를 찾는다.
WAS는 등록한 오류 페이지에서 어디로 가야 할지 찾는다.
정리하자면
예외가 WAS에 전달되었을 때 WAS는 지정된 오류경로(등록한 경로)로 ex) [/error-page/404]을 다시 요청(서버내부에서)한다.
1. WAS(여기까지 전파) <- 필터 <- 서블릿 <- 인터셉터 <- 컨트롤러(예외발생)
2. WAS `/error-page/404` 다시 요청 -> 필터 -> 서블릿 -> 인터셉터 -> 컨트롤러(/error- page/404) -> View
마치 HTTP 요청을 하는 것처럼 동작한다. [서버 내부에서 자동으로]
오류 정보들을 보기 위해 로그를 추가했다.
RequestDispatcher에 상수로 정의되어 있는 정보와 같은 것으로 상수로 정의하고, 이를 활용하여 로그를 찍어서 에러 발생 시에 로그를 확인했다.
http://localhost:8080/error-404 접속 후 실행 결과
각 로그들에 대한 내용이다.
javax.servlet.error.exception : 예외
javax.servlet.error.exception_type : 예외 타입
javax.servlet.error.message : 오류 메시지
javax.servlet.error.request_uri : 클라이언트 요청
URI javax.servlet.error.servlet_name : 오류가 발생한 서블릿 이름
javax.servlet.error.status_code : HTTP 상태 코드
코드 링크
https://github.com/toychip/StudySpring/commit/0b98c44ebdac17b82d0a2299ce96de92cc45d97f
Feat: Spring-mvc2-exception 서블릿 예외처리 - 시작 · toychip/StudySpring@0b98c44
toychip committed Aug 12, 2023
github.com
https://github.com/toychip/StudySpring/commit/0c5303847cd64e4ddbca802934c04d1d0d74412c
Feat: Spring-mvc2-exception 서블릿 예외처리 - 오류 화면 제공 · toychip/StudySpring@0c53038
toychip committed Aug 12, 2023
github.com
김영한님 mvc2 - Exception 강의로 학습하였습니다.
공부한 내용을 상기시키기고 해당 내용을 몰랐을 때의 입장에서 쉽게 배울 수 있지 않을까 해서 작성한 글입니다. 잘못된 내용이 있을 경우 말씀해 주세요. 피드백 환영합니다.
'Spring > Spring Exception' 카테고리의 다른 글
Spring Exception 6. ExceptionResolver (HandlerExceptionResolver) (0) | 2023.08.17 |
---|---|
Spring Exception 5. 스프링 부트 Api 오류처리 (BasicErrorController) (0) | 2023.08.16 |
Spring Exception 4. Api 예외 처리 (Spring mvc VS RestfulApi) (0) | 2023.08.16 |
Spring Exception 3. 스프링 부트 오류페이지 View(BasicErrorController) (0) | 2023.08.15 |
Spring Exception 2. 서블릿2 (Filter와 Interceptor를 안 거치려면?) (0) | 2023.08.14 |