내일배움캠프 27일차 TIL : Spring - Filter

김원기·2024년 5월 29일

TIL

목록 보기
31/42
post-thumbnail

내일배움캠프 27일차 TIL : Spring - Filter

Spring 하면서 Filter와 Spring Security부분이 조금 난해한데 2-3일 정도 더 공부하면서 내용을 정리할 계획이고,

오늘은 Filter에 관한 정리를 진행할 예정이다.

Filter

Spring Filter하면 가장 많이 보이는 그림이다.
물론 Spring MVC 요청 라이프사이클을 볼 때 역시 가장 많이 보이는 그림이기도 하다.

Spring에서 공통 작업을 처리하는 기능을 제공하는데 바로 Filter와 DispatcherServlet이다.

Filter는 DispatcherServlet 앞단에 위치하여 HTTP 요청 전달 전후로 URL 패턴에 맞게 공통 작업을 수행한다.

즉, 클라이언트의 HTTP 요청이 Servlet에 도달하기 전이나 후에 요청/응답 데이터를 가로채어 변경하거나 처리하는 클래스이다.

Filter의 메서드

Filter는 init(), doFilter(), destroy() 3가지 메서드를 가진다.

init()

init()은 Filter 인스턴스가 초기화 될 때 호출되는 메서드로 Filter가 처리해야 하는 초기화 작업을 수행한다.

doFilter()

doFilter() 메서드는 HTTP 요청 및 응답 처리의 핵심 로직을 수행하는 메서드다.

doFilter() 메서드에서 요청 및 응답을 가공하거나 변경하는 작업을 수행한다.
FilterChain의 doFilter() 메서드를 통해 다음 대상으로 요청한다.

보통 doFilter() 메서드에 로직을 추가하며 상속받을 경우 반드시 구현해야 하는 메서드다.

destroy()

Filter 인스턴스가 소명할 때 호출되는 메서드로 필터가 사용한 자원을 정리하거나 해제하는 작업을 수행한다.

Filter의 사용법

@WebFilter(urlPatterns = "/*")
public class IPLoggingFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 초기화 코드 (필요시 구현)
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        String ipAddress = request.getRemoteAddr();
        System.out.println("IP Address: " + ipAddress);
        
        // 다음 필터나 서블릿으로 요청을 전달
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 정리 코드 (필요시 구현)
    }
}

처음에는 필터 클래스를 작성한다.

doFilter는 반드시 작성해야하는 메서드이기 때문에 구현하도록 한다.

chain을 이용하여 다음 필터나 서블릿으로 연쇄적으로 요청을 전달한다.

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<IPLoggingFilter> loggingFilter() {
        FilterRegistrationBean<IPLoggingFilter> registrationBean = new FilterRegistrationBean<>();

        registrationBean.setFilter(new IPLoggingFilter());
        registrationBean.addUrlPatterns("/*");

        return registrationBean;
    }
}

필터 클래스를 작성한 다음 Spring Boot에서는 FilterRegistrationBean을 사용하여 필터를 Bean으로 등록한다.

여기서 addUrlPatterns을 이용하여 Filter가 적용될 Url패턴을 작성해준다.

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "Hello, World!";
    }
}

그 다음 컨트롤러를 만들어 Filter가 담당하는 내용을 수행하는 지 확인해보면 된다.

위의 코드를 실행하였을 때 IDE의 콘솔에서는 Hello, world와 더불어 API요청이 수행되는 순간

즉 Filter -> Contoller -> Filter 순으로 요청되기 때문에 IP주소가 찍히게 된다.

끝!

개념정도만 잡고 나중에 프로젝트에 직접 도입하면서 알아볼 예정이다.

profile
혼자 공부하는 블로그라 부족함이 많아요 https://www.notion.so/18067a27ac7e4f4790dde645fb3bf3d3?pvs=4

0개의 댓글