프록시 메커니즘: 외부에서 호출되는 메서드에만 AOP 적용 가능
상위 맥락
04. AOP 한계와 설계 주의 < 01. AOP와 빈 관리 원리 < 01. Spring MVC1 기초와 아키텍처 < MVC < Spring < Web
핵심 정리
Spring AOP는 실제 타겟 객체를 직접 호출하는 방식이 아니라, 타겟 객체를 감싼 프록시 객체를 통해 동작합니다. 클라이언트가 스프링 빈의 메서드를 호출하면 실제로는 프록시가 먼저 요청을 받고, 필요한 Advice를 실행한 뒤 타겟 메서드를 호출합니다.
외부 호출이 중요한 이유
AOP가 적용되려면 호출이 반드시 프록시 객체를 통과해야 합니다. 외부 객체가 스프링 컨테이너로부터 주입받은 빈을 호출하면, 그 빈은 실제 타겟이 아니라 프록시일 수 있습니다. 이 경우 프록시가 호출을 가로채어 로깅, 캐싱, 비동기, 트랜잭션 같은 부가 기능을 적용할 수 있습니다.
반대로 프록시를 통과하지 않는 호출에는 AOP가 적용되지 않습니다. Spring AOP의 핵심 한계는 여기에서 나옵니다.
동작 흐름
프록시 기반 AOP는 다음 흐름으로 이해하면 됩니다.
- 클라이언트가 스프링 빈을 호출합니다.
- 실제로는 타겟 객체가 아니라 프록시 객체가 호출을 받습니다.
- 프록시가 Pointcut 조건에 맞는지 확인합니다.
- 조건에 맞으면 Advice를 실행합니다.
- 이후 실제 Target 메서드를 호출합니다.
Spring MVC와 연결
DispatcherServlet에서 HandlerAdapter를 거쳐 @Controller가 호출되고, 컨트롤러가 다시 Service 빈을 호출하는 구조는 객체 간 외부 호출의 연속입니다. 이 구조에서는 컨트롤러와 서비스에 적용된 AOP가 프록시를 통해 자연스럽게 동작할 수 있습니다.
하지만 컨트롤러나 서비스 내부에서 자기 자신의 다른 메서드를 직접 호출하면 상황이 달라집니다. 이 문제는 내부 호출 문제에서 이어집니다.
한 문장 요약
Spring AOP는 프록시를 통과하는 외부 메서드 호출에만 적용되며, 프록시를 우회하는 호출에는 Advice가 실행되지 않습니다.
핵심 연결
AOP, DispatcherServlet, HandlerAdapter와 함께 읽으면 좋습니다.