스프링/4. 스프링 MVC-2

55. 필터 구현

sdafdq 2023. 9. 9. 00:43

간단하게 요청에 대한 로그를 남기는 필터를 구현해 봤다.

@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 {
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        String uuid = UUID.randomUUID().toString();

        try{
            log.info("request = {}", httpRequest);
            log.info("uuid = {}", uuid);
            log.info("url = {}", httpRequest.getRequestURL());
            log.info("uri = {}", httpRequest.getRequestURI());

            chain.doFilter(request, response);
        } catch (Exception e){
            throw e;
        } finally {
            log.info("response = {}", httpResponse);
            log.info("uuid = {}", uuid);
            log.info("url = {}", httpResponse.getStatus());
        }
    }

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

필터를 구현해 줬다.

init(), destroy는 서블릿 컨테이너 시작할 때, 끝날 때 사용되는 로직이라 일단 넘어가고,

 

먼저 인터페이스로 ServletRequest 되어 있는걸 HttpServletRequest 기능을 사용할 수 있게 형변환 해준다. 

uuid는 로그에서 요청간의 구분을 위해 남겨놓은 것이다. 저렇게 response랑 같이 남겨 놓으면 짝을 추적할 수 있다.

 

try 안에 필터 로직을 적고,

catch 예외 처리 해 두고,

finaly는 저 chain.doFilter(request, response)는 

Http 요청 -> WAS -> 필터 1 -> 필터 2 -> .... -> 디스패처서블릿 -> 컨트롤러

이렇게 쭉 가는거기 때문에 꼭 chain.doFilter()를 해줘야 한다. 안그럼 그냥 딱 이 필터만 실행하고 끝난다.

 

마지막 필터 -> 디스패쳐 서블릿

이 흐름으로 가는거기 때문에 꼭 chain.doFilter()를 해줘야 한다.

 

finaly는 저 흐름을 다 거치고 나면 마침내 해줘야 할 것, 그러니까 마지막으로 해 줘야 할 것을 정의해 주는 곳 이기 때문에

결국 컨트롤러를 거친 response가 나오는 거기 때문에 response에 대한 log를 남기도록 했다.

 

참고로, 위에 보면 내가 구현 한 필터 뿐만 아니라 다른 컨트롤러나 도메인에서 확인 차 남겨뒀던 로그들을 확인 할 수 있다.

 

하지만 저게 클라이언트 별로 DB의 순서라던지 로직을 지나는 데 시간 차이가 있을 수 있기 때문에, 

클라이언트가 여러 명 이라면 사실 어느 클라이언트의 로그인지 구분하기 어려울 수 있다.

 

그럴 때, 한 요청이 남기는 로그들이라면 그 로그 모두 들에게 내가 특별히 무언가 더 추가로 덧붙이면서 로그를 남기도록 할 수 있다.

 

그게 위처럼 uuid라면 어떤 사용자의 로그들인지 구분할 수 있다.

 

logback mdc

https://dev-jwblog.tistory.com/126

 

[Java] MDC 를 사용한 로그(Log)추적하기

회사에서 소스를 분석하면서 로그를 기록하는 것에 MDC 라는 것을 사용하고 있었다. (새로운 회사에서 소스 분석하면서 모든게 새롭다... 기존에 내가 사용하던 것들은 어디에...) 간단하게 구글

dev-jwblog.tistory.com

대충 logback.xml로 덧붙일 로그에 대한 포맷, 정보들의 설정을 하고,

 

AOP를 통해서 하는 듯.

 

 

'스프링 > 4. 스프링 MVC-2' 카테고리의 다른 글

57. 스프링 인터셉터  (0) 2023.09.09
56. 인증 체크 필터 구현  (0) 2023.09.09
54. 필터, 인터셉터  (0) 2023.09.08
53. 세션 정보 확인과 타임아웃 설정  (0) 2023.09.07
52. 스프링 세션 업그레이드  (0) 2023.09.07