2023. 5. 3. 10:21ㆍSpring Framework/Aspect Oriented Programming with Spring
Instrumentation API와 AspectJ는 서로 독립적인 기술이지만, AspectJ가 AOP(Aspect-Oriented Programming) 기능을 제공하는 데 있어 Instrumentation API를 활용할 수 있는 상황이 존재합니다. 그러나 Instrumentation API는 AOP 기능을 위해 반드시 AspectJ와 협력해야 하는 것은 아닙니다. 이 둘은 각각 다른 목적과 기능을 가지고 있으며, 특정 상황에서 협력할 수 있다는 것이 더 정확한 설명입니다.
독립적인 역할
- Instrumentation API:
- 주된 역할: 클래스 파일을 로드하거나 이미 로드된 클래스의 바이트코드를 런타임에 변경하는 것. AOP는 Instrumentation API의 핵심 기능이 아니며, 이 API는 성능 모니터링, 코드 커버리지, 런타임 클래스 변환 등 다양한 용도로 사용됩니다.
- AspectJ:
- 주된 역할: AOP 구현을 위한 프레임워크. AspectJ는 메소드 실행 전후 또는 특정 조건에서 코드(Advice)를 삽입하여 횡단 관심사를 관리합니다. AspectJ는 컴파일 타임, 로드 타임, 런타임에 AOP를 적용할 수 있습니다.
AspectJ와 Instrumentation API의 관계
AspectJ는 Load-Time Weaving (LTW) 기능을 구현할 때 Instrumentation API를 사용합니다. 이 API는 Java 에이전트를 통해 클래스를 로드할 때 바이트코드를 수정하는 기능을 제공하며, AspectJ는 이를 활용하여 AOP(Aspect-Oriented Programming) 기능을 런타임에 동적으로 적용할 수 있습니다.
- Load-Time Weaving (LTW):
- AspectJ의 LTW 기능은 클래스가 JVM에 로드될 때, 정의된 포인트컷(Pointcut)과 어드바이스(Advice)에 따라 클래스를 동적으로 위빙(Weaving)하는 방식입니다.
- 이 기능을 활성화하기 위해, AspectJ는 Instrumentation API를 사용하여 클래스 파일이 JVM에 로드되기 전이나 로드 중에 바이트코드를 변환합니다.
- 이를 위해, Java 에이전트를 사용하는데, 이 에이전트가 JVM 시작 시 Instrumentation API를 통해 클래스 로딩 프로세스에 개입하게 됩니다.
- Java 에이전트와 -javaagent 옵션:
- AspectJ LTW를 사용하려면,
-javaagent
옵션을 통해 AspectJ 에이전트를 JVM에 등록해야 합니다. 이 에이전트는 Instrumentation API를 사용하여 모든 클래스 로딩 시점에 바이트코드를 수정합니다. - 예를 들어, 다음과 같이 JVM을 시작할 때
-javaagent
옵션을 추가할 수 있습니다:java -javaagent:/path/to/aspectjweaver.jar -jar myapp.jar
- 이렇게 하면 AspectJ가 Instrumentation API를 통해 클래스 로딩 과정에 개입하여 필요한 AOP 기능을 동적으로 적용합니다.
- AspectJ LTW를 사용하려면,
Instrumentation API는 자체적으로 AOP 기능을 제공하는 것은 아니며, AspectJ와 협력하여 AOP를 구현할 필요도 없습니다. 다만, 특정 시나리오(예: 로드 타임 위빙)에서는 AspectJ가 런타임에 AOP를 적용하기 위해 Instrumentation API를 사용할 수 있습니다. 따라서, Instrumentation API와 AspectJ는 필요에 따라 협력할 수 있지만, 둘 다 독립적으로 기능하며, 서로에게 의존적이지 않습니다.
따라서, AspectJ는 Instrumentation API를 사용하여 LTW 기능을 구현합니다. 이 API를 통해 AspectJ는 런타임에 클래스 파일을 조작하여 AOP 기능을 적용할 수 있으며, 이는 특히 애플리케이션이 실행 중일 때 동적으로 AOP를 적용해야 하는 상황에서 매우 유용합니다.
'Spring Framework > Aspect Oriented Programming with Spring' 카테고리의 다른 글
DelegatingIntroductionInterceptor의 delegate 객체 생성 (0) | 2023.05.19 |
---|---|
Java Agent (0) | 2023.05.17 |
AOP Concepts, Spring AOP Capabilities and Goals, AOP Proxies (0) | 2023.05.16 |
Java Instrumentation API (0) | 2023.05.16 |
AOP Alliance (Java/J2EE AOP standards) (0) | 2023.05.10 |