///////
Search
🌱

Spring AOP는 어떻게 동작할까요? (프록시는 언제 생성되고 요청은 어떻게 잡아내나요?)

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 : 호출된 메서드의 매개변수
다이내믹 프록시로부터 요청을 받으면 invoke() 메서드가 자동 실행되고 매개변수에 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 할 때 사용됨