[java] 자바 다이내믹 프록시와 스태틱 프록시의 차이

자바에서 프록시(Proxy)는 다이내믹 프록시와 스태틱 프록시로 나눌 수 있습니다. 두 가지 프록시의 주요한 차이점에 대해 설명하겠습니다.

다이내믹 프록시

다이내믹 프록시는 런타임 시에 인터페이스나 클래스를 동적으로 생성합니다. 보통 java.lang.reflect.Proxy 클래스를 사용하여 구현됩니다. 다이내믹 프록시는 런타임에 프록시 객체를 생성하므로 인터페이스의 메소드 호출은 동적으로 처리됩니다.

다이내믹 프록시는 실제 객체에 대한 호출을 중간에서 가로채어 추가적인 로직을 수행할 수 있습니다. 예를 들어, 메소드 호출 전후에 로깅을 추가하거나 권한 검사를 수행할 수 있습니다.

import java.lang.reflect.Proxy;
import java.lang.reflect.InvocationHandler;

public class DynamicProxyExample {
    public static void main(String[] args) {
      RealSubject realSubject = new RealSubject();
      InvocationHandler handler = new DynamicProxy(realSubject);
      Subject proxy = (Subject) Proxy.newProxyInstance(
        RealSubject.class.getClassLoader(),
        RealSubject.class.getInterfaces(),
        handler);
      proxy.doSomething();
    }
}

스태틱 프록시

스태틱 프록시는 컴파일 시에 이미 알려진 인터페이스나 클래스를 이용하여 프록시 객체를 생성합니다. 이때 실제 객체의 참조는 런타임 시에 바뀔 수 없습니다. 스태틱 프록시 클래스는 개발자가 직접 작성하여 프록시 객체를 정의합니다.

public interface Subject {
    void doSomething();
}

public class StaticProxy implements Subject {
    private RealSubject realSubject;

    public StaticProxy(RealSubject realSubject) {
        this.realSubject = realSubject;
    }

    @Override
    public void doSomething() {
        System.out.println("Before calling the method");
        realSubject.doSomething();
        System.out.println("After calling the method");
    }
}

결론

다이내믹 프록시와 스태틱 프록시의 가장 큰 차이는 런타임 시의 동작입니다. 다이내믹 프록시는 런타임 시에 프록시 객체를 생성하고 동적으로 메소드 호출을 처리하므로 더 유연한 기능을 제공합니다. 반면에 스태틱 프록시는 컴파일 시에 이미 알려진 대상에 대한 프록시를 생성하므로 더 빠르고 안정적인 성능을 제공합니다.

따라서, 필요에 따라 동적인 기능이 필요한 경우에는 다이내믹 프록시를 사용하고, 미리 정해진 작업을 처리하는 경우에는 스태틱 프록시를 사용하는 것이 좋습니다.

참고 문헌: