SPRING&BOOT

필터

jki09871 2024. 9. 3. 11:36
스프링 부트에서 필터는 HTTP 요청과 응답을 가로채어 처리할 수 있는 기능이다. 필터를 사용하면 요청이 컨트롤러에 도달하기 전에 사전 처리하거나 응답이 클라이언트에 전달되기 전에 후처리할 수 있다. 필터는 주로 인증, 인가, 로깅, 캐싱 등 다양한 용도로 활용된다.

필터란?

  1. 인증 및 인가: 요청이 특정 리소스에 접근하기 전에 사용자 인증 정보를 확인하거나 권한을 검증하는 데 사용된다. 예를 들어, 로그인 여부를 확인하고, 특정 페이지에 접근 가능한지 검토할 수 있다.
  2. 로깅: 요청과 응답에 대한 로그를 기록할 수 있다. 요청의 URL, 메소드, 응답 상태 코드 등을 로그로 남기면 문제를 추적하거나 시스템의 동작을 모니터링하는 데 유용하다.
  3. 성능 최적화: 캐싱 기능을 통해 서버의 성능을 향상시킬 수 있다. 요청에 대한 응답을 캐시해서 반복된 요청에 대해 빠르게 응답할 수 있다.
  4. 응답 변경: 서버에서 응답을 클라이언트에게 전달하기 전에 응답 내용을 수정하거나 추가할 수 있다. 예를 들어, 응답에 추가적인 헤더를 삽입하거나 데이터를 변형할 수 있다.

대표적인 필터와 코드 예제

스프링 부트에서 필터를 구현하려면 javax.servlet.Filter 인터페이스를 구현한 클래스를 작성하면 된다. 아래는 간단한 필터 예제이다.

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

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

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 필터 초기화 시 필요한 설정을 할 수 있다.
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
        // 요청 처리 전 로깅
        System.out.println("Request Received: " + request.getRemoteAddr());

        // 다음 필터나 서블릿으로 요청 전달
        chain.doFilter(request, response);

        // 응답 처리 후 로깅
        System.out.println("Response Sent: " + response.getContentType());
    }

    @Override
    public void destroy() {
        // 필터 종료 시 자원 정리 작업을 할 수 있다.
    }
}

이 코드는 모든 요청(urlPatterns = "/*")에 대해 요청의 IP 주소를 로그로 남기고, 응답의 콘텐츠 타입을 로그로 남긴다. 필터는 요청과 응답을 수정하거나 추가 작업을 수행할 수 있는 훅을 제공한다.

필터 등록 방법

스프링 부트에서는 필터를 등록하는 방법이 여러 가지가 있다. 가장 간단한 방법은 @WebFilter 어노테이션을 사용하는 것이지만, 스프링 부트의 자동 구성 기능을 활용하여 FilterRegistrationBean을 이용해서 등록할 수도 있다.

1. @WebFilter 어노테이션을 사용하는 방법

@WebFilter 어노테이션을 사용하여 필터를 선언하면 스프링 부트가 자동으로 필터를 등록한다. 위의 코드 예제처럼 어노테이션을 붙이면 된다. 다만, 이 방법은 Spring Boot의 자동 구성을 사용하지 않기 때문에 필터 등록 과정에 대한 세부적인 설정이 필요하다.

2. FilterRegistrationBean을 사용하는 방법

스프링 부트에서는 FilterRegistrationBean을 사용하여 필터를 등록할 수 있다. 이 방법은 좀 더 세밀하게 필터를 설정할 수 있어 유용하다. 아래는 FilterRegistrationBean을 이용한 필터 등록 예제이다.

import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<LoggingFilter> loggingFilter() {
        FilterRegistrationBean<LoggingFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new LoggingFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

이 코드는 FilterRegistrationBean을 빈으로 등록하고, 필터를 설정하여 모든 URL 패턴에 대해 필터를 적용하도록 구성한다.

 

결론

결론적으로, 필터는 HTTP 요청과 응답을 가로채어 사전 처리 및 후처리 작업을 수행할 수 있는 강력한 도구이다. 필터를 활용하면 인증, 인가, 로깅, 성능 최적화, 응답 수정 등 다양한 작업을 효과적으로 처리할 수 있다.

필터는 javax.servlet.Filter 인터페이스를 구현하여 작성하며, 이 필터를 등록하는 방법으로는 @WebFilter 어노테이션을 사용하거나 FilterRegistrationBean을 통해 더 세밀하게 필터를 구성하고 등록할 수 있다.

따라서 필터를 적절히 활용하면 애플리케이션의 성능과 보안을 향상시키고, 필요한 요청 및 응답 처리 작업을 효율적으로 수행할 수 있다.

 

 
 
4o mini