ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Boot - Filter
    Framework & 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

    댓글

Designed by Tistory.