🎯 학습 목표
- AOP의 5가지 핵심 용어를 구분해 설명한다.
- 각 용어가 코드에서 어디에 해당하는지 매핑한다.
📖 핵심 용어
AOP 문서를 읽으면 용어가 쏟아져 헷갈립니다. 식당에 비유해 정리해 봅시다.
- JoinPoint(조인포인트): 부가 기능을 끼워 넣을 수 있는 모든 지점. 스프링 AOP에서는 “메서드 실행” 시점들입니다. (식당의 모든 테이블)
- Pointcut(포인트컷): 그 많은 조인포인트 중 실제로 적용할 지점을 골라내는 표현식. (“창가 테이블만”)
- Advice(어드바이스): 고른 지점에서 실제로 수행할 부가 동작. 그리고 언제 실행할지(전/후/전후). (“주문 전 물 따라주기”)
- Aspect(애스펙트): Pointcut + Advice를 묶은 하나의 모듈. (“창가 서비스 매뉴얼”)
- Weaving(위빙): Aspect를 실제 코드에 끼워 넣는 과정. 스프링은 런타임에 프록시로 위빙합니다.
💻 코드와 용어 매핑
@Aspect // ← Aspect: 부가기능 모듈
@Component
public class LoggingAspect {
// ↓ Pointcut: "service 패키지의 모든 메서드 실행" 지점을 선택
@Pointcut("execution(* com.example.service..*(..))")
public void serviceMethods() {}
// ↓ Advice: 선택된 JoinPoint '실행 전(@Before)'에 수행할 동작
@Before("serviceMethods()")
public void logBefore(JoinPoint jp) { // JoinPoint: 끼어든 그 지점 정보
System.out.println("호출: " + jp.getSignature());
}
}
// Weaving: 스프링이 위 Aspect를 프록시로 대상 빈에 적용 (자동)
📖 Advice 실행 시점 5종
@Before : 대상 메서드 실행 "전"
@AfterReturning : 정상 반환 "후"
@AfterThrowing : 예외 발생 "시"
@After : 정상/예외 무관 "항상 후" (finally 같은 것)
@Around : 전·후 모두 감싸기 (가장 강력, 실행 자체를 제어)
📖 위빙(프록시) 동작 그림
스프링은 대상 빈을 직접 호출하게 두지 않고, 똑같이 생긴 프록시(대리 객체)를 대신 주입합니다. 호출자는 프록시를 부르고, 프록시가 Advice를 실행한 뒤 진짜 대상 메서드로 넘깁니다. 그래서 원본 코드를 한 줄도 고치지 않고 부가기능이 끼어듭니다.
호출자 ──▶ [프록시] ──(Advice: @Before 등 실행)──▶ [실제 대상 빈]
대리 객체 원본 코드
└────(@After / 반환·예외 처리)◀──────────┘
* 호출자는 자기가 프록시를 부르는지 모른다(투명).
* 그래서: 프록시를 "거치지 않는" 호출(같은 클래스 내부 this 호출)에는
Advice가 적용되지 않는다 → 6강의 self-invocation 함정.
💡 팁
- 처음에는
@Before와@Around두 개만 확실히 익혀도 대부분 처리됩니다. - Pointcut을 메서드로 분리(
serviceMethods())해 두면 여러 Advice에서 재사용할 수 있습니다.