반응형

서블릿 필터 - 요청 로그


필터가 정말 수문장 역할을 잘 하는지 확인하기 위해 가장 단순한 필터인, 모든 요청을 로그로 남기는 필터를 개발하고 적용해보자.


LogFilter - 로그 필터

  • public class LogFilter implements Filter {}
    • 필터를 사용하려면 필터 인터페이스를 구현해야 한다.
  • doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
    • HTTP 요청이 오면 doFilter가 호출된다.
    • ServletRequest request는 HTTP 요청이 아닌 경우까지 고려해서 만든 인터페이스이다.
      HTTP를 사용하면 HttpServletRequest httpRequest = (HttpServletRequest) request;와 같이 다운 캐스팅 하면 된다.
  • String uuid = UUID.randomUUID().toString();
    • HTTP 요청을 구분하기 위해 요청당 임의의 uuid를 생성해둔다.
  • log.info("REQUEST [{}][{}]", uuid, requestURI);
    • uuid와 requestURI를 출력한다.
  • chian.doFilter(request, response);
    • 이 부분이 가장 중요하다. 다음 필터가 있으면 필터를 호출하고, 필터가 없으면 서블릿을 호출한다.
      만약 이 로직을 호출하지 않으면 다음 단계로 진행되지 않는다.

 


WebConfig - 필터 설정

필터를 등록하는 방법은 여러가지가 있지만, 스프링 부트를 사용한다면 FilterRegistrationBean을 사용해서 등록하면 된다.

  • setFilter(new LogFIlter()) : 등록할 필터를 지정한다.
  • setOrder(1) : 필터는 체인으로 동작한다. 따라서 순서가 필요하다. 낮을 수록 먼저 동작한다.
  • addUrlPatterns("/*") : 필터를 적용할 URL 패턴을 지정한다. 한번에 여러 패턴을 지정할 수 있다.

 

참고
URL 패턴에 대한 룰은 필터도 서블릿과 동일하다. 자세한 내용은 서블릿 URL 패턴으로 검색해보자.


참고
@ServletComponentScan @WebFilter(filterName = "logFilter", urlPartters = "/*")로 필터 등록이 가능하지만 필터 순서 조절이 안된다. 따라서 FilterRegistrationBean을 사용하자.


실행 로그

필터를 등록할 때 urlPattern/*로 등록했기 때문에 모든 요청에 해당 필터가 적용된다.


참고
실무에서 HTTP 요청시 같은 요청의 로그에 모두 같은 식별자를 자동으로 남기는 방법은 logback mdc로 검색해보자.

반응형