[JAVA/Spring] Filter, Interceptor, AOP 알아보기

joowonseo·2025년 3월 11일

실행 순서 개요

가장 중요한 부분부터 알아보자면, Filter, Interceptor, AOP의 역할은 간단하게 다음과 같습니다.

  1. Filter - 웹 애플리케이션의 외곽에서 HTTP 요청과 응답을 처리
  2. Interceptor - Spring MVC의 일부로서 컨트롤러 실행 전후를 처리
  3. AOP - 애플리케이션 내부의 메서드 실행을 가로채서 처리

따라서 HTTP 요청이 들어왔을 때 실행 순서는 다음과 같습니다.

HTTP 요청
→ Filter
→ Interceptor
→ AOP
→ Controller
→ AOP
→ Interceptor
→ Filter
→ HTTP 응답

Filter

  • Filter는 Servlet Container 레벨에서 동작하며, Spring Context에 도달하기 전에 실행됩니다.
  • HTTP 요청과 응답을 변경할 수 있어 인코딩 변환이나 CORS 처리와 같은 웹 관련 전처리/후처리에 적합합니다.
  • Spring Filter는 DispatcherServlet에 요청이 전달되기 전에 실행되므로 Spring Bean을 주입받을 수 없습니다.

주요 특징

  • ServletRequest/Response 객체 자체를 변경, 조작 가능
  • 모든 HTTP 요청에 적용 가능
  • 요청 URL 기반으로 필터링 가능

대표적인 사용 사례

  • 문자 인코딩 변환
  • CORS(Cross-Origin Resource Sharing) 요청 처리
  • XSS 방어를 위한 요청 파라미터 필터링
  • 압축, 암호화 처리
  • 로깅 및 감사
  • 인증 및 권한 부여(보안)

Interceptor

  • Interceptor는 Spring MVC의 일부로, DispatcherServlet이 컨트롤러를 호출하기 전후에 실행됩니다.
  • Spring Context 내부에서 동작하므로 다른 Spring Bean에 접근할 수 있어 비즈니스 로직과 연계된 처리에 적합합니다.

주요 특징

  • HttpServletRequest/Response 객체를 변경할 수는 없지만, 속성은 추가/변경 가능
  • Handler(Controller)와 ModelAndView에 접근 가능
  • 특정 URL 패턴에 대해 선택적으로 적용 가능

주요 메서드

컨트롤러 실행 전(preHandle), 컨트롤러 실행 후 뷰 렌더링 전(postHandle), 뷰 렌더링 후(afterCompletion) 등 세 가지 시점에 동작할 수 있습니다.

  • boolean preHandle(HttpServletRequest, HttpServletResponse, Object handler): 컨트롤러 실행 전
  • void postHandle(HttpServletRequest, HttpServletResponse, Object handler, ModelAndView): 컨트롤러 실행 후, 뷰 렌더링 전
  • void afterCompletion(HttpServletRequest, HttpServletResponse, Object handler, Exception): 요청 처리가 완전히 끝 난, 뷰 렌더링 후

대표적인 사용 사례

  • 인증/권한 검사
  • API 요청 로깅
  • 세션/쿠키 처리
  • 지역화(Localization) 처리
  • 실행 시간 측정

AOP (Aspect-Oriented Programming)

  • AOP는 Spring의 핵심 기능 중 하나로, OOP를 보완하는 개념으로, 로깅, 트랜잭션 관리와 같은 횡단 관심사를 모듈화할 수 있습니다.
  • AOP는 Spring Bean 메서드 실행 시점에 동작하며, 프록시 패턴을 사용하여 구현됩니다.
  • 메서드 실행 전(@Before), 후(@After), 반환 후(@AfterReturning), 예외 발생 시(@AfterThrowing), 그리고 전후(@Around) 등 다양한 시점에 코드를 삽입할 수 있습니다.

주요 특징

  • 비즈니스 로직과 공통 관심사를 분리
  • 메서드 호출, 필드 액세스 등 다양한 조인 포인트 지원
  • 프록시 패턴을 사용하여 구현
  • Spring 빈 내부의 메서드 호출에 대해 동작
  • 메서드 매개변수, 반환값, 예외 등에 접근 가능
  • 표현력이 높은 Pointcut 언어를 사용하여 대상 지정 가능

