위빙이란 AOP를 통해 관리하려는 부가기능(어드바이스)를 적용하는 것을 말한다.
적용하는 시점에 따라 Compile time weaving, Load time weaving, Runtime waving 3가지로 나뉜다.
컴파일 타임 위빙은 .java 코드를 .class코드로 컴파일 할 때 부가기능 코드를 비즈니스 코드 부분에 추가하여 컴파일하는 것이다. .class파일을 디컴파일 해보면 부가기능 코드가 실제 파일에 들어가 있다.
컴파일 타임 위빙을 하려면 전용 컴파일러가 필요하다.
로드 타임 위빙은 .class파일이 클래스 로더에 올라가는 시점에 부가기능 코드를 비즈니스 코드 부분에 추가하는 것을 말한다.
로드 타임 위빙은 클래스 로더를 조작할 수 있어야하는데 기술 적인 어려움이 있다.
런타임 위빙은 일반적으로 스프링에서 사용하는 방식으로 Bean객체를 Proxy해서 비즈니스 코드를 사용할 때 부가기능을 추가해서 사용 하는 것을 말한다.
Compile time과 Load time을 사용하려면 Spring에서 제공하는 AOP말고 AspectJ라는 프레임워크를 사용해야하며 실제로 비지니스 코드에 부가기능 코드를 추가하는 거여서 개발자가 직접 new를 사용해 객체화를 해도 부가기능을 사용할 수 있다.
Runtime에 적용하는 방법은 Spring에서 제공하는 AOP를 사용할 수 있고 Proxy로 작동하는 거여서 개발자가 직접 new를 사용해 객체화를 하면 부가기능을 사용할 수 없다.
한 줄평 : 실제로는 Runtime waving으로 거의 다 해결이 가능하다고 한다.