본문 바로가기

개발

@EnableAspectJAutoProxy 와 proxyTargetClass 속성


@EnableAspectJAutoProxy(proxyTargetClass = true)

spring aop 구현 방식 - 프록시 방식(정확하게 다이나믹 프록시)
    Spring AOP uses either JDK dynamic proxies or CGLIB to create the proxy for a given target object.
aspectJ aop 구현 방식 - BCI(Byte Code Instumentation)이란 Java의 Byte Code에 직접 수정

AspectJ의 @Aspect 어노테이션을 사용 가능하게 해준다.  XML로 표현되는 <aop:aspectj-autoproxy> 같은 역할을 한다. 사용하기 위해서는 @Configuration 클래스를 써야한다. 위에 어노테이션을 사용하면 bci 방식으로 aop가 진행되는게 아니라 프록시 방식으로 진행된다. 

spring 은 aop 를 구현하는데 있어서 proxy를 사용해서 aop를 구현한다!!!!

proxyTargetClass 에 대한 설명 
Indicate whether subclass-based (CGLIB) proxies are to be created as opposed to standard Java interface-based proxies. The default is false.

-> proxyTargetClass를 알기 전에, 스프링은 비지니스 로직에 접근할때 객체로 바로 접근하는게 아니라 프록시를 통해 간접적으로 접근한다. 프록시 객체를 생성하는 방식은 객체가 인터페이스를 구현하고 있냐 없냐에 따라 두가지로 나뉨.

인터페이스를 구현 : Jdk Dynamic Proxy  -  인터페이스로 구현해서 정의 되어 있지 않은 메서드는 aop 적용안됨. 
인터페이스를 구현 안함 : CGLIB  - 대상 클래스를 상속 받아 프록시를 구현해서, 클래스가 final인 경우 프록시 생성 불가.

proxyTargetClass 기본은 false, 인터페이스 - jdk dynamic proxy를 이용
true로 주면 인터페이스 - CGLIB으로 구현