Filter란 Web Application에서 관리되는 영역으로 Spring Boot Framework 에서 Client로 부터 요청/응답에 대해서 최초/최종 단계의 위치에 존재하며, 이를 통해서 요청/응답의 정보를 변경하거나, Spring에 의해서 데이터가 변환되기 전의 순수한 Client의 요청/응답 값을 확인 할 수 있다.
유일하게 ServletRequest, ServletResponse의 객체를 변환 할 수 있다.
Spring에서 주로 request / response 의 로깅 용도로 활용하거나, 인증과 관련된 로직들을 해당 필터에서 처리함으로써 서비스 비즈니스 로직과 분리 시킨다.

보통의 경우 로깅 용도로 많이 사용
만일 인증을 한다고 하면 다단계 인증이 아니면 보통 인터셉터에서 구현을 추천한다고 한다.
package com.example.filter.filter;
import jakarta.servlet.*;
import jakarta.servlet.annotation.WebFilter;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.util.ContentCachingRequestWrapper;
import org.springframework.web.util.ContentCachingResponseWrapper;
import java.io.IOException;
@Slf4j
//@Component
@WebFilter(urlPatterns = "/api/user/*")
public class GlobalFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
// 전처리
// 바로 읽는 것이 아니라 ByteArray 길이만 초기화가 됨
ContentCachingRequestWrapper httpServletRequest = new ContentCachingRequestWrapper ((HttpServletRequest) servletRequest);
ContentCachingResponseWrapper httpServletResponse = new ContentCachingResponseWrapper ((HttpServletResponse) servletResponse);
// 요청을 서블릿으로 전달
filterChain.doFilter(httpServletRequest, httpServletResponse);
// 후처리
String url = httpServletRequest.getRequestURI();
// req
String reqContent = new String(httpServletRequest.getContentAsByteArray());
log.info("request url : {}, requestBody : {}", url,reqContent);
String resContent = new String(httpServletResponse.getContentAsByteArray());
int httpStatus = httpServletResponse.getStatus();
// Response 복사하여 클라이언트에서 다시 사용할 수 있게
httpServletResponse.copyBodyToResponse();
log.info("response status : {} , responseBody : {}",httpStatus,resContent);
}
}
doFilter 함수 전에 미리 requset, response 한번 읽어버리면 에러가 발생한다. 따라서 내용을 확인할 때는 doFilter 이후에 확인한다.
Global filter 사용하기 위해선 @Component 사용
특정 url 컨트롤러에서 사용하기 위해선 @WebFilter 사용
package com.example.filter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;
@SpringBootApplication
@ServletComponentScan
public class FilterApplication {
public static void main(String[] args) {
SpringApplication.run(FilterApplication.class, args);
}
}
@ServletComponentScan
- @WebServlet, @WebFilter, @WebListener`와 같은 서블릿 관련 어노테이션이 붙은 클래스를 찾아서 자동으로 서블릿 컨테이너에 등록합니다
'Spring' 카테고리의 다른 글
| Interceptor (0) | 2025.04.15 |
|---|---|
| 서블릿 컨테이너와 Spring 컨텍스트 (0) | 2025.04.15 |
| Spring Boot Exception 처리 (0) | 2025.03.24 |
| Validation (0) | 2025.03.24 |
| Java Bean 규약 (0) | 2025.03.24 |