0. 이 글을 쓰는 이유
스프링에서는 컨트롤러를 통해 서비스가 동작하는 도중 내가 에러 핸들링을 하지 않은 경우에 대해도 was가 죽지 않고 계속 떠있는 것을 볼 것이다.
우리가 일반적으로 자바로 프로그램을 수행해 보면 별도의 예외 처리가 없는 경우 해당 애플리케이션은 바로 죽게 되는데 스프링에서는 그렇지 않다. 어떻게 이게 가능한 것일까에 대해 궁금해져서 알아보고자 했다.
1. 사전 지식
1-1. Filter
스프링에는 Filter라는게 존재한다. 이게 뭐 하는 놈이냐 하면 WAS가 servlet container에게 request를 던져주면 그걸 적절히 필터링한 후 servletrequest와 servletresponse를 servlet에게 던져준다. 이후 response가 나올 시점에 다시 Filter에게 던져주고 여기서 response에 대한 필터링을 한 후 진행된다.
Filter는 Bean으로 등록되면 Filter Chain에 등록된다.
Filter Chain은 말 그대로 Filter가 연속됨을 의미한다. 하나의 Filter만이 아니라 여러 Filter들을 등록할 수 있다는 뜻이다.
2. ErrorPageFilter
그래서 스프링에는 ErrorPageFilter가 기본적으로 제공되고 등록된 상태로 시작한다.
3. 그래서 핸들링 못한 에러에 대해 500 코드는 어떻게 리턴한다고?
doFilter를 통해 필터링을 통해 request를 진행하다가 문제가 발생한다면(사용자가 핸들링 하지 못한 에러가 발생한다면) catch문을 통해 handleException을 호출하여 해당 에러를 핸들링하고 forwardToErrorPage를 호출하면서 기본적으로 500 status code를 반환하게 만들어 두었다.
4. 결론
뭔가 간단히 나올 것 같았지만 생각보다 알아내는게 쉽지는 않았다.
하지만 궁금증 해결했다.
역시 구현체와 공식 도큐먼트가 최고다.
'JAVA > spring' 카테고리의 다른 글
spring method 요청에 대해 핸들링하기 (0) | 2023.03.13 |
---|---|
spring boot 최소한으로 logging 설정하기(logback을 곁들인) (0) | 2023.03.12 |
Flyway Placeholder사용(application.yml / properties 파일 읽기) (0) | 2023.02.26 |
[QueryDSL] BooleanExpression말고 Predicate[]로 조건을 동적으로 처리하기 (0) | 2023.02.11 |
자바 ORM 표준 JPA 프로그래밍 - 기본편 끄적끄적 (1) (0) | 2023.01.15 |