ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • AspectJ와 Spring AOP의 차이점 & Java Agent
    BackEnd/스프링 2024. 12. 1. 20:07

    AspectJ 의 동작 방식

    AspectJ는 두 가지 주요 방식으로 Weaving(바이트코드 수정)을 지원합니다.

    1. 컴파일 타임 Weaving(CTW): 컴파일 시 바이트코드를 수정.
    2. 로드 타임 Weaving(LTW): JVM이 클래스를 로드할 때 바이트코드를 수정.

    사용 예시 )

    영속성 객체인 DAO는 서비스에서 작업을 할 때, 즉 런타임에 는 동적으로 생성되는 POJO 객체이다.

    동적으로 생성되는 POJO 객체는 LTW 방식으로 AOP 를 적용할 수 있다.

     

    스프링 AOP 와 AspectJ LTW 의 차이

    Spring AOP는 기본적으로 프록시 기반 AOP를 사용하므로 -javaagent 설정이 필요 없습니다.

    하지만 Spring에서 AspectJ를 사용하여 로드 타임 Weaving을 활성화하려는 경우, -javaagent를 반드시 추가해야 합니다.

     

    Java Agent 란?

    애플리케이션 실행 시점에 클래스의 동작을 동적으로 변경하거나 확장할 수 있도록 해줍니다.

    Java 에이전트는 주로 바이트코드 조작이나 프로파일링, 모니터링 같은 작업을 수행하는 데 사용됩니다.

    즉,

    • JVM에 에이전트(agent)를 로드하도록 지시하는 명령줄 옵션입니다.
    • 에이전트는 애플리케이션 코드가 실행되기 전에 클래스 로더를 가로채거나, 이미 로드된 클래스를 조작할 수 있습니다.
    • 주로 로드타임 바이트코드 조작을 위해 사용됩니다.

    AspectJ에서 javaagnet 옵션이 필요한 이유

    AspectJ의 로드 타임 Weaving(LTW) 메커니즘 때문입니다.

    LTW는 JVM이 클래스를 로드할 때, AspectJ가 클래스의 바이트코드를 수정해 Aspect를 적용하는 방식입니다.

    이를 위해 AspectJ는 aspectjweaver.jar를 Java 에이전트로 등록해야 합니다.

    aspectjweaver.jar 역할

    • aspectjweaver.jar는 JVM 에이전트로 동작하며, 클래스 로더가 클래스를 로드할 때 바이트코드를 수정하는 역할을 수행합니다.
    • JVM의 -javaagent 옵션은 특정 JAR 파일을 에이전트로 등록하여, JVM의 동작을 변경하거나 확장할 수 있게 해줍니다.

    aop.xml의 동작

    • LTW를 사용할 때, AspectJ는 META-INF/aop.xml 파일에 정의된 설정을 기반으로 어떤 클래스에 어떤 Aspect를 적용할지 결정합니다.
    • aspectjweaver.jar가 에이전트로 등록되지 않으면 aop.xml이 무시되고, LTW가 동작하지 않습니다.

     

     

     

     

     

    반응형
Designed by Tistory.