Framework/Spring Boot

[Spring Boot] Filter, Interceptor, AOP 차이 및 정리

꽁치_로그 2024. 3. 8. 14:53

Spring Boot를 사용하면 애플리케이션의 공통 기능을 개발하고 관리하는데 매우 효과적인 다양한 기능을 제공한다.

예를들어 로그인 관련 (세션 체크) 처리, 권한 체크, XSS(Cross Site Script) 방어, PC와 모바일웹의 분기처리, 로그, 페이지 인코딩 변황 등이 있다.

이러한 기능 중에는 Filter, Interceptor, Aspect-Oriented Programming (AOP) 등이 있다.

각각의 기능은 애플리케이션의 요청 처리 과정에서 앞, 중간, 뒤에 추가하여 특정한 작업을 수행하도록 해주며, 코드의 재사용성과 모듈성을 높여준다.

(모든 페이지마다 공통 업무에 관련된 코드를 작성하면 중복된 코드가 많아지고 서버에 부하를 줄 수도 있으며 소스 관리도 어렵다.)

Filter, Intercepter, AOP의 흐름

Interceptor와 Filter는 Servlet 단위에서 실행된다. 반면 AOP는 메소드 앞에 Proxy 패턴의 형태로 실행된다.요청에 의한 실행순서를 보면 Filter → Interceptor → AOP → Interceptor → Filter 순이다.

  1. 서버를 실행시켜 Servlet이 올라오는 동안에 init이 실행되고, 그 후 doFiler가 실행된다.
  2. Controller에 들어가기 전 preHandler가 실행된다.
  3. Controller에서 나와 postHandler, after Completion, doFilter 순으로 진행이 된다.
  4. Servlet 종료 시 destory가 된다.

🚀 Filter

Filter는 Servlet 스펙에 정의된 개념으로, 클라이언트의 요청이 서블릿에 도달하기 전과 응답이 클라이언트에게 돌아가기 전에 실행되는 클래스이다.

Spring Boot 애플리케이션에서 Filter를 사용하면 HTTP 요청 및 응답을 수정하거나 로깅할 수 있다.

예를 들어 권한 검사, 요청 및 응답 데이터의 암호화/복호화, 로깅, 인코딩 변환, XSS 방어 등의 작업을 수행할 수 있다.

Filter를 Spring Boot에 등록하는 방법은 FilterRegistrationBean을 사용하는 것이다. 이를 통해 Filter를 원하는 URL 패턴에 매핑하고 순서를 조절할 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
@Component
public class CustomFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
            throws IOException, ServletException {
 
    @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 is intercepted by CustomFilter.");
 
        // 다음 필터로 체인을 전달
        chain.doFilter(request, response);
 
        // 응답 후 작업 수행 (예: 로깅)
        System.out.println("Response is intercepted by CustomFilter.");
    }
 
    @Override
    public void destroy() {
        // 필터 종료
    }    
}
 
@Configuration
public class FilterConfig {
 
    @Bean
    public FilterRegistrationBean<CustomFilter> loggingFilter() {
        FilterRegistrationBean<CustomFilter> registrationBean = new FilterRegistrationBean<>();
 
        registrationBean.setFilter(new CustomFilter());
        registrationBean.addUrlPatterns("/api/*"); // 필터를 적용할 URL 패턴 설정
        registrationBean.setOrder(1); // 필터의 순서 설정
 
        return registrationBean;
    }
}
 
cs

🚀 Interceptor

Interceptor는 Spring MVC 프레임워크에서 제공하는 기능으로, 컨트롤러의 실행 전후 또는 뷰가 렌더링되기 전후에 특정한 작업을 수행할 수 있습니다. 주로 로깅, 권한 검사, 트랜잭션 관리 등의 업무를 처리합니다.

Interceptor를 Spring Boot에 등록하는 방법은 HandlerInterceptor 인터페이스를 구현하고 WebMvcConfigurer를 확장하여 addInterceptors 메서드를 오버라이드하는 것입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public class LogInterceptor implements HandlerInterceptor{
 
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {
        String requestURI = request.getRequestURI();
        System.out.println("[interceptor] requestURI : " + requestURI);
        
        // false -> 이후에 진행을 하지 않는다.
        return true;  
    }
    
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("[interceptor] postHandle");
    }
    
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("[interceptor] afterCompletion");
    }
cs

🚀 AOP (Aspect-Oriented Programming)

AOP는 관점 지향 프로그래밍의 약자로, 애플리케이션의 횡단 관심사를 모듈화하는 프로그래밍 패러다임이다. AOP를 사용하면 핵심 비즈니스 로직공통 기능분리하여 코드의 중복을 최소화하고 관리를 용이하게 할 수 있다. Spring Boot는 AOP를 구현하기 위해 @Aspect 어노테이션과 AspectJ 라이브러리를 제공한다.

1
2
3
4
5
6
7
8
9
10
11
12
@Aspect
@Component
public class LoggingAspect {
 
    @Before("execution(* com.example.demo.service.*.*(..))")
    public void beforeAdvice(JoinPoint joinPoint) {
        // 메서드 실행 전 로깅
        String methodName = joinPoint.getSignature().getName();
        System.out.println("Before calling method: " + methodName);
    }
}
 
cs

위의 예시에서 @Before 어노테이션은 Advice를 정의하며, 지정된 패키지 내의 모든 메서드가 호출되기 전에 로깅을 수행한다.

Spring Boot 애플리케이션에서 Filter, Interceptor, AOP 등의 공통 기능을 효과적으로 활용하면 코드의 재사용성을 높이고 관리를 용이하게 할 수 있다. 이를 통해 애플리케이션의 유지보수성과 확장성을 향상시킬 수 있다.

반응형