Instrumentation API vs AspectJ

2023. 5. 3. 10:21Spring Framework/Spring AOP

Instrumentation API와 AspectJ는 서로 독립적인 기술이지만, AspectJ가 AOP(Aspect-Oriented Programming) 기능을 제공하는 데 있어 Instrumentation API를 활용할 수 있는 상황이 존재합니다. 그러나 Instrumentation API는 AOP 기능을 위해 반드시 AspectJ와 협력해야 하는 것은 아닙니다. 이 둘은 각각 다른 목적과 기능을 가지고 있으며, 특정 상황에서 협력할 수 있다는 것이 더 정확한 설명입니다.

독립적인 역할

  1. Instrumentation API:
    • 주된 역할: 클래스 파일을 로드하거나 이미 로드된 클래스의 바이트코드를 런타임에 변경하는 것. AOP는 Instrumentation API의 핵심 기능이 아니며, 이 API는 성능 모니터링, 코드 커버리지, 런타임 클래스 변환 등 다양한 용도로 사용됩니다.
  2. AspectJ:
    • 주된 역할: AOP 구현을 위한 프레임워크. AspectJ는 메소드 실행 전후 또는 특정 조건에서 코드(Advice)를 삽입하여 횡단 관심사를 관리합니다. AspectJ는 컴파일 타임, 로드 타임, 런타임에 AOP를 적용할 수 있습니다.

AspectJ와 Instrumentation API의 관계

AspectJLoad-Time Weaving (LTW) 기능을 구현할 때 Instrumentation API를 사용합니다. 이 API는 Java 에이전트를 통해 클래스를 로드할 때 바이트코드를 수정하는 기능을 제공하며, AspectJ는 이를 활용하여 AOP(Aspect-Oriented Programming) 기능을 런타임에 동적으로 적용할 수 있습니다.

  1. Load-Time Weaving (LTW):
    • AspectJ의 LTW 기능은 클래스가 JVM에 로드될 때, 정의된 포인트컷(Pointcut)과 어드바이스(Advice)에 따라 클래스를 동적으로 위빙(Weaving)하는 방식입니다.
    • 이 기능을 활성화하기 위해, AspectJ는 Instrumentation API를 사용하여 클래스 파일이 JVM에 로드되기 전이나 로드 중에 바이트코드를 변환합니다.
    • 이를 위해, Java 에이전트를 사용하는데, 이 에이전트가 JVM 시작 시 Instrumentation API를 통해 클래스 로딩 프로세스에 개입하게 됩니다.
  2. Java 에이전트와 -javaagent 옵션:
    • AspectJ LTW를 사용하려면, -javaagent 옵션을 통해 AspectJ 에이전트를 JVM에 등록해야 합니다. 이 에이전트는 Instrumentation API를 사용하여 모든 클래스 로딩 시점에 바이트코드를 수정합니다.
    • 예를 들어, 다음과 같이 JVM을 시작할 때 -javaagent 옵션을 추가할 수 있습니다:
      java -javaagent:/path/to/aspectjweaver.jar -jar myapp.jar
    • 이렇게 하면 AspectJ가 Instrumentation API를 통해 클래스 로딩 과정에 개입하여 필요한 AOP 기능을 동적으로 적용합니다.

Instrumentation API는 자체적으로 AOP 기능을 제공하는 것은 아니며, AspectJ와 협력하여 AOP를 구현할 필요도 없습니다. 다만, 특정 시나리오(예: 로드 타임 위빙)에서는 AspectJ가 런타임에 AOP를 적용하기 위해 Instrumentation API를 사용할 수 있습니다. 따라서, Instrumentation API와 AspectJ는 필요에 따라 협력할 수 있지만, 둘 다 독립적으로 기능하며, 서로에게 의존적이지 않습니다.
따라서, AspectJ는 Instrumentation API를 사용하여 LTW 기능을 구현합니다. 이 API를 통해 AspectJ는 런타임에 클래스 파일을 조작하여 AOP 기능을 적용할 수 있으며, 이는 특히 애플리케이션이 실행 중일 때 동적으로 AOP를 적용해야 하는 상황에서 매우 유용합니다.