Spring boot는 왜 cglib를 선택했을까?

제목 그대로 Spring boot는 왜 cglib를 선택했을지 고민해보자. 내가 고민할건 아니고.. 살짝 제목의 오해가 있을 수 있으니 좀 더 자세히 말해보자. Spring은 기본적으로 aop 메커니즘은 두가지가 있다. 하나는 jdk 동적 프록시와 다른 하나는 cglib 이용한 프록시이다. 자세한 것은 예전에 포스팅한 부분이 있으니 참고하면 되겠다. 참고 : http://wonwoo.ml/index.php/post/1576 두개의 차이점을 알았으니 (참고에서..) 좀 더 자세히 살펴보도록 하자. Spring boot 는 기본적으로 transaction 대상의 aop를 동작시킬 프록시를 cglib 프록시를 사용하게 설정 해놨다… Read More

Spring aop Proxy

오늘 알아볼 내용은 Spring 에서 사용하는 aop 프록시 원리에 대해서 살펴보도록 하자. 기본적으로 Spring에서 aop의 프록시 매커니즘은 두가지를 이용한다. 하나는 JDK 동적 프록시와 다른 하나는 Cglib 프록시를 사용하고 있다. JDK 동적 프록시 경우에는 java의 리플렉션을 이용해서 객체를 만드는데 Cglib 경우에는 바이트코드를 조작해 프록시 객체를 만든다. 스프링으로 개발하다보면 인터페이스 한개당 구현체도 한개의 경우가 많이 있다. 예전에는 인터페이스를 구현하지 않으면 aop가 동작하지 않는다고하여(물론 이 이유만은 아니다.) 인터페이스 한개 당 구현체도 한개 존재하는.. Read More

spring @Transactional aop 구현해보기

말이 거창하지 실제 Transactional 을 구현하는건 아니다. @Transactional 대충 어떻게 동작하는지 알아보기 위해 aop 를 구현하는 것이다. 실질적으로 Transactional을 구현하는건 아니다. Transaction이라는 어노테이션이 달린 메서드는 aop 를 동작한다고 해보겠다. @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @Inherited @Documented public @interface Transaction { } 그리고나서 AOP 동작을 위해 MethodInterceptor 구현해야된다. 실제 여기서 트랜잭션 시작과 끝을 구현하면된다. public class TransactionInterceptor implements MethodInterceptor { @Override public Object invoke(MethodInvocation invocation) throws Throwable { System.out.println(“Transaction start”); Object proceed = invocation.proceed();.. Read More