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)에 의존하므로 다음과 같은 제한이 발생합니다 :
- final 또는 private 메서드: 오버라이딩이 불가능하므로 Advice 적용 대상이 될 수 없습니다.
-
- 자체 호출(Self-Invocation) 문제: 대상 객체 내부에서 자기 자신의 다른 메서드를 호출할 경우, 프록시를 거치지 않고 실제 객체로 직접 호출되어 AOP가 적용되지 않습니다.
'UMC > study' 카테고리의 다른 글
| [UMC_study] 컨트롤 URI이란? (0) | 2025.10.05 |
|---|---|
| [UMC_study] Soft Delete 란? (0) | 2025.10.05 |
| [UMC_study] 서블릿 vs Spring MVC 비교 (0) | 2025.09.28 |
| [UMC_study] 버튼을 연타하는 걸 막아라! (0) | 2025.09.21 |
| [UMC_study] 함수 기반 인덱스와 복합 인덱스 (0) | 2025.09.21 |