[SB] 16. Filter

최재원's avatar
May 08, 2025
[SB] 16. Filter
notion image
  1. 필터는 톰켓이 만들어주는 입구 경비아저씨, 톰켓 컨텍스트에 있기 때문에 DB에 접근 불가, WAS(톰켓)가 관리한다
  1. DB 커넥션은 스프링 컨텍스트에서 만들어 진다
  1. 디스패처 서블릿이 컨트롤러를 찾는 것은 아파트의 101동 102동 103동을 찾는 것과 같다
  1. 각 동마다 있는 경비원이 인터셉터
  1. 컨트롤러의 메서드는 각 동의 호수 번호이다 (1001호, 1002호)
  1. AOP는 각 호수(1001호, 1002호)에 상태에 따라 다르게 행동한다
  1. DB커넥션은 디스패처 서블릿에서 빠져나올때 끊긴다
  1. 필터는 이제 DB 접근을 하지 못한다
  • 필터는 에러를 던지지 못한다. 내가 다 에러 처리를 해야한다
  • AOP 는 리플렉션 때문에 서버가 느려진다
  • Filter 는 내가 귀찮다
  • 필터는 로그인 인증 처리를 하면 안된다.
  • 로그인 안 해도 웹사이트는 볼 수 있어야지

필터 사용법

기본 사용법

직접 서블릿의 필터 체인에 필터 등록

filter/LogFilter

package shop.mtcoding.blog._core.filter; import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import java.io.IOException; @WebFilter("/*") public class LogFilter implements Filter { @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println("동작-----------------"); HttpServletResponse res = (HttpServletResponse) servletResponse; res.getWriter().println("Hello World"); filterChain.doFilter(servletRequest, servletResponse); } }
  • @WebFilter → Java 서블릿에서 필터(Filter)를 정의하고 등록
  • filterChain.doFilter() → 다음 필터 실행

BlogApplication

package shop.mtcoding.blog; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.boot.web.servlet.ServletComponentScan; @ServletComponentScan // @SpringBootApplication public class BlogApplication { public static void main(String[] args) { SpringApplication.run(BlogApplication.class, args); } }
@ServletComponentScan → 서블릿 관련 컴포넌트들을 자동으로 스캔하고 등록

스프링이 관리하는 필터 사용법

스프링이 Filter 타입의 객체를 IOC 에 받으면 자동으로 서블릿의 필터 체인에 등록된다

filter/LogFilter

Filter를 상속 받는 커스텀 filter를 만든다
package shop.mtcoding.blog._core.filter; import jakarta.servlet.*; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import shop.mtcoding.blog.user.UserRepository; import java.io.IOException; @RequiredArgsConstructor public class LogFilter implements Filter { private final UserRepository userRepository; @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) servletRequest; String uri = req.getRequestURI(); String ip = req.getRemoteAddr(); String userAgent = req.getHeader("User-Agent"); System.out.printf("[로그] %s | IP: %s | UA: %s\n", uri, ip, userAgent); filterChain.doFilter(servletRequest, servletResponse); } }
  • private final UserRepository userRepository → 스프링 컨텍스트 안에서 new 하기 때문에 db connection 을 di 받을 수 있다

config/FilterConfig

package shop.mtcoding.blog._core.config; import lombok.RequiredArgsConstructor; import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import shop.mtcoding.blog._core.filter.LogFilter; import shop.mtcoding.blog.user.UserRepository; @RequiredArgsConstructor @Configuration public class FilterConfig { private final UserRepository userRepository; @Bean public FilterRegistrationBean<LogFilter> loggingFilter() { FilterRegistrationBean<LogFilter> registrationBean = new FilterRegistrationBean<>(); registrationBean.setFilter(new LogFilter(userRepository)); registrationBean.addUrlPatterns("/*"); // 모든 요청에 적용 registrationBean.setOrder(1); // 필터 순서 설정 return registrationBean; } }
  • @Configuration → 내부 @Bean 이 붙어있는 메서드의 반환된 객체를 IOC 에 등록함
  • @Bean → 이 메서드의 반환된 객체를 IOC 에 등록
  • new LogFilter(userRepository) → 스프링 컨텍스트 내부이기 때문에 db connection 에 접근할 수 있도록 주입 가능
  • FilterRegistrationBean → 이 객체는 IOC에 등록하면 자동으로 서블릿의 필터 체인에 등록 한다

톰켓 & 스프링 설정하는 법

notion image
톰켓 & 스프링 설정하는 방법
  1. *.xml 에 설정하면 됨
    1. notion image
      • 예전에 중간 언어인 xml 파일로 설정을 관리하였음
  1. application.properties 에 설정을 하면 됨
    1. notion image
      • 여기서 설정하면 자동으로 xml 파일을 수정함
  1. 스프링 코드에 @Configuration 으로 설정
    1. notion image
Share article

jjack1