Spring AOP

Spring AOP 강좌 02강 — AOP 핵심 용어: Aspect·JoinPoint·Pointcut·Advice·Weaving

🎯 학습 목표

  • 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에서 재사용할 수 있습니다.