Spring

MVC / 예외 처리와 오류 페이지

Dear-J 2025. 4. 14. 20:00

서블릿 예외 처리

Exception(예외)

웹 애플리케이션은 사용자 요청별로 별도 쓰레드 할당, 서블릿 컨테이너 안에서 실행

톰캣 같은 WAS까지 예외 전달됨

>> tomcat이 기본으로 제공하는 오류 화면 보여줌

>> HTTP 상태 코드 500

>> Exception의 경우 서버 내부에서 처리할 수 없는 오류가 발생한 것으로 생각

 

response.sendError(HTTP 상태 코드, 오류 메시지)

오류가 발생했을 때, HttpServletResponse가 제공하는 sendError 메서드 사용 가능

>> 서블릿 컨테이너에게 오류 발생을 전달 가능

>> HTTP 상태 코드와 오류 메시지 추가 가능

 

sendError 흐름

response.sendError()를 호출하면 response 내부에는 오류 발생 상태를 저장

>> 서블릿 컨테이너는 고객에게 응답 전에 response에 sendError()가 호출됐는지 확인

>> 호출 됐으면 설정한 오류 코드에 맞춰 오류 페이지 보여줌

 

오류 페이지 작동 원리

오류 페이지 요청 흐름

예외가 발생해서 WAS까지 전파

>> WAS는 오류 페이지 경로를 찾아 내부에서 오류 페이지 호출

>> 오류 페이지 경로로 필터, 서블릿, 인터셉터, 컨트롤러가 모두 다시 호출됨

 

웹 브라우저(클라이언트)는 서버 내부에서 이런 흐름이 일어나는지 전혀 모름

>> 오직 서버 내부에서 오류 페이지를 찾기 위한 추가적인 호출

 

오류 정보 추가

WAS는 오류 페이지를 단순히 다시 요청하는 것이 아닌

>> 오류 정보를 request와 attribute에 추가해서 전달

>> 필요시 이렇게 전달된 오류 정보 사용 가능 

 

필터 예외 처리

이미 필터나 인터셉터에서 로그인 체크를 완료

>> 서버 내부에서 오류 페이지를 호출한다 해서 해당 필터나 인터셉터가 다시 호출 되는 것은 비효율적

>> 클라이언트로부터 발생한 정상 요청인지, 오류 페이지를 출력하기 위한 내부 요청인지 구분 필요

 

DispatcherType

REQUEST : 클라이언트 요청

ERROR : 오류 요청

FORWARD : MVC에서 배웠던 서블릿에서 다른 서블릿이나 JSP를 호출할 때

>> RequestDispatcher.forward(request, response);

INCLUDE : 서블릿에서 다른 서블릿이나 JSP의 결과를 포함할 때

>> RequestDispatcher.include(request, response);

ASYNC : 서블릿 비동기 호출

 

인터셉터 예외 처리

필터에 경우는 필터를 등록할 때 어떤 DispatcherType인 경우에 필터를 적용할 지 선택 가능

>> 인터셉터는 서블릿 기능이 아닌 스프링 기능, DispatcherType과 무관하게 항상 호출됨

 

대신 인터셉터는 요청 경로에 따라 추가하거나 제외하기 쉽기 때문에

>> 오류 페이지 경로를 excludePathPatterns를 사용해서 빼줌

 

스프링 부트 오류 페이지

ErrorPage 자동 등록, /error 경로로 기본 오류 페이지 설정

BasicErrorController 스프링 컨트롤러 자동 등록

>> ErrorPage에서 등록한 /error를 매핑해서 처리하는 컨트롤러

 

개발자는?

BasicErrorController는 기본적 로직이 모두 개발되어 있음

개발자는 오류 페이지 화면만 컨트롤러가 제공하는 룰과 우선순위에 따라 등록

>> 정적 HTML이면 정적 리소스

>> 뷰 템플릿을 사용해 동적 오류 화면 만들고 싶으면 뷰 템플릿 경로에 오류 페이지 파일 만들어 넣음

 

뷰 선택 우선순위

BasicErrorController의 처리 순서

해당 경로 위치에 HTTP 상태 코드 이름의 뷰 파일을 넣어두면 됨

 

BasicErrorController가 제공하는 기본 정보들

BasicErrorController는 위 정보들을 model에 담아 뷰에 전달

>> 뷰 템플릿은 전달된 정보들을 출력 가능

 

실무에서는 이 정보들을 노출하면 안됨!

>> 사용자에게는 이쁜 오류 화면과 고객이 이해할 수 있는 간단한 오류 메시지

>> 오류는 서버에 로그로 남겨서 로그로 확인

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 김영한, 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술

 

 

'Spring' 카테고리의 다른 글

MVC / 스프링 타입 컨버터  (0) 2025.04.16
MVC / API 예외 처리  (0) 2025.04.15
MVC / 로그인 처리 - 필터, 인터셉터  (0) 2025.04.13
MVC / 로그인 처리 - 쿠키, 세션  (0) 2025.04.12
MVC / Bean Validation  (0) 2025.04.11