사이드 프로젝트를 하면서, 그리고 최근 회사의 프로젝트를 진행하면서
로깅처리와 더불어 어떠한 인증에 관한 것을 처리할 때 항상 필터를 구현했다.
이 필터가 뭔가 했더니 내가 옛날에도 들었었던 지식이지만 그냥 넘어가는 경우였고,
하다못해 스프링 동작과정에 정리해도
필터와 인터셉터에 관한 내용은 빼먹고 업로드를 한 것같다.
스프링 mvc의 기본 흐름에 대한 조금 더 구체적인 그림을 가져왔다.
다른 플로우차트를 찾아보려고 했지만 없더라.
일단 서블릿 Request요청이 오게되면 바로 Filter
로 가게된다.
여기서 무조건 동작을 받아서 처리를 해주고 이 필터들이 쭉 이어진것이 바로 필터체인이다.
필터 내부의 설명에서 보는것과 같이 doFilter
이 메소드에서 필터링을 수행하기 때문에
필터를 하나하나 등록해주게 되면 스프링은 요청을 받을때 저 필터들을 쭉쭉 통과해 나간다.
그다음에 DispatcherServlet
으로 가게 되는 것이다.
서버를 실행시키면 Servlet
이 올라오는 동안 init이 실행될 것이고
그 후에 doFilter
가 수행될 것이다.
이 필터는 아까도 말했듯, DispatcherServlet
이전에 실행되기 때문에 뭔가를 걸러주거나, 요청내용을 변경, 그리고 말했던 로깅처리 등을 진행할 수도있다.
public interface filter {
public default void init(FilterConfig filterConfig) throws ServletException{}// - 필터 인스턴스 초기화
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException;// - 전/후 처리
public default void destroy() {}// - 필터 인스턴스 종료
}
이런식으로 세가지의 구성으로 되어있다.
doFilter
에 있는 ServletRequest
객체는 매개변수 이름, 값 속성 등을
포함하는 데이터를 제공해준다.
web.xml
에서 정리할 수도 있고, 나는 스프링 부트를 쓰기 때문에
javax.servlet.Filter
를 구현해 주었다.
인터셉터는 말 그대로 가로채기이다.
필터는 스프링 외적으로 존재해서 스프링과는 상관없는 자원에 동작한다.
인터셉터는 DispatcherServlet
이 컨트롤러를 호출하기 전,후에 가로채려고 하기 때문에
스프링 컨텍스트 내부에서 Controller
에 관한 요청, 응답에 대해 관여할 수 있다.
인터셉터는 여러 개를 사용할 수 있고 로그인 체크, 권한체크, 프로그램 실행시간 계산작업 로그확인 등의 처리가 가능하다.
동작과정을 보면 이해가 될 수 있다.
지금 내 사이드 프로젝트에서 로그인 세션 null체크 기능이 잡다하게 중복이 되어있다.
도대체 학원에선 왜 이렇게 해도 뭐라안했을까 싶은 그런 로직들..
이 개념을 좀 도입해서 로깅처리와 로그인 기능을 좀 더 단순하게 구성을 해야겠다.
조바심 느끼지말고 남하고 비교하지말고 어제의 나보다만 성장해있으면 되는것 같다.