AOP의 용어
Spring AOP
기본적으로 프록시 방식으로 동작한다.
→ 여기서 프록시 방식, 프록시 패턴은 어떤 객체를 사용하고자 할 때, 해당 객체의 대행(대리, proxy)객체를 통해 대상객체에 접근하는 방식
프록시 패턴
•
프록시가 멤버변수로 타깃 오브젝트를 가지고 있기 때문에 타깃오브젝트에 종속적
•
똑같은 기능을 수행하는 프록시라 하더라도, 여러 타깃에 적용하려면 타깃의 갯수만큼 프록시를 생성해야하고, 이때 프록시는 똑같은 기능을 수행하기 때문에 많은 코드 중복 발생
다이나믹 프록시
Reflection 기능을 이용해 런타임 시에 프록시를 동적으로 생성
Reflection 참고
•
분류
◦
Target Object가 인터페이스가 존재하는 경우 → JDK dynamic proxy
◦
Target Object가 인터페이스가 존재하지 않는 경우 → CGLIB
JDK dynamic proxy
•
java.lang.reflect의 InvocationHandler를 구현(invoke() 메서드 가진 인터페이스)
public Object invoke(Object proxy, Method method, Object[] args)
Java
복사
•
proxy : 자기 자신
•
method : 호출된 메서드
•
args : 호출된 메서드의 매개변수
CGLIB
•
JDK dynamic proxy와 달리 달리 바이트 코드를 조작해서 동적으로 클래스를 생성해주는 라이브러리
•
인터페이스 없이 구체 클래스만 존재하더라도 프록시 생성 가능
•
MethodInterceptor를 통해 구현
public interface MethodInterceptor extends Callback{
Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable;
}
Java
복사
•
obj : CGLIB가 적용된 객체
•
method : 호출된 메서드
•
args : 호출된 메서드의 매개변수
•
proxy : 실제 타깃의 메서드를 invoke 할 때 사용됨