spring boot에서 에러 페에지이 대해서 알아보자
프로젝트 진행시 에러페이지가 나올 수 있는 요구 사항은
적어도 5가지 이상있을 것 같다
1. 잘못된 요청에 대한 에러페이지
2. 로그인을 하지 않는 자의 요청에 대한 에러페이지
3. 권한을 뛰어넘는 요청에 대한 에러 페이지
4. 시스템의 에러페이지
5. 허용하지 않는 http 메서드에 대한 에러 페이지 (Get,Post 등등 또는 Http Method에 존재하지않는 단어)
아마 위의 상황에 대한 http 상태 코드는 4xx ~ 5xx 사이이다.
따라서 모든 경우의 상황에 대한 에러 페이지를 만들것인지,
특정 몇개만 만들어서 사용할지 정해야한다
하지만 스프링 부트에서는 이 걱정을 말끔히 해결해준다
스프링 부트의 마법을 보자
실제 ErrorMvcAutoConfiguration 이 bean을 등록하는 코드를 보자
생성자 쪽을 보면 리졸버 까지 넘기는것을 볼 수 있다.
우선 컨트롤러이니까 어떤 url에 맵핑되는지 보자
특별한값을 설정하지 않으면 /error 를 사용한다
다음은 BasicErrorController 이다
다음은 DefaultErrorViewResolver 이다, 에러 컨트롤러가 위임한 그 리졸버이다.
여기 코드 문맥을 보자
this.resolve에 현재 에러상태코드를 넘긴다 (여기선 500 이라치자)
그렇다면 error/500 이 있는지 확인하고 있다면 해당 ModelAndView 를 리턴하고
없으면 정적리소스로서 체크하는것다
(이떄문에 타임리프쪽의 에러페이지를 먼저 찾고 없으면 정적파일에서 찾는 우선순위가 정의된다)
(스프링은 참 대단한것 같다)
다시 돌아와서
그렇게 this.resolve 로 시작 한 코드는 다음과 같은 조건에 따라 결과가 두개이다
1. 준비된 http 상태 코드의 파일이 존재하면 not null
2. 존재하지않으면 null
존재하지않으면 노랑색 영역의 코드가 평가되는데
다음과 같은 상황에서 동작할 수 있다
만약 405 (Method Not Allowed) 에러 코드가 나왓는데 error/405.html 은 존재하지 않지만, error/4xx.html 이 존재한다면
4xx.html로 modelAndView 생성된다.
따라서 처음 요구사항을 다시 보면
1. 잘못된 요청에 대한 에러페이지
2. 로그인을 하지 않는 자의 요청에 대한 에러페이지
3. 권한을 뛰어넘는 요청에 대한 에러 페이지
4. 시스템의 에러페이지
5. 허용하지 않는 http 메서드에 대한 에러 페이지 (Get,Post 등등 또는 Http Method에 존재하지않는 단어)
4xx, 5xx 두개로 처리할 수있으니
4xx.html, 404.html, 500.html 이면 크게 부족하진 않는다 (요구사항에 따라 다르겠지만)