Spring

[Spring] AOP의 Weaving 방식

재담 2022. 2. 16. 23:05

Advice를 Weaving 하는 방식

  • 컴파일 시에 Weaving
  • 클래스 로딩 시에 Weaving
  • 런타임 시에 Weaving

 

컴파일 시에 Weaving

컴파일 시에 코드를 삽입하는 방법은 AspectJ에서 사용하는 방식이다. 핵심 로직을 구현한 코드를 컴파일할 때, 알맞은 위치에 공통 코드를 삽입하면, 컴파일 결과 AOP가 적용된 클래스 파일이 생성된다. 이 방식에서는 AOP를 도와주는 컴파일러나 IDE를 함께 제공한다.

 

클래스 로딩 시에 Weaving

AOP 라이브러리는 JVM이 클래스를 로딩할 때 클래스 정보를 변경할 수 있는 에이전트를 제공한다. 이 에이전트는 로딩한 클래스의 바이너리 정보를 변경하여 알맞은 위치에 공통 코드를 삽입한 새로운 클래스 바이너리 코드를 사용하도록 한다. 즉 원본 클래스 파일은 변경하지 않고 클래스를 로딩할 때에 JVM이 변경된 바이트 코드를 사용하도록 함으로써 AOP를 적용한다.

 

런타임 시에 Weaving

런타임 시에 AOP를 적용할 때는 소스 코드나 클래스 정보 자체를 변경하지 않고 프록시를 이용하여 AOP를 적용한다. 핵심 로직을 구현한 객체에 직접 접근하는 것이 아니라 중간에 프록시를 생성하여 프록시를 통해서 핵심 로직을 구현한 객체에 접근한다. 이때 프록시는 핵심 로직을 실행하기 전 또는 후에 공통 기능을 적용하는 방식으로 AOP를 구현한다. 프록시 기반에서는 메서드가 호출될 때에만 Advice를 적용할 수 있기 때문에 필드 값 변경과 같은 Joinpoint에 대해서는 적용할 수 없는 한계가 있다.

 


Reference

  • 웹 개발자를 위한 Spring 4.0 프로그래밍 (최범균 저)