UMC/study

[UMC_study] AOP(Aspect-Oriented Programming) 원리 탐구

sunm2n 2025. 9. 28. 13:52

1. AOP의 본질 및 필요성 (AOP Essence and Necessity)

 

항목 설명 필요성 (문제 해결)
AOP 정의 횡단 관심사(Cross-cutting Concerns, CCC)를 모듈화하고 캡슐화할 수 있도록 지원하는 프로그래밍 패러다임.   
 
 

OOP의 모듈화 한계를 보완하여 유지보수성 코드 청결성을 극대화.   
 
 

CCC (횡단 관심사) 핵심 비즈니스 로직과 직접적인 관련이 없으나, 시스템 전반에 걸쳐 반복적으로 필요한 기능 (예: 로깅, 보안, 트랜잭션 관리).   
 
 

OOP 환경에서 코드 산재(Scattering) 및 **코드 얽힘(Tangling)**을 유발하여 모듈성을 저해.   
 

 


 

2. OOP와 AOP의 관계 및 관점 분리

 

AOP는 OOP를 대체하는 것이 아니라 보완하는 구조적 사고방식입니다.   

 
특징 OOP (객체 지향 프로그래밍) AOP (관점 지향 프로그래밍)
모듈화 단위 Class   
 
 

Aspect   
 
 

주요 관심사 핵심 비즈니스 로직   
 

횡단 관심사 (비기능적 로직)   
 
 

목적 데이터 및 행위 캡슐화 관심사 분리(SoC) 극대화   
 
 

 


 

3. AOP의 핵심 개념 5가지

 

개념 정의 Spring AOP에서의 특징
Aspect (애스펙트) 횡단 관심사를 모듈화하여 캡슐화한 단위 (Advice와 Pointcut의 결합).   
 
 

@Aspect 어노테이션을 사용하여 정의되며, Spring 컨테이너의 빈으로 등록됨.   
 

JoinPoint (조인포인트) 애스펙트의 조언(Advice)을 삽입할 수 있는 프로그램 실행 후보 지점.   
 
 

Spring AOP는 동적 프록시 기반으로 메서드 실행 조인포인트만 지원.   
 
 

Pointcut (포인트컷) 수많은 조인포인트 중에서 실제 조언을 적용할 대상을 선별하는 표현식(술어).   
 
 
 

@annotation, execution, within 등의 지정자를 사용.   
 

Advice (조언) 포인트컷에 의해 선택된 조인포인트에서 애스펙트가 수행하는 실제 동작(로직).   
 
 

유형: @Before, @AfterReturning, @AfterThrowing, @After, @Around.   
 

Weaving (위빙) 애스펙트(Advice + Pointcut)를 대상 객체에 결합하여 새로운 객체(AOP Proxy)를 생성하는 과정.   
 

컴파일 타임, 로드 타임, 런타임 위빙으로 구분되며, Spring AOP는 런타임 위빙을 사용.   
 
 

 


 

4. 위빙 방식의 유형 및 Spring AOP vs. AspectJ 비교

 

Spring AOP는 **런타임 위빙(Runtime Weaving, RTW)**을 사용하는 반면, AspectJ는 컴파일 타임(Compile-Time Weaving, CTW) 또는 **로드 타임(Load-Time Weaving, LTW)**을 사용합니다.   

 
구분 Spring AOP (런타임 위빙) AspectJ (CTW / LTW)
위빙 시점 런타임 (프록시 객체 생성 시)   
 

컴파일 타임 또는 클래스 로딩 시점   
 
 

기반 기술 JDK Dynamic Proxy / CGLIB   
 
 

바이트코드 직접 조작   
 

대상 범위 Spring IoC 컨테이너 관리 빈으로 제한   
 
 

모든 Java 객체 및 Third-party 라이브러리 적용 가능   
 
 

JoinPoint 메서드 실행만 지원 (프록시의 한계)   
 

메서드 호출, 필드 접근 등 광범위하게 지원   
 

성능 프록시를 통한 간접 호출로 오버헤드 존재   
 

바이트코드에 직접 삽입되어 오버헤드가 적음   
 

 


 

5. Spring AOP의 프록시 기반 동작 원리

 

Spring AOP는 프록시 패턴을 활용하여 런타임에 횡단 관심사를 주입(위빙)합니다. 클라이언트가 대상 객체의 메서드를 호출하면, 실제로는 AOP   

 

프록시 객체가 이 호출을 가로채(Intercept) Advice 로직을 실행한 후, 실제 대상 객체로 호출을 위임합니다.   

 

가. 프록시 유형 선택 기준

Spring은 대상 객체의 구조에 따라 두 가지 동적 프록시 기술 중 하나를 선택합니다.   

 
프록시 유형 선택 조건 작동 원리 핵심 요소
JDK Dynamic Proxy 대상 객체가 인터페이스를 구현한 경우 (기본)   
 

런타임에 인터페이스를 구현하는 새로운 프록시 클래스를 생성   
 

InvocationHandler를 통해 호출 가로채기   
 
 

CGLIB Proxy 대상 객체가 인터페이스를 구현하지 않은 경우   
 

대상 클래스를 상속받는 서브클래스(프록시)를 런타임에 생성   
 

MethodInterceptor를 통해 호출 가로채기   
 

나. 프록시 방식의 주요 제한 사항

프록시 기반 AOP는 메서드 오버라이딩(CGLIB) 또는 인터페이스 구현(JDK Proxy)에 의존하므로 다음과 같은 제한이 발생합니다 :   

 
  1. final 또는 private 메서드: 오버라이딩이 불가능하므로 Advice 적용 대상이 될 수 없습니다.   
  2.  
  3. 자체 호출(Self-Invocation) 문제: 대상 객체 내부에서 자기 자신의 다른 메서드를 호출할 경우, 프록시를 거치지 않고 실제 객체로 직접 호출되어 AOP가 적용되지 않습니다.