Proxy란


<aside> 1️⃣ Proxy란 무엇인가?

</aside>

<aside> 2️⃣ 상세 설명

</aside>

  1. JDK Dynamic 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");
        }
    }
    
  2. 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");
        }
    }
    

    프록시는 주로 AOP와 함께 사용되어 부가적인 동작을 수행하고, 핵심 비즈니스 로직과 분리된 형태로 개발할 수 있게 해준다. 예를 들어, 트랜잭션 관리, 보안 검사, 로깅 등의 기능을 프록시를 통해 쉽게 적용할 수 있다.

<aside> 3️⃣ 스프링이 가진 자동 프록시 생성기 (AnnotationAwareAspectJAutoProxyCreator)

</aside>

<aside> 4️⃣ 자동 프록시 생성기(AnnotationAwareAspectJAutoProxyCreator)의 역할과 동작

</aside>

<aside> 5️⃣ 자동 프록시 생성기(AnnotationAwareAspectJAutoProxyCreator)의 설정 예시

</aside>

@Configuration
@EnableAspectJAutoProxy
public class AppConfig {
    // Bean 정의 및 설정
}