서블릿은 크게 두가지 방법으로 예외 처리를 한다
1. Exception
2. response.sendError(상태코드,메시지)
웹 애플리케이션에서 예외가 발생한경우 try-catch 문으로 예외 처리를 하면 아무 문제가 되지 않지만 그렇지 않다면 예외는 그부모 클래스로 타고타고 계속 올라갈 것이다.
WAS <-필터 <- 서블릿 <- 인터셉터 <- 컨트룰러(예외발생)
WAS(sendError 호출 기록 확인) <- 필터 <-서블릿 <-인터셉터 <- 컨트룰러
view페이지에는 적절한 html폼을 넣어준다
new ErrorPage(상태코드,경로) 로 이러한 오류가나면 경로로 가라는 페이지를 만들어준다.(이때 컨트룰러 URL로 감)
new ErrorPage path -> 컨트룰러 호출 -> 뷰페이지
WAS(=서블릿컨테이너) 까지온 sendError확인 = new ErrorPage가 있나 확인
-> WAS에서 다시 재호출 할때 이러한 오류 정보를 request, attribute에 추가해서 넘겨줌!!
- 클라가 처음 요청하면 dispatcherType = REQUEST
- 재호출 = dispatcherType = ERROR
필터등록
setDispatcherTypes - 두 가지를 모두 넣으면 클라이언트 요청 + 오류 페이지 요청에서도 필터가 호출 된다.(Default = DispacherType.REQUES)
필터는 어떤 DispatcherType의 경우에 필터를 적용할지 선택 가능 했다.
하지만 인터셉터는 스프링이 제공하는 기능 -> DispacherType 과 무관하게 항상 호출
- Excpetion, response.sendError 호출 -> /error 호출
BasicErrorController 라는 스프링 컨트룰러 자동 등록, 이 컨트룰러는 /error 을 디폴트 경로로 받음
개발자는 BasicController 가 제공하는 룰과 우선순위에 따라서 등록하면 됌