Spring-예외처리,오류페이지

Shaun·2022년 10월 26일
1

스프링

목록 보기
6/6
post-thumbnail

서블릿 예외처리

서블릿은 크게 두가지 방법으로 예외 처리를 한다

1. Exception
2. response.sendError(상태코드,메시지)

웹 애플리케이션에서 예외가 발생한경우 try-catch 문으로 예외 처리를 하면 아무 문제가 되지 않지만 그렇지 않다면 예외는 그부모 클래스로 타고타고 계속 올라갈 것이다.

WAS <-필터 <- 서블릿 <- 인터셉터 <- 컨트룰러(예외발생)

1.Exception

  • 서버 내부에서 처리할 수 없는 오류가 발생한것으로 간주
  • 톰켓이 제공하는 기본 오류화면을 보게됌

2.response.sedError

WAS(sendError 호출 기록 확인) <- 필터 <-서블릿 <-인터셉터 <- 컨트룰러

  • 당장 예외가 발생하는 것이 아니고 서블릿 컨테이너에게 오류가 발생했다는 점을 전달
  • WAS(서블릿컨테이너) 는 response으로 클라에게 응답을 주기전 sendErro가 호출 되었는지 확인함

오류페이지

  • 기본적으로 제공하는 오류페이지 말고 우리가 커스터마이징한 오류 페이지를 만들어보자

  • view페이지에는 적절한 html폼을 넣어준다

  • new ErrorPage(상태코드,경로) 로 이러한 오류가나면 경로로 가라는 페이지를 만들어준다.(이때 컨트룰러 URL로 감)

오류페이지-컨트룰러

  • new ErrorPage path -> 컨트룰러 호출 -> 뷰페이지

  • WAS(=서블릿컨테이너) 까지온 sendError확인 = new ErrorPage가 있나 확인

예외 발생시 오류 페이지 호출 flow

  • 오류 -> WAS 까지 전파
  • WAS에서 다시 url 호출 (내부에서 오류 페이지 재 호출)
  • 이떄 필터, 인터셉터가 한번 더 호출 됌

-> WAS에서 다시 재호출 할때 이러한 오류 정보를 request, attribute에 추가해서 넘겨줌!!

DispatcherType

  • 클라이언트에서 요청하는건지 WAS내부 재호출인지 구별하기위해 서블릿은 DispatcherType 를 제공 한다.
  • 클라가 처음 요청하면 dispatcherType = REQUEST
  • 재호출 = dispatcherType = ERROR

예외처리 - 필터

  • 예외처리 오류페이지 flow를 보면 내부 WAS에서 재호출을 할때 필터와 인터셉터가 한번더 호출이 되는 비효율적인 문제 발생!!

  • 서블릿이 제공하는 dispatcherType 호출

  • 필터등록

  • setDispatcherTypes - 두 가지를 모두 넣으면 클라이언트 요청 + 오류 페이지 요청에서도 필터가 호출 된다.(Default = DispacherType.REQUES)

예외처리 -인터셉터

  • 필터는 어떤 DispatcherType의 경우에 필터를 적용할지 선택 가능 했다.

  • 하지만 인터셉터는 스프링이 제공하는 기능 -> DispacherType 과 무관하게 항상 호출

  • 하지만 인터셉터 등록시 excludePathPatterns 로 뺄수 있음

결과

스프링 부트- 오류 페이지

  • 스프링 부트를 사용하면 ErrorPage 를 자동으로 등록한다. (/error 라는 경로로 기본 오류 페이지 설정)
  • Excpetion, response.sendError 호출 -> /error 호출

  • 4xx -> 400대 오류 처리 / 5xx - >500 대 오류 처리
  • BasicErrorController 라는 스프링 컨트룰러 자동 등록, 이 컨트룰러는 /error 을 디폴트 경로로 받음

  • 개발자는 BasicController 가 제공하는 룰과 우선순위에 따라서 등록하면 됌

BasicErrorController

  • BasicErrorController 는 이러한 기본정보를 model에 담아서 주기때문에 뷰단에서 사용가능

  • 하지만 이러한 내용은 클라이언트에게 혼란만 줄뿐 그래서 properties에서 이러한 정보를 model에 담을지 설정 할수 있다.
  • BasicErrorController 상속받아서 기능 추가가능
profile
호주쉐프에서 개발자까지..

0개의 댓글