https://sundaland.tistory.com/65
[ ▶ Instrumentation API vs AspectJ ]
Instrumentation API와 AspectJ는 서로 독립적인 기술이지만, AspectJ가 AOP 기능을 제공하는데 있어 Instrumentation API를 활용할 수 있는 상황이 존재한다. 그러나 Instrumentation API는 AOP 기능을 위해서 반드시 AspectJ와 협력해야 하는 것이 아니다. 이 둘은 각각 다른 목적과 기능을 가지고 있으며, 특정 상황에서 협력할 수 있다는 것이 더 정확한 설명이다.
[ ▷ 독립적인 역할 ]
Instrumentation API
- 주된 역할: 클래스 파일을 로드하거나 이미 로드된 클래스의 바이트코드를 런타임에 변경하는 것, AOP는 Instrumentation API의 핵심 기능이 아니며, 이 API는 성능 모니터링, 코드 커버리지, 런타임 클래스 변환 등 다양한 용도로 사용된다.
AspectJ
- 주된 역할: AOP 구현을 위한 프레임워크. AspectJ는 메서드 실행 전후 또는 특정 조건에서 코드 (어드바이스)를 삽입하여 횡단 관심사를 관리한다. AspectJ는 컴파일 타임, 로드 타임, 런타임에 AOP를 적용할 수 있다.
[ ▷ AspectJ와 Instrumentation API의 관계 ]
AspectJ는 Load-Time Weaving (LTW) 기능을 구현할 때 Instrumentation API를 사용한다. 이 API는 자바 에이전트를 통해 클래스를 로드할 때 바이트코드를 수정하는 기능을 제공하며, AspectJ는 이를 활용하여 AOP (Aspect-Oriented Programming) 기능을 런타임에 동적으로 적용할 수 있다.
1. Load-Time Weaving (LTW)
- AspectJ의 LTW 기능은 클래스가 JVM에 로드될 때, 정의된 포인트컷과 어드바이스에 따라 클래스를 동적으로 위빙하는 방식이다.
- 이 기능을 활성화하기 위해, AspetJ는 Instrumentation API를 사용하여 클래스 파일이 JVM에 로드되기 전이나 로드 중에 바이트코드를 변환한다.
- 이를 위해 자바 에이전트를 사용하는데, 이 에이전트가 JVM 시작 시 Instrumentation API를 통해 클래스 로딩 프로세서에 개입하게 된다.
2. 자바 에이전트와 -javaagent 옵션
- AspetJ LTW를 사용하려면 -javaagent 옵션을 통해 AspectJ 에이전트를 JVM에 등록해야 한다. 이 에이전트는 Instrumentation API를 사용하여 모든 클래스 로딩 시점에 바이트코드를 수정한다.
- 예를 들어 다음과 같이 JVM을 시작할 때 -javaagent 옵션을 추가할 수 있다.
java -javaagent:/path/to/aspectjweaver.jar -jar myapp.jar
- 이렇게 하면 AspectJ가 Instrumentation API를 통해 클래스 로딩 과정에 개입하여 필요한 AOP 기능을 동적으로 적용한다.
Instrumentation API는 자체적으로 AOP 기능을 제공하는 것은 아니며, AspetJ와 협력하여 AOP를 구현할 필요도 없다. 다만 특정 시나리오 (예로들어 로드 타임 위빙)에서는 AspectJ가 런타임에 AOP를 적용하기 위해 Instrumentation API를 사용할 수 있다. 따라서 Instrumentation API와 AspectJ는 필요에 따라 협력할 수 있지만, 둘 다 독립적으로 가능하며, 서로에게 의존적이지 않다.
따라서 AspectJsms Instrumentation API를 사용하여 LTW 기능을 구현한다. 이 API를 통해 AspectJ는 런타임에 클래스 파일을 조작하여 AOP 기능을 적용할 수 있으며, 이는 특히 애플리케이션이 실행 중일 때 동적으로 AOP를 적용해야 하는 상황에서 매우 유용하다.
'스프링 AOP' 카테고리의 다른 글
Programmatic Creation of @AspectJ Proxies, Using AspectJ with Spring Applications (0) | 2024.09.04 |
---|---|
Spring instrument library (0) | 2024.09.04 |
Java Agent (1) | 2024.09.04 |
Java Instrument API vs ASM(Abstract Syntax Manipulation) (0) | 2024.09.03 |
Java Instrumentation API (0) | 2024.09.03 |