Note-Taking / / 2024. 9. 3. 13:51

Instrumentation API 정리

AspectJ도 Instrumentation API를 사용한다...

Instrumentation API 주요 기능

  1. ClassFileTransformer:
    • ClassFileTransformer는 클래스가 로드되기 전에 바이트코드를 변환할 수 있는 인터페이스입니다. 이를 통해 클래스 파일을 로드하거나 정의하는 과정에서 코드를 삽입하거나 수정할 수 있습니다.
    • 예를 들어, 메소드 호출 전후에 로그를 기록하는 기능을 추가하거나, 메소드 실행 시간을 측정하는 코드를 삽입할 수 있습니다.
  2. Java Agent:
    • Instrumentation API를 사용하는 주요 방법 중 하나는 Java 에이전트를 사용하는 것입니다. 에이전트는 JVM이 시작될 때 클래스 로더에 ClassFileTransformer를 등록하여, 모든 클래스가 로드되기 전에 바이트코드를 변경할 수 있습니다.
    • 에이전트는 JVM 시작 시에 -javaagent 옵션을 통해 지정되며, 런타임에 클래스를 조작하는 데 사용됩니다.
  3. Retransformation:
    • Instrumentation API는 이미 로드된 클래스를 다시 변환(retransform)할 수 있는 기능도 제공합니다. 이 기능은 클래스가 이미 JVM에 의해 로드된 후에도 바이트코드를 수정할 수 있게 합니다.
  4. Redefinition:
    • RedefineClasses 메소드를 사용하여, JVM에서 실행 중인 클래스의 정의를 새롭게 바꿀 수 있습니다. 이 기능을 사용하면 기존 클래스의 메소드나 필드의 바이트코드를 새롭게 정의할 수 있습니다.

 

프로파일링 및 성능 모니터링을 할 때 중요하다!!(많이씀)

premain을 구현해야 instrumentation api를 사용 할 수 있다.

ClassFIleTransforemer를 구현해야 바이트코드 조작을 할 수 가 있다.

 

ASM : CGRIB에서 바이트코드 조작을 할 때 쓰인다.

instrumentation api 자체로는 바이트코드 조작을 사용 할 수 없다. 그래서 ASM이 필요하다.

 

Java Agent

  • java -javaagent:/path/to/agent.jar -jar myapp.jar
  • 이 옵션은 JVM이 시작될 때 지정된 JAR 파일을 Java Agent로 인식하고, 해당 에이전트의 premain 메서드를 호출합니다.

jar파일 디렉토리안에 메타인포데이터가 없어도 된다. com.example.preamin 이런거 <

 

jar파일을 만들어야 한다.

 

AspectJ가 Java Agent에 포함되어 있기 때문에 instrumentation api를 사용하는것이다.

 

클래스로드타임(런타임) : 런타임때 크로스커팅컨선에 집어 넣는것을 위빙이라고함.

 

Load Time Weaving : 프록시를 생성하지 않고 바로 바이트코드에 때려박는다.

 

Java Agent는 premain과 연관이 깊다.

 

appilcation based configuration metadata

 

우리의 비지니스 로직에 타겟이 되는 애들을 Domain이라고 한다.

 

@Configurable : Spring IoC에 의해 관리되는 빈이 아님!!!

-> 이 어노테이션만을 가지고는 아무런 동작을 하지않는다.

-> 이 어노테이션만 써서는 Spring IoC에 의해 관리가 안된다!!!

-> 이 어노테이션을 쓰고 Java Agent를 명시하고 하면은 주입이 된다.

 

만약에 

@Autowired 

MyService myService;     // MyService는 SpringIoC에 의해 관리되는 빈임.

 

Streo Type은 Spring IoC에 의해 관리가 된다. // @Component, @Service, @Repository, @Controller

 

 

 

 

 

 

  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유