Weaving
모듈화한 부가 기능을 타겟에 적용하여, 핵심 기능과 연결하는 과정을 뜻한다.
Runtime Weaving (RTW)
- 프록시 패턴을 활용한 위빙 방식으로,
Proxy객체를 생성하여 실제 타깃 오브젝트의 변형 없이 런타임 중 메서드 호출이 일어나는 일어나는 방식이다.
- Proxy, Reflection, 바이트 코드 조작등의 기술을 사용하여 이루어짐.
- Spring AOP와 같은 프레임워크를 통해 Runtime Weaving을 구현할 수 있다.
<과정>
1. Aspect 정의
package com.example;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
@Aspect
public class LoggingAspect {
@Before("execution(* com.example..*.*(..))")
public void logBeforeMethod() {
System.out.println("Method is about to be called");
}
}
2. AspectJ 컴파일러 사용
ajc -source 1.8 -target 1.8 com/example/*.java
3. 실행
=> 컴파일된 클래스 파일 실행하면, 지정된 메서드 호출 전에 로깅 수행됨.
장점 :
- 프로그램 실행 도중에 aop를 적용하거나 제거할 수 있어, 다양한 시나리오에 맞게 쉽게 조정 가능하다.
- 기존 코드를 변경하지 않고도, 새로운 기능을 추가할 수 있다.
- 소스 코드에 직접적인 변경을 하지 않아, 코드 변경 후 재 컴파일이나 재 배포없이 적용 가능하다.
단점:
- 소스파일, 클래스파일에 변형이 없지만 포인트 컷에 대한 어드바이스 수가 늘어나서, 성능이 그만큼 비례해서 떨어진다.
- 실행 시점에 aspect가 적용되기 때문에, 프로그램의 동작이 더 복잡해지고 예측하기 어려워질 수 있다
- 디버깅 어려움 : 실행시점에 적용되기 때문에, 코드의 흐름을 파악하기 어렵고, 디버깅이 복잡해질 수 있다.
Compile Time Weaving(CTW)
- 컴파일 되는 시점에 소스 코드에 통합되는 위빙 방식이다
- 실행 시간에 추가적인 처리가 필요 없음
- AspectJ가 소스코드나 바이트코드에 직접 Aspect를 삽입하여 이루어짐.
<과정>
1. Aspect 정의
2. AspectJ 라이브러리 추가
- 프로젝트의 classpath에 'aspectjweaver.jar' 포함시킴
3. META-INF 하위에 aop.xml 파일 생성하여 위빙할 aspect 지정
<aspectj>
<aspects>
<aspect name="com.example.LoggingAspect"/>
</aspects>
</aspectj>
4. 자바 에이전트를 사용하여 aspectjweaver.jar 실행
장점 :
- 런타임 때 추가적인 처리가 필요 없어 성능이 향상됨.
- 컴파일 시점에 Aspect가 적용 되므로, 프로그램의 동작이 더 예측 가능해짐
- Aspect가 이미 컴파일시에 코드에 통합이 되어 있기 때문에, 디버깅이 더 수월해짐.
단점 :
- 프로그램 실행 중에 aspect를 변경하거나 조정하는 것이 불가능함. 모든 변경은 소스 코드 수정 후 재 컴파일 진행 요망.
- aspect에 변경이 있을 때마다, 전체 어플리케이션을 재 컴파일해야함.
'Spring' 카테고리의 다른 글
Spring Batch - 개요, 도메인 이해 (0) | 2024.05.26 |
---|---|
Spring AOP vs AspectJ (0) | 2023.11.21 |
RequestContextHolder (0) | 2023.11.04 |
Reactive Programming & Spring Webflux (0) | 2023.10.30 |
토비의 스프링 3장 (0) | 2022.09.26 |