.png%3Ftable%3Dblock%26id%3D1deb195b-130e-8057-98d8-d7643869dce1%26cache%3Dv2&w=1920&q=75)
- 필터는 톰켓이 만들어주는 입구 경비아저씨, 톰켓 컨텍스트에 있기 때문에 DB에 접근 불가, WAS(톰켓)가 관리한다
- DB 커넥션은 스프링 컨텍스트에서 만들어 진다
- 디스패처 서블릿이 컨트롤러를 찾는 것은 아파트의 101동 102동 103동을 찾는 것과 같다
- 각 동마다 있는 경비원이 인터셉터다
- 컨트롤러의 메서드는 각 동의 호수 번호이다 (1001호, 1002호)
- AOP는 각 호수(1001호, 1002호)에 상태에 따라 다르게 행동한다
- DB커넥션은 디스패처 서블릿에서 빠져나올때 끊긴다
- 필터는 이제 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에 등록하면 자동으로 서블릿의 필터 체인에 등록 한다
톰켓 & 스프링 설정하는 법

톰켓 & 스프링 설정하는 방법
- *.xml 에 설정하면 됨
- 예전에 중간 언어인 xml 파일로 설정을 관리하였음

application.properties
에 설정을 하면 됨- 여기서 설정하면 자동으로 xml 파일을 수정함

- 스프링 코드에
@Configuration
으로 설정

Share article