Framework & Library/Spring Boot

Spring Boot - Filter

임빈영 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