스프링 부트에서 필터는 HTTP 요청과 응답을 가로채어 처리할 수 있는 기능이다. 필터를 사용하면 요청이 컨트롤러에 도달하기 전에 사전 처리하거나 응답이 클라이언트에 전달되기 전에 후처리할 수 있다. 필터는 주로 인증, 인가, 로깅, 캐싱 등 다양한 용도로 활용된다.
필터란?
- 인증 및 인가: 요청이 특정 리소스에 접근하기 전에 사용자 인증 정보를 확인하거나 권한을 검증하는 데 사용된다. 예를 들어, 로그인 여부를 확인하고, 특정 페이지에 접근 가능한지 검토할 수 있다.
- 로깅: 요청과 응답에 대한 로그를 기록할 수 있다. 요청의 URL, 메소드, 응답 상태 코드 등을 로그로 남기면 문제를 추적하거나 시스템의 동작을 모니터링하는 데 유용하다.
- 성능 최적화: 캐싱 기능을 통해 서버의 성능을 향상시킬 수 있다. 요청에 대한 응답을 캐시해서 반복된 요청에 대해 빠르게 응답할 수 있다.
- 응답 변경: 서버에서 응답을 클라이언트에게 전달하기 전에 응답 내용을 수정하거나 추가할 수 있다. 예를 들어, 응답에 추가적인 헤더를 삽입하거나 데이터를 변형할 수 있다.
대표적인 필터와 코드 예제
스프링 부트에서 필터를 구현하려면 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을 통해 더 세밀하게 필터를 구성하고 등록할 수 있다.
따라서 필터를 적절히 활용하면 애플리케이션의 성능과 보안을 향상시키고, 필요한 요청 및 응답 처리 작업을 효율적으로 수행할 수 있다.
'SPRING&BOOT' 카테고리의 다른 글
Spring Boot에서 JWT 인증 필터와 ArgumentResolver 활용하기 (1) | 2024.09.20 |
---|---|
AOP(Aspect-Oriented Programming) 개념 및 실습 (0) | 2024.09.10 |
캡슐화(Encapsulation) (0) | 2024.08.28 |
API 명세서란? API 명세서 작성의 중요성과 방법 (0) | 2024.08.18 |
Path Variable과 Request Param (0) | 2024.08.15 |