Spring Framework는 웹 애플리케이션 개발에 있어서 다양한 기능을 제공합니다. 그 중에서도 요청과 응답을 가로채고 처리할 수 있는 두 가지 주요 기능이 바로 Filter와 Interceptor입니다. 이 글에서는 Filter와 Interceptor의 개념, 차이점, 그리고 사용 예시에 대해 알아보겠습니다.
Filter는 Servlet의 스펙 중 하나로, HTTP 요청 및 응답을 전처리하거나 후처리할 수 있는 기능을 제공합니다. 필터는 웹 애플리케이션 전역에서 동작하며, 주로 보안, 로깅, 인코딩, 인증 등의 작업을 수행하는 데 사용됩니다.
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 java.io.IOException;
public class EncodingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 초기화 작업
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
@Override
public void destroy() {
// 종료 작업
}
}
설정:
이 필터를 Spring Boot 애플리케이션에 설정하려면 @Component 애노테이션을 사용하거나 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<EncodingFilter> encodingFilter() {
FilterRegistrationBean<EncodingFilter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new EncodingFilter());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}
Interceptor는 Spring MVC에서 제공하는 기능으로, HTTP 요청을 가로채서 전처리와 후처리를 할 수 있습니다. 인터셉터는 컨트롤러와 관련된 작업을 수행할 때 주로 사용되며, 요청을 가로채고 컨트롤러의 메서드가 실행되기 전후에 작업을 수행할 수 있습니다.
Interceptor를 사용하여 요청이 컨트롤러에 도달하기 전에 인증을 체크하는 예제를 살펴보겠습니다.
예제 코드:
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class AuthenticationInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 인증 로직
String authToken = request.getHeader("Authorization");
if (authToken == null || !isValidToken(authToken)) {
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
return true;
}
private boolean isValidToken(String authToken) {
// 토큰 검증 로직 (예: JWT 검증)
return "valid-token".equals(authToken);
}
}
설정:
이 인터셉터를 Spring Boot 애플리케이션에 설정하려면 WebMvcConfigurer를 구현한 클래스에서 등록할 수 있습니다.
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new AuthenticationInterceptor()).addPathPatterns("/api/**");
}
}
Filter와 Interceptor는 Spring Framework에서 매우 유용하게 사용될 수 있는 기능입니다. 각각의 장단점을 이해하고 적절하게 사용함으로써, 더 효율적이고 관리하기 쉬운 코드를 작성할 수 있습니다.