Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

[로그인] Servlet Filter - 요청 로그 본문

인프런/[인프런] 스프링 MVC 2

[로그인] Servlet Filter - 요청 로그

Seung__ 2021. 9. 26. 21:37

모든 요청을 로그로 남기는 필터를 개발해보자.

 

1. LogFilter


import lombok.extern.slf4j.Slf4j;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.UUID;

@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");

        HttpServletRequest httpRequest = (HttpServletRequest) request;
        String requestURI = httpRequest.getRequestURI();

        String uuid = UUID.randomUUID().toString();

        try{
            log.info("REQUEST [{}][{}]", uuid, requestURI);
            chain.doFilter(request, response); //다음필터 있으면 호출 없으면 Servlet 호출됨
        }catch (Exception e){
            throw e;
        }finally {
            log.info("RESPONSE [{}][{}]",uuid, requestURI);
        }

    }

    @Override
    public void destroy() {
        log.info("log filter destroy");
    }
}
  • 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 를 출력한다.
  • chain.doFilter(request, response);
    • 다음 필터가 있으면 필터를 호출하고, 필터가 없으면 서블릿을 호출한다.
    • 만약 이 로직을 호출하지 않으면 다음 단계로 진행되지 않는다. 여기서 끝남.

 

 

 

2. 필터 등록


import hello.login.web.filter.LogFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.servlet.Filter;

@Configuration
public class WebConfig {

    @Bean
    public FilterRegistrationBean logFilter(){
        FilterRegistrationBean<Filter> filterFilterRegistrationBean = new FilterRegistrationBean<>();
        filterFilterRegistrationBean.setFilter(new LogFilter());
        filterFilterRegistrationBean.setOrder(1);
        filterFilterRegistrationBean.addUrlPatterns("/*"); //모든 url 적용

        return filterFilterRegistrationBean;
    }
}
  • filter 등록을 위한 bean 설정 용 class인 WebConfig를 만들자.->@Configuration 적용
  • @Configuration : 해당 클래스가 Spring Container에 등록될 @Bean을 선언한다는 것을 가르킴.
  • SpringBoot를 사용하면 FilterRegistrationBean 을 사용해서 등록하면 됨.
  • setFilter(new LogFilter()) : 등록할 필터를 지정한다.
  • setOrder(1) : 필터는 체인으로 동작한다. 따라서 순서가 필요하다. 낮을 수록 먼저 동작한다.
  • addUrlPatterns("/*") : 필터를 적용할 URL 패턴을 지정한다. 한번에 여러 패턴을 지정할 수 있다.

 

 

 

3. 실행 결과


hello.login.web.filter.LogFilter: REQUEST [0a2249f2-cc70-4db4-98d1-492ccf5629dd][/items]
hello.login.web.filter.LogFilter: RESPONSE [0a2249f2-cc70-4db4-98d1-492ccf5629dd][/items]
  • 실무에서 HTTP 요청시 같은 요청의 로그에 모두 같은 식별자를 자동으로 남기는 방법
  • 즉, 한 요청이 들어와서 나갈 때 까지 자동으로 로그에 같은 식별자를 남기는 방법은 
  • logback mdc로 참고.

 

 

4. GitHub : 210926 Servlet Filter


 

GitHub - bsh6463/login

Contribute to bsh6463/login development by creating an account on GitHub.

github.com

 

Comments