Spring에서는 공통 기능을 모듈화하기 위한 여러 방법을 제공한다.
그 중 많이 사용되는 두 가지가 바로 Interceptor와 AOP(Aspect-Oriented Programming)이다.
이 글에서는 두 개념의 차이점과 사용 목적을 명확히 정리하고자 한다.
Interceptor란?
- Spring MVC에서 제공하는 컴포넌트
- 주로 HTTP 요청/응답 흐름을 가로채기 위해 사용
- DispatcherServlet에서 Controller로 가기 전/후에 동작
동작 시점
- preHandle() – Controller 실행 이전
- postHandle() – Controller 실행 이후, View 렌더링 전
- 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
'Spring > 아키텍처, 설계' 카테고리의 다른 글
템플릿 메서드 패턴(Template Method Pattern) (1) | 2025.06.18 |
---|---|
전략 패턴(Strategy Pattern) (0) | 2025.06.18 |
Entity와 DTO(Data Transfer Object)의 차이 (0) | 2025.05.09 |