Spring/아키텍처, 설계

Interceptor vs AOP(Aspect Oriented Programming)

가지코딩 2025. 6. 11. 23:02

Spring에서는 공통 기능을 모듈화하기 위한 여러 방법을 제공한다.

그 중 많이 사용되는 두 가지가 바로 Interceptor와 AOP(Aspect-Oriented Programming)이다.

이 글에서는 두 개념의 차이점과 사용 목적을 명확히 정리하고자 한다.

 


Interceptor란?

  • Spring MVC에서 제공하는 컴포넌트
  • 주로 HTTP 요청/응답 흐름을 가로채기 위해 사용
  • DispatcherServlet에서 Controller로 가기 전/후에 동작

 

동작 시점

  1. preHandle() – Controller 실행 이전
  2. postHandle() – Controller 실행 이후, View 렌더링 전
  3. afterCompletion() – View 렌더링 이후

 

장점

  • 웹 요청(Request/Response)에 특화되어 있어 인증/인가 처리에 적합
  • 설정이 간단하며, 컨트롤러 앞단에서 필터처럼 동작

 

단점

  • 비즈니스 로직 내부에 접근할 수 없음 (서비스 로직에는 관여 불가)
  • HTTP 요청이 아닌 내부 메서드 호출에는 적용 불가

 

주요 목적

  • 인증/인가 처리
  • 로깅
  • 요청 전처리 및 응답 후처리

AOP란?

  • 스프링 프레임워크가 제공하는 핵심 기술 중 하나
  • 비즈니스 로직의 메서드 실행 전/후, 예외 발생 시점 등에 횡단 관심사를 주입
  • 더 유연하고 세밀한 적용이 가능

 

동작 시점 (Advice)

  • @Before – 메서드 실행 전
  • @AfterReturning – 정상 종료 후
  • @AfterThrowing – 예외 발생 시
  • @After – 무조건 실행 (finally)
  • @Around – 실행 전/후 모두 처리 가능

 

장점

  • 서비스/레포지토리 계층까지 적용 가능
  • 메서드 인자, 반환값, 예외 등 다양한 시점과 데이터에 접근 가능
  • 진정한 관심사 분리를 통해 코드 간결성 확보

 

단점

  • 동작 방식이 프록시 기반이라 직관성이 떨어질 수 있음
  • 설정이 복잡해질 수 있고, 디버깅이 어려움

 

주요 목적

  • 트랜잭션 처리
  • 성능 모니터링
  • 로깅
  • 예외 처리

✅ 공통점

  • 핵심 로직과 공통 관심사(예: 로깅, 인증, 트랜잭션) 를 분리할 수 있다.
  • 코드 중복을 줄이고 유지보수를 쉽게 한다.
  • 실행 흐름의 전/후에 가로채서 공통 작업을 처리할 수 있다.

🆚 비교

항목 Interceptor AOP (Aspect-Oriented Programming)
적용 대상 웹 요청 (DispatcherServlet 전/후) 메서드 실행 전/후/예외 발생 시 등
동작 시점 주로 Controller 호출 전후 주로 Service/Repository 메서드 실행 시
설정 위치 WebMvcConfigurer.addInterceptors() @Aspect, @Around, @Before, @After
대표 용도 인증/인가, 로깅, 세션 검사 등 HTTP 요청 단위 처리 트랜잭션, 로깅, 성능 측정 등 비즈니스 로직 단위 처리
스프링 의존성 Spring MVC Spring AOP (또는 AspectJ)
세밀한 제어 상대적으로 제한적 (Handler 기준) 매우 세밀한 조건으로 타깃 지정 가능 (pointcut 표현식 사용)
리턴 값 접근 어렵거나 제한적 가능 (ProceedingJoinPoint로 매개변수 및 결과 조작 가능)

💡 언제 어떤 것을 써야 하나?

상황 추천 도구
요청 URL을 기준으로 인증/인가 로직 처리 Interceptor
특정 비즈니스 로직 실행 전/후 공통 처리 AOP
로깅, 트랜잭션, 성능 측정 등 서비스 로직 중심의 부가 기능 AOP
컨트롤러 진입 전 세션 검사 등 HTTP 단 수준 처리 Interceptor

 

정리

  • 웹 요청 전/후 가로채기 → Interceptor
  • 메서드 기반 공통 로직 처리 → AOP