///////
Search
🍏

(Spring AOP와 비교하여) AspectJ의 도입 시점은 어느 시점이 될까요? 본인 만의 생각을 알려주세요.

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를 활용하자.