티스토리 뷰
반응형
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
반응형
'JAVA' 카테고리의 다른 글
Spring Boot jar에서 war로 변경 (0) | 2017.11.15 |
---|---|
자바 백앤드에서 canvas의 data URL 저장하기 (3) | 2017.05.29 |
Java Method Timeout - 자바 메서드 타임아웃 만들기 예제 (0) | 2016.09.21 |
한글-영어-특수문자 순 정렬하는 java compare 메서드 만들기 (3) | 2016.04.17 |
[JAVA:reflection] 자바 프록시로 문제 해결하기! (0) | 2015.10.26 |
댓글
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- AWSKRUG
- 한달살기
- 실수노트
- html
- ES6
- 컨테이너
- spring
- AWS
- Clean code
- Bali
- S68
- container
- 개발자
- ChatGPT
- springboot
- ecma6
- 웹을 지탱하는 기술
- 발리
- javascript
- 객체지향
- spring boot
- hands-on
- 웹
- 회고
- sanur
- Docker
- 독후감
- 사누르
- rest
- 도커
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함