티스토리 뷰

반응형

AOP 구현 방법 비교

java에서 AOP를 구현하는데는 세가지의 방법이 있다. java proxy, cglib, aspectJ이다. 이번 포스팅에서는 세가지를 간단하게 비교해보고 개인적인 경험을 적어 두려고 한다.


Java proxy (InvocationHandler)

  • 런타임시에 Target method가 호출될 때 Advice(프록시 할 기능)을 적용
  • JDK Proxy는 인터페이스에 대한 Proxy만을 지원


Cglib (MethodInterceptor)

  • java proxy와 동일하게 런타임시에 Advice 적용
  • 메써드가 처음 호출 되었을때 동적으로 bytecode를 생성하여 이후 호출에서는 재사용
  • 클래스에 대한 Proxy가 가능


AspectJ

  • Runtime이 아닌 Compile 시점에 Aspect를 적용


참고 1

클래스에 Advice를 적용하고 싶다면 cglib 사용


참고 2

generic을 활용해서 범용적인 프록시를 만들때 참고 사항

public static <T> T getJAVAProxy (T t, MyOption option) {
    return (T) Proxy.newProxyInstance(
            t.getClass().getClassLoader(),
            t.getClass().getInterfaces(),
            new MyInvocationHandler<T>(t, option));
}

public static <T> T getCGLIBProxy(T service, MyOption option) {
    Enhancer enhancer = new Enhancer();
    enhancer.setSuperclass(service.getClass());
    enhancer.setCallback(new MyMethodInterceptor(service, option));
    return (T)enhancer.create();
}

자바 프록시의 경우에는 객체를 새로 생성하는 것이 아니고 파라미터로 받은 객체를 래핑해서 재사용한다. 그런데 cglib는 create라는 메서드로 객체 생성자를 한번 실행한다. 그래서 만약 생성자에 파라미터가 있는 경우에는 아래 메서드를 사용해야 한다.

java.lang.Object create(java.lang.Class[] argumentTypes, 
    java.lang.Object[] arguments);

내가 만든 프록시의 경우에는 그냥 이미 생성된 객체를 재사용 해야하는 경우이기 때문에 CGLIB프록시를 사용할 경우에는 그냥 기본 생성자가 있는 서비스 객체만 하도록 규칙을 정했다.
만약 생성자의 파라미터가 있다면 인터페이스를 만들고 자바프록시를 사용했다.


참고3

CGLIB로 프록시를 할 경우에 private 메서드는 advice를 적용불가


관련 링크

http://reimaginer.tistory.com/41

http://wiki.javajigi.net/pages/viewpage.action?pageId=1065

http://javacan.tistory.com/entry/114

반응형
댓글
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/03   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31
글 보관함