쌓고 쌓다

서블릿 필터 본문

프로그래밍/spring

서블릿 필터

승민아 2023. 9. 10. 14:30

서블릿 필터의 필요성

상품 관리 페이지가 있다고 하자. 이 페이지는 로그인 회원만 이용이 가능하다.

상품 관리와 관련된 컨트롤러의 모든 로직에 로그인 여부를 체크할 수 있지만 

모든 등록, 수정, 삭제, 조회 등등 공통으로 로그인 여부를 확인하는 로직이 필요하며, 추후에 로그인 로직과 관련된 수정 사항이 있을때

작성한 코드를 또 모두 수정해야한다.

 

위의 예처럼 애플리케이션 여러 로직에서 공통으로 필요한 부분을 "공통 관심사"라고 한다.

공통 관심사 문제는 서블릿 필터나 스프링 인터셉터를 사용하여 해결할 수 있다.

 

서블릿 필터 흐름

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러

 

WAS(Web Application Server)로 tomcat이 있다.

 

출처: 인프런 - 김영한

필터의 흐름에 있는 서블릿은 Dispatcher Servlet을 생각하자.

 

필터 제한

HTTP 요청 -> WAS -> 필터 -> 서블릿 -> 컨트롤러 //로그인 사용자
HTTP 요청 -> WAS -> 필터(적절하지 않은 요청이라 판단, 서블릿 호출X) //비 로그인 사용자

필터를 통해 요청을 판단하여 서블릿을 호출할지 말지를 결정할 수 있다.

 

필터 체인

HTTP 요청 -> WAS -> 필터1 -> 필터2 -> 필터3 -> 서블릿 -> 컨트롤러

필터를 중간에 추가하여 체인처럼 연결하여 사용할 수 있으며

예를 들어. 로그를 남기는 필터를 적용하고 로그인 여부를 체크하는 필터를 적용할 수 있다.

 

필터 인터페이스

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() {}
}

필터 인터페이스를 구현하고 등록하면. 서블릿 컨테이너가 필터를 싱글톤 객체로 관리한다.

  • init : 필터 초기화 메서드. 서블릿 컨테이너가 호출될때 호출된다.
  • doFilter : 요청이 올때마다 해당 메서드가 실행된다. 필터의 로직을 구현하자.
  • destory() : 필터 종료 메서드. 서블릿 컨테이너가 종료될때 호출된다.

 

필터를 이용해 간단히 모든 요청을 남기는 필터를 적용해 볼 수 있다.

https://non-stop.tistory.com/588

 

[스프링 부트] 모든 요청 로그 남기기 - 28

서블릿 필터로 모든 요청 로그를 남겨보자. 서블릿 필터에 대한 포스팅은 작성한 적 있다. https://non-stop.tistory.com/587 LogFilter - 로그 필터 package com.example.board.filter; import jakarta.servlet.*; import jakarta.se

non-stop.tistory.com

 

Comments