1. 필터란,
2. 필터는 그럼 언제 사용하는가?
3. 필터는 어떻게 실행되는가?
필터란,
이름의 의미만 보면, '요청에 대해서 거름망 같은 역할 수행하나?' 하는 생각을 할 수 있다.
실제로 로그인 여부를 확인한다거나, 들어온 요청에 대해서 character encoding 등의 일을 한다.
하지만 그 외에 인터셉터와 같이 컨트롤러로 가기 전, 하고 싶은 작업들을 행할 수 있다.
클라이언트가 요청을 하면,
WAS -> Filter -> Servlet -> Interceptor -> Controller 의 순으로 거치게 되는데
필터가 서블릿쪽 기술이고, 인터셉터는 스프링쪽 기술이어서
서블릿 필터, 스프링 인터셉터로 불리기도 한다.
필터는 그럼 언제 사용하는가?
필터와 인터셉터는 공통관심사를 처리할 때 사용한다.
로그인 되었는지 확인을 한다거나, 모든 요청 로그를 남기기, 요청 응답시간 계산하기 등에 사용될 수 있다.
(스프링 시큐리티도 필터를 이용하여 만들어졌다.)
AOP와 하는 일은 비슷하지만,
필터와 인터셉터는 ServletRequest와 ServletResponse를 제공해주기 때문에
웹과 관련된 공통 관심사를 처리할 때, 사용하면 좋다.
필터는 어떻게 실행되는가?
먼저 간단히 설명하자면, 필터는 여러 개가 존재할 수 있고, 순서를 가지고 순차적으로 실행된다.
마지막 필터는 서블릿을 실행시켜준다.
시작점은 StandardWrapperValve 객체에서 찾아볼 수 있는데,
filter는 chain형식으로 이루어져있다.
filter1 -> filter2 -> filter3 -> ... -> filter10과 같이 여러 filter들이 chain처럼 연결되어 있고, 순서대로 실행이 된다.
filterChain.doFilter(...)로 시작을 하며,
내부적으로는 internalDoFilter메소드에서 위의 filters배열을 인덱스를 가지고 doFilter메소드를 실행한다.
다음은 모든 요청의 시작과 끝에 log를 남기는 필터의 예다.
doFilter메소드가 실행되면 해당 필터의 메소드가 실행되고, 해당 필터에서 하고자 했던 로직인 진행된다.
여기서 제일 중요한 것은 chain.doFilter(request, response)이다.
이 메소드는 아까 맨처음의 chainFilter.doFilter와 같으며, 다음 filter를 실행시켜준다.
위에서 말했듯이 마지막 필터가 서블릿을 실행시켜주기 때문에, 다음 필터가 실행되지 않으면,
요청이 서블릿에 도달하지 못하여 컨트롤러에서 로직을 처리할 수가 없게되므로, 빼먹지 않도록 주의해야 한다.
참고) 인프런 강의 - 스프링 MVC 2편 - 백엔드 웹 개발 활용 기술
'TIL' 카테고리의 다른 글
[Git] git remote, 원격 저장소 확인, 추가, 수정, 삭제 (0) | 2021.10.20 |
---|---|
SQL 쿼리 실행 원리 (0) | 2021.09.05 |
[Java] 동시성, 스레드 조심해야할 사항1 (0) | 2021.08.07 |
[Git] Fork, Pull Request, Clone, Push (0) | 2021.08.01 |
[Git] fork, pull request, rebase (0) | 2021.07.26 |