Spring AOP - 스프링에서 사용할 수 있는 간단한 AOP 기능만을 제공한다.
•
CGlib등의 바이트코드 조작을 이용한 다이나믹 프록시를 사용해서 AOP 기능을 제공한다.
•
런타임 시점에 동적으로 변할 수 있는 프록시 객체를 이용하기에 앱 성능에 영향을 끼칠 수 있다.
AspectJ - 자바에서 완벽한 AOP 솔루션 제공을 목표로하는 기술이다.
•
Aspectj 컴파일러를 추가로 사용하여 컴파일 시점이나 JVM 클래스 로드시점에 조작한다.
•
런타임 시점에는 영향끼치지 않는다. 컴파일이 완료된 이후에는 앱 성능에 영향이 없다.
•
Spring AOP에 비해 사용방법이 다양하고 내부 구조가 굉장히 복잡하다.
AspectJ의 3가지 유형의 Weaving
1. Compile-Time Weaving: AspectJ 컴파일러가 Aspect 코드와 애플리케이션의 소스 모두 입력받아 Weaving된 class 파일을 생성
2. Post-Complie Weaving: 이미 존재하는 class 파일과 jar 파일을 Weaving하기 위해 사용
3. Load-time Weaving: Post-Complie Weaving과 비슷하지만, Weaving 시점이 class 파일이 JVM에 로드될 때 까지 연기된다.
CTW(Compile-Time Weaving)
•
가장 빠른 속도
•
AJC를 통해 java파일을 컴파일 하며, 컴파일 과정에서 바이트 코드 조작을 통해 Advisor 코드를 직접 삽입하여 위빙을 수행
◦
AJC(AspectJ Compiler) - Java Compiler를 확장한 형태의 컴파일러
•
컴파일 과정에서 lombok과 같이 컴파일 과정에서 코드를 조작하는 플러그인과 충돌이 발생할 가능성이 높다.
컴파일 시점에 .java가 .class로 변하는 과정에서 AspectJ의 컴파일러가 관여해 부가 기능 로직을 추가할 수 있다.
컴파일 시점에 .java가 .class로 변하는 과정에서 AspectJ의 컴파일러가 관여해 부가 기능 로직을 추가할 수 있다.
PCW(Post Compile Weaving)
•
컴파일 직후에 위빙
•
컴파일 된 바이너리 코드 , JAR에 포함된 소스에 위빙하는 목적
LTW(Load Time Weaving)
•
JVM에 클래스가 로드되는 시점에 위빙
•
컴파일 시간은 가장 짧다.
•
오브젝트가 메모리에 올라가는 과정에서 위빙 발생 → 런타임시 위빙 시간은 상대적으로 느리다.
.class 파일을 JVM에 저장하기 전에 코드를 수정해서 부가 기능을 적용한다.
•
Compile Time
◦
CTW < PCW < LTW
•
Runtime
◦
LTW < PCW < CTW
Joinpoint
•
어드바이스가 적용될 수 있는 위치, 메소드 실행, 생성자 호출, 필드 값 접근 같은 AOP를 적용할 수 있는 모든 지점
•
스프링 AOP는 런타임 시점에 AOP를 적용하므로 사용하므로 조인 포인트는 항상 메소드 실행 지점으로 제한된다.
차이점
프레임 워크
•
애플리케이션에 스프링 프레임워크을 적용하지 않았을 경우, Spring AOP는 스프링 컨테이너의 범위 밖에 있는 모든 것들을 관리할수 없기 때문에 사용할수 없다.
•
스프링 프레임워크를 사용하는 애플리케이션이라면, Spring AOP를 쉽게 배울수 있고 적용할수 있기 때문에 사용하기에 좋다.
유연성
•
제한된 조인포인트 지원을 감안한다면 Spring AOP는 완전한 AOP 솔루션은 아니지만 프로그래머가 직면하는 가장 일반적인 문제를 해결해줍니다.
•
AOP를 최대한 활용하고 다양한 조인포인트를 원할 경우 AspectJ를 선택
성능
•
제한된 Aspect를 사용하는 경우 사소한 성능 차이
•
응용 프로그램에 수만개 이상의 ASPECT를 사용하고 있는 경우 런타임 위빙을 사용하는 것보다는 AspectJ를 사용하는 것이 더 좋다.
•
AspectJ는 Spring AOP보다 8~35배 빠른것으로 알려져 있다.
지원되지 않는 조인포인트에서는 ApectJ를 활용하자.