주요 개념

  • Aspect: 여러 객체에 공통으로 적용되는 관심사의 모듈
  • Join Point: 프로그램 실행 중의 특정 지점(메서드 실행, 예외 처리 등)
  • Advice: 특정 Join Point에서 Aspect가 취하는 행동(Before, After, Around 등)
  • Pointcut: Advice를 적용할 Join Point를 선별하는 표현식
  • Weaving: Aspect를 대상 객체에 적용하는 과정

주요 Advice 유형

  • @Before: 메서드 실행 전에 실행
  • @After: 메서드 실행 후에 실행(메서드가 정상적으로 실행되든 예외가 발생하든 상관없이)
  • @AfterReturning: 메서드가 정상적으로 실행된 후에 실행
  • @AfterThrowing: 메서드 실행 중 예외가 발생했을 때 실행
  • @Around: 메서드 실행 전후에 실행 (가장 강력한 Advice)

대표적인 사용 사례

  • 트랜잭션 관리(@Transactional)
  • 메서드 실행 로깅
  • 성능 모니터링
  • 예외 처리
  • 캐싱

세 가지 메커니즘의 주요 차이점

동작 범위

  • Filter: 웹 애플리케이션의 모든 요청/응답에 대해 동작
  • Interceptor: DispatcherServlet이 컨트롤러로 요청을 전달할 때 동작
  • AOP: 애플리케이션 내의 모든 Spring 빈 메서드 호출에 동작 가능

사용 목적

  • Filter:
    • 웹 요청/응답에 대한 전처리/후처리
    • 인코딩, 보안 관련 처리
  • Interceptor:
    • Spring MVC 요청 생명주기 관련 처리
    • 컨트롤러 중심의 횡단 관심사 처리
  • AOP:
    • 비즈니스 로직 중심의 횡단 관심사 처리
    • 세밀한 메서드 수준의 관심사 분리

접근할 수 있는 객체

  • Filter: ServletRequest, ServletResponse
  • Interceptor: HttpServletRequest, HttpServletResponse, Handler, ModelAndView
  • AOP: 메서드 인자, 반환값, 예외, 메소드 시그니처 등

실행 순서 상세 설명

  1. 클라이언트 HTTP 요청
  2. Filter 전처리 (doFilter() 메서드의 chain.doFilter() 호출 전 부분)
  3. DispatcherServlet 진입
  4. Interceptor 전처리 (preHandle() 메서드)
  5. AOP 전처리 (@Before, @Aroundproceed() 호출 전 부분)
  6. Controller 메서드 실행
  7. AOP 후처리 (@Aroundproceed() 호출 후 부분, @AfterReturning, @After)
  8. Interceptor 후처리 (postHandle() 메서드)
  9. View 렌더링
  10. Interceptor 완료 처리 (afterCompletion() 메서드)
  11. Filter 후처리 (doFilter() 메서드의 chain.doFilter() 호출 후 부분)
  12. 클라이언트 HTTP 응답

어떤 메커니즘을 언제 사용해야 할까?

Filter

Filter는 Spring Context 외부에서 동작하므로, 인코딩 변환이나 CORS 처리와 같은 서블릿 수준의 공통 처리에 적합합니다. 또한 Spring의 영향을 받지 않는 보안 인증과 같은 작업도 Filter에서 처리하는 것이 좋습니다.

Interceptor

Interceptor는 Spring MVC 내부에서 동작하므로, 컨트롤러와 연관된 처리에 적합합니다. 로그인 체크, 권한 검사, API 요청 로깅과 같이 HTTP 요청과 밀접하게 관련된 작업을 처리할 때 사용합니다.

AOP

AOP는 메서드 실행 수준에서 동작하므로, 비즈니스 로직과 관련된 횡단 관심사에 적합합니다. 트랜잭션 관리, 메서드 수준의 로깅, 성능 측정과 같이 애플리케이션 전반에 걸친 공통 기능을 구현할 때 사용합니다.

profile
백엔드 개발자 ˚₊✩‧₊ ໒꒱

0개의 댓글