스프링 필터

정병웅·2024년 7월 2일
0

Spring 강의

목록 보기
4/6

실무에서 개발을 진행하다가 클라이언트의 요청 로그를 Controller 호출 전에 찍는 코드를 보게 되었다. 인터셉터를 사용하였는데, 인터셉터에 대한 기본 지식이 없어서 제대로 코드를 이해하진 못했지만 때마침 인프런 강의에서 인터셉터와 필터 원리 및 구현 방법에 대해서 설명하여 잊지 않기 위해 기록해본다,,,!!
인터셉터는 추후에 정리해서 올릴예정,,,!!!

서블릿 필터

정의

서블릿이 지원하는 필터이다.

동작 순서

HTTP 요청 -> WAS -> 필터 -> 서블릿(스프링일 경우 디스패처 서블릿) -> 컨트롤러

필터의 인터페이스

public interface Filter {
     public default void init(FilterConfig filterConfig) throws ServletException
 {}
     public void doFilter(ServletRequest request, ServletResponse response,
             FilterChain chain) throws IOException, ServletException;
     public default void destroy() {}
}

=> 메서드

init() - 필터 초기화 담당, 서블릿 컨테이너가 생성될 때 호출
dofilter() -> 클라이언트의 요청 시 호출 되는 메서드, 보통 여기에서 구현
destroy() -> 필터 종료 메서드, 서블릿 컨테이너가 종료 될 때 호출

구현 예제

  • 상황 : 클라이언트의 요청이 인입 될 때, 로그를 남김.
@Slf4j
public class LogFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        log.info("log filter init");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        log.info("log filter  doFilter");

        // 1. HttpServletRequest 로 다운 캐스팅
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        // 2. 필터가 수행 할 로직
        String uuid = UUID.randomUUID().toString();
        String requestUri = httpRequest.getRequestURI();

        try {
            log.info("REQUEST [{}] [{}] ", uuid, requestUri);
            // 3. 필터가 수행 된 후에는 서블릿을 호출 할 수 있게 해야하기 때문에
            // dofilter 로 서블릿 호출
            chain.doFilter(request, response);
        } catch (Exception e) {
            throw e;
        }finally {
            log.info("RESPONSE [{}] [{}]", uuid, requestUri);
        }
    }

    @Override
    public void destroy() {
        log.info("log filter destroy");
    }
}

코드 설명

  1. 클라이언트의 요청이 오면 doFilter가 호출
  2. Http 요청으로만 받기 때문에 HttpServletRequest 다운 캐스팅
  3. 필터 수행 로직을 try-catch-finally에 구현
  4. chain.doFilter 에서 필터의 역할이 끝나고 다음으로 진행 하도록 체이닝으로 호출 한다.
    -> doFilter를 사용하지 않으면 다음 단계로 진행 하지 못하기 때문에 가장 중요!!

필터 등록

@Configuration
public class WebConfig implements WebMvcConfigurer {
    

 	@Bean
    public FilterRegistrationBean logFilter() {
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
        filterRegistrationBean.setFilter(new LogFilter());
        filterRegistrationBean.setOrder(1);
        filterRegistrationBean.addUrlPatterns("/*");

        return filterRegistrationBean;
    }

코드 설명

  1. WebMvcConfigurer 를 구현하는 config 클래스를 생성한다.
  2. FilterRegistrationBean 객체는 필터를 등록하는 역할을 하는 공장이라고 생각(?)
  3. setFilter 메서드로 위에서 구현한 필터 객체를 등록
  4. setOrder 메서드는 해당 필터의 실행 순서를 의미한다.
  5. addUrlPatterns("")는 필터가 적용 될 url 을 지정하면 된다. 여러 필터를 지정 가능하다.

출력 예시

profile
인생은 IT 노가다

0개의 댓글