[Spring] Filter

지인·2023년 6월 24일
0

Spring

목록 보기
5/20
post-custom-banner

🐰 Filter

Web 애플리케이션에서 관리되는 영역으로 Client로 부터 오는 요청과 응답에 대해 최초/최종 단계의 위치이며 이를 통해 요청과 응답의 정보를 변경하거나 부가적인 기능을 추가할 수 있다.

  • 요청에 대한 인증, 권한 체크 등을 하는데에 쓰인다.

  • 구체적으로 들어온 요청이 DispatcherServlet에 전달되기 전에 헤더를 검사해 인증 토큰이 있는지 없는지, 올바른지 올바르지 않은지 등을 검사할 수 있다.

  • 위 그림은 스프링 프레임워크에서 요청에 대한 라이프 사이클을 나타낸 그림이다.

  • Filter는 요청이 DispatcherServlet에 의해 다뤄지기 전, 후에 동작한다.


Filter 기본 구조

  • Filter는 한 개만 존재하는 것이 아니라 여러 개가 Chain 형식으로 묶여서 처리될 수 있다.

  • 자원이 받게 되는 요청 정보는 클라이언트와 자원 사이에 존재하는 필터에 의해 변경된 요청정보가 된다.

  • 클라이언트가 보게 되는 응답 정보는 클라이언트와 자원사이에 존재하는 필터에 의해 변경된 응답정보가 된다.


한 개의 Filter

클래스

  • 필터 클래스는 servlet의 Filter 인터페이스를 구현하여 만들 수 있다.
	public class FirstFilter implements Filter {}
  • 필터 인터페이스는 3가지 메소드를 갖고 있다.

    • init() : 필터가 생성될 때 수행되는 메소드
    • doFilter() : Request, Response가 필터를 거칠 때 수행되는 메소드
    • destroy() : 필터가 소멸될 때 수행되는 메소드
@Slf4j
public class FirstFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("FirstFilter가 생성 됩니다.");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("==========First 필터 시작!==========");
        filterChain.doFilter(servletRequest, servletResponse);
        log.info("==========First 필터 종료!==========");
    }

    @Override
    public void destroy() {
        log.info("FirstFilter가 사라집니다.");
    }
}

Bean 등록

  • 필터 클래스를 만들면 이 필터를 Spring Bean으로 등록해야 한다.
@Configuration
public class Config{

    @Bean
    public FilterRegistrationBean firstFilterRegister() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(new FirstFilter());
        return registrationBean;
    }
}
  • 필터를 빈으로 등록하기 위해 스프링 설정에 FilterRegistrationBean을 이용해 직접 만든 필터를 등록할 수 있다.

두 개 이상 Filter

클래스

@Slf4j
public class SecondFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("SecondFilter가 생성 됩니다.");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        log.info("==========Second 필터 시작!==========");
        filterChain.doFilter(servletRequest, servletResponse);
        log.info("==========Second 필터 종료!==========");
    }

    @Override
    public void destroy() {
        log.info("SecondFilter가 사라집니다.");
    }
}

Bean 등록

@Configuration
public class Config{

    @Bean
    public FilterRegistrationBean firstFilterRegister() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(new FirstFilter());
        registrationBean.setOrder(1);
        return registrationBean;
    }

    @Bean
    public FilterRegistrationBean secondFilterRegister() {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(new SecondFilter());
        registrationBean.setOrder(2);
        return registrationBean;
    }
}
  • 여러 개의 필터가 있을 때, 필터의 동작 순서를 FilterRegistrationBean의 setOrder() 메소드를 통해 결정할 수 있다.

참고

spring - 스프링에서의 필터 개념 및 예제

profile
열쩡
post-custom-banner

0개의 댓글