Spring Filter와 Interceptor: 개념과 사용 예시

신수정·2024년 5월 21일

Spring Framework는 웹 애플리케이션 개발에 있어서 다양한 기능을 제공합니다. 그 중에서도 요청과 응답을 가로채고 처리할 수 있는 두 가지 주요 기능이 바로 Filter와 Interceptor입니다. 이 글에서는 Filter와 Interceptor의 개념, 차이점, 그리고 사용 예시에 대해 알아보겠습니다.

1. Filter

개념

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;
    }
}

2. Interceptor

개념

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의 차이점

  • 동작 위치: Filter는 Servlet 컨테이너 수준에서 동작하며, Interceptor는 Spring MVC 컨텍스트 내에서 동작합니다.
  • 적용 범위: Filter는 모든 요청에 대해 적용될 수 있으며, Interceptor는 특정 컨트롤러와 관련된 요청에 대해서만 적용됩니다.
  • 기능: Filter는 주로 인코딩 설정, 보안, 로깅 등에 사용되며, Interceptor는 인증, 권한 검사, 로깅 등에 사용됩니다.

결론

Filter와 Interceptor는 Spring Framework에서 매우 유용하게 사용될 수 있는 기능입니다. 각각의 장단점을 이해하고 적절하게 사용함으로써, 더 효율적이고 관리하기 쉬운 코드를 작성할 수 있습니다.

profile
안녕하세요:)

0개의 댓글