<aside> 1️⃣ Proxy란 무엇인가?
</aside>
JDK Dynamic Proxy
와 CGLIB Proxy
.<aside> 2️⃣ 상세 설명
</aside>
JDK Dynamic Proxy
java.lang.reflect.Proxy
클래스와 인터페이스를 사용하여 프록시를 생성하는 방법이다. 이 방법은 인터페이스를 기반으로 프록시를 생성할 수 있다.public interface UserService {
void createUser(String username, String password);
void deleteUser(String username);
}
public class UserServiceImpl implements UserService {
public void createUser(String username, String password) {
// 사용자 생성 로직
}
public void deleteUser(String username) {
// 사용자 삭제 로직
}
}
public class UserServiceProxy implements InvocationHandler {
private Object target;
public UserServiceProxy(Object target) {
this.target = target;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
// 부가적인 동작 (예: 로깅, 트랜잭션 처리 등)을 수행할 수 있음
Object result = method.invoke(target, args);
// 부가적인 동작 (예: 로깅, 트랜잭션 처리 등)을 수행할 수 있음
return result;
}
}
public class Main {
public static void main(String[] args) {
UserService target = new UserServiceImpl();
UserService proxy = (UserService) Proxy.newProxyInstance(
target.getClass().getClassLoader(),
target.getClass().getInterfaces(),
new UserServiceProxy(target)
);
proxy.createUser("john", "password");
proxy.deleteUser("john");
}
}
UserServiceProxy
클래스는 InvocationHandler
인터페이스를 구현하여 프록시 객체를 생성하고, 부가적인 동작을 정의한다.
Proxy.newProxyInstance()
메서드를 사용하여 프록시 객체를 생성하고, 해당 객체를 사용하여 메서드 호출을 수행한다.CGLIB Proxy
public class UserService {
public void createUser(String username, String password) {
// 사용자 생성 로직
}
public void deleteUser(String username) {
// 사용자 삭제 로직
}
}
public class UserServiceProxy implements MethodInterceptor {
private Object target;
public UserServiceProxy(Object target) {
this.target = target;
}
public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
// 부가적인 동작 (예: 로깅, 트랜잭션 처리 등)을 수행할 수 있음
Object result = proxy.invokeSuper(obj, args);
// 부가적인 동작 (예: 로깅, 트랜잭션 처리 등)을 수행할 수 있음
return result;
}
}
public class Main {
public static void main(String[] args) {
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);
enhancer.setCallback(new UserServiceProxy());
UserService proxy = (UserService) enhancer.create();
proxy.createUser("john", "password");
proxy.deleteUser("john");
}
}
UserServiceProxy
클래스는 MethodInterceptor
인터페이스를 구현하여 프록시 객체를 생성하고, 부가적인 동작을 정의한다. Enhancer
클래스를 사용하여 프록시 객체를 생성하고, 해당 객체를 사용하여 메서드 호출을 수행한다.프록시는 주로 AOP와 함께 사용되어 부가적인 동작을 수행하고, 핵심 비즈니스 로직과 분리된 형태로 개발할 수 있게 해준다. 예를 들어, 트랜잭션 관리, 보안 검사, 로깅 등의 기능을 프록시를 통해 쉽게 적용할 수 있다.
<aside> 3️⃣ 스프링이 가진 자동 프록시 생성기 (AnnotationAwareAspectJAutoProxyCreator)
</aside>
AnnotationAwareAspectJAutoProxyCreator
**는 스프링 프레임워크에서 AOP(Aspect-Oriented Programming)을 구현하기 위해 사용되는 클래스이다.
이 클래스는 자동 프록시 생성을 담당하며, 어노테이션 기반의 AspectJ 프록시를 생성하는 데 사용된다.AnnotationAwareAspectJAutoProxyCreator
**는 스프링 컨테이너에서 빈(Bean)으로 등록되어 동작하며, AOP를 적용할 대상 빈 객체에 대해 프록시 객체를 생성한다.
이를 통해 AspectJ 기반의 AOP 기능을 자동으로 적용할 수 있다. 주로 @EnableAspectJAutoProxy
어노테이션과 함께 사용된다.<aside> 4️⃣ 자동 프록시 생성기(AnnotationAwareAspectJAutoProxyCreator)의 역할과 동작
</aside>
AnnotationAwareAspectJAutoProxyCreator
**의 역할과 동작은 다음과 같다.
@Aspect
, @Before
, @After
, @Around
등을 사용하여 AOP 관련 설정을 할 수 있으며, 이를 기반으로 프록시 객체를 생성한다.BeanPostProcessor
인터페이스를 구현하고 있다. 스프링 컨테이너에서 빈 객체의 초기화 전후 작업을 수행할 수 있다. AOP 프록시 생성은 빈 객체 초기화 후에 수행되므로, 프록시 생성을 위한 필요한 설정을 할 수 있다.@EnableAspectJAutoProxy
어노테이션과 함께 사용된다.
@EnableAspectJAutoProxy
어노테이션을 사용하면 자동으로 **AnnotationAwareAspectJAutoProxyCreator
**가 등록되고, 설정된 AspectJ 기반의 AOP가 자동으로 적용된다.<aside> 5️⃣ 자동 프록시 생성기(AnnotationAwareAspectJAutoProxyCreator)의 설정 예시
</aside>
@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
// Bean 정의 및 설정
}
@EnableAspectJAutoProxy
어노테이션을 사용하여 **AnnotationAwareAspectJAutoProxyCreator
**를 활성화한다. 이를 통해 AspectJ 기반의 AOP가 자동으로 적용되며, 필요한 설정은 어노테이션을 사용하여 작성할 수 있다.
**AnnotationAwareAspectJAutoProxyCreator
**는 스프링의 강력한 AOP 기능을 활용할 수 있도록 도와준다. 이를 통해 AspectJ 어노테이션과 프록시 생성 기능을 통합하여 어노테이션 기반의 AOP 설정을 간편하게 구현할 수 있다.