-
Spring Boot - FilterFramework & Library/Spring Boot 2021. 11. 28. 15:12
Filter의 정의
Filter란?
- 필터는 스프링의 독자적인 기능이 아닌 자바 서블릿에서 제공하는 기능이다.
- 스프링 프레임워크에서 필터를 통해 인증 등 다양한 작업을 수행할 수 있다.
Filter의 동작
- 위 사진은 스프링 프레임워크에서 요청에 대한 생명 주기를 나타낸 그림이다.
- 스프링 프레임워크는 들어온 요청이 DispatcherServlet에 의해 컨트롤러에 매핑된다.
- 필터는 요청이 DispatcherServlet에 의해 다루어지기 전, 후에 동작한다.
- 또한, 필터는 위 사진과 같이 필터 체인을 통해서 여러 필터가 연쇄적으로 동작하게 할 수 있다.
Filter의 용도
- 필터는 주로 요청에 대한 인증, 권한 체크 등을 하는 데 사용된다.
- 구체적으로, 들어온 요청이 DispatcherServlet에 전달되기 전에 헤더를 검사해 인증 토큰이 있는지 확인하는 용도로 사용될 수 있다.
Filter의 사용법
Filter의 생성
public class TestFilter01 implements Filter { }
- 필터 클래스는 위 코드와 같이 서블릿의 Filter 인터페이스를 구현하여 만들 수 있다.
public class TestFilter01 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("TestFilter01이 생성되었습니다."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("TestFilter01 필터 시작"); chain.doFilter(request, response); System.out.println("TestFilter01 필터 종료"); } @Override public void destroy() { System.out.println("TestFilter01이 소멸되었습니다."); } }
- Filter 인터페이스는 다음과 같은 3가지 메서드를 가지고 있다.
1. init() : 필터가 생성될 때 수행되는 메서드
2. doFilter() : 요청, 응답이 필터를 거칠 때 수행되는 메서드
3. destroy() : 필터가 소멸될 때 수행되는 메서드
Filter의 등록
@Configuration public class FilterConfig { public FilterRegistrationBean testFilter01Register() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(new TestFilter01()); return registrationBean; } }
- 필터 클래스를 실행하기 위해서는 해당 필터를 스프링 빈으로 등록해야 한다.
- FilterRegistrationBean을 이용해서 필터를 빈으로 등록할 수 있다.
- 위 코드와 같이 TestFilter01을 FilterRegistrationBean을 이용해 스프링의 필터로 등록하였다.
Filter의 실행
@ResponseBody @GetMapping("test") public String TestController() { System.out.println("Hello Filter"); return "Hello"; }
- 방금 만든 TestFilter01 필터의 동작 방식을 살펴보기 위해 임시 컨트롤러를 생성한다.
- 위에서 만든 컨트롤러의 주소로 요청을 보내면, 위 사진과 같은 로그가 출력되고 있음을 알 수 있다.
- 스프링이 시작되면서 init 메서드가 수행된 것을 볼 수 있고, 요청이 들어왔을 때, doFilter 메서드가 수행된 것을 볼 수 있다.
다중 Filter의 생성
public class TestFilter02 implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("TestFilter02이 생성되었습니다."); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("TestFilter02 필터 시작"); chain.doFilter(request, response); System.out.println("TestFilter02 필터 종료"); } @Override public void destroy() { System.out.println("TestFilter02이 소멸되었습니다."); } }
- 그렇다면, 두 개 이상의 필터가 있으면 어떤 식으로 동작이 되는지 보도록 하겠다.
- TestFilter01과 유사하게 TestFilter02 클래스를 만들어준다.
다중 Filter의 등록
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean testFilter01Register() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(new TestFilter01()); registrationBean.setOrder(1); return registrationBean; } @Bean public FilterRegistrationBean testFilter02Register() { FilterRegistrationBean registrationBean = new FilterRegistrationBean(new TestFilter02()); registrationBean.setOrder(2); return registrationBean; } }
- 위 코드를 통해 TestFilter02 클래스를 빈으로 등록해준다.
- 한 가지 추가된 점은 여러 개의 필터가 있을 때, setOrder() 메서드를 통해 필터의 동작 순서를 결정할 수 있다.
다중 Filter의 실행
- 컨트롤러의 주소로 요청을 보내면, 위 사진과 같은 로그가 출력되고 있음을 알 수 있다.
- TestFilter01 - TestFilter02 - Controller - TestFilter02 - TestFilter01 순으로 동작하는 것을 확인할 수 있다.
GitHub - qlsdud0604/spring-boot-basic: 스프링 부트의 기본적인 작동원리를 학습하기 위한 프로젝트
스프링 부트의 기본적인 작동원리를 학습하기 위한 프로젝트. Contribute to qlsdud0604/spring-boot-basic development by creating an account on GitHub.
github.com
728x90'Framework & Library > Spring Boot' 카테고리의 다른 글
Spring Boot - JPA (0) 2021.12.01 Spring Boot - Transaction(트랜잭션) (0) 2021.11.29 Spring Boot - AOP (0) 2021.09.23 Spring Boot - 사용자 입력 데이터 처리 (0) 2021.09.23 Spring Boot - IoC와 DI (0) 2021.09.23