본문 바로가기

프로그래밍/Java

Dynamic Proxy직접 구현해보기-1

반응형

프록시, 다이나믹 프록시는 접근을 제어하기 위함인가? 기능을 확장하기 위함인가?? 사실 둘다 아닌가?? 아니, 애초에 기능을 확장하기 위해 프록시를 써도, 자동적으로 접근을 제어하게된다.

먼저 내가 직접 프록시를 구현해보자.

아래의 코드는 User라는 클래스를 직접 생성, 정보를 출력하는 Client 코드와 User클래스이다.

public class ProxyClient {

    public static void main(String[] args) {
        User user = new User();
        user.useSomething();
    }

}
public class User {
    public void useSomething() {
        System.out.println("use something");
    }
}

실행결과

ProxyClient를 수행한 결과다.

이때, User가 useSomething을 하기 전과 후에 특정 작업들이 추가적으로 수행되어야 한다고 하자.

이를 User클래스에 useSomething()을 수정하지 말고, 프록시로 구현해보자.

public class ProxyClient {

    public static void main(String[] args) {
        User user = new UserProxy();
        user.useSomething();
    }

}
public interface User {

    public void useSomething();

}
public class TargetUser implements User {

    @Override
    public void useSomething() {
        // TODO Auto-generated method stub
        System.out.println("use something");
    }

}
public class UserProxy implements User{
    private User targetUser;

    public UserProxy() {
        this.targetUser = new TargetUser();
    }
    public void useSomething() {
        System.out.println("pre workout");
        targetUser.useSomething();
        System.out.println("post relax");
    }
}

프록시객체는 원본객체의 메소드와 같은 메소드를 선언함으로써 클라이언트의 코드수정을 막고, 실제 수행되야하는 targetUser.useSomething() 메소드의 전후로 추가되야하는 작업을 수행함으로써, 원본객체의 수정없이 프록시객체가 이를 대리하여 수행할 수 있다.

실행결과

프록시객체가 완벽히 제 기능을 수행하는것을 볼수 있다. 그러나 불편한 점들이 눈에 보인다.

  • 우선 프록시 기능을 수행하기 위해 기존 클래스를 추상화 해야하고,
  • 기존 클래스를 필드맴버로 선언하는 프록시 클래스도 만들어야 한다.
  • 또, 클라이언트에서 직접 User타입의 객체를 생성하고 있으므로, 생성하는 부분의 코드도 약간 수정이 필요하다.

이런 작업이 1~2번만 있을것이란 보장은 없다. 즉, 대상(n)이 늘어날수록 단순하게 위에 나열한 작업들만 한다고 해도, 3n의 작업량이 생긴...다...

그래서 이런 불편함을 해소하고자 JDK에서 DynamicProxy를 만들었다. 다음 포스팅에서는 DynamicProxy를 직.접. 구현해보도록 하자. DynamicProxy에 대한 설명은 이전 포스팅에서 한적있으므로 스킵한다.

반응형

'프로그래밍 > Java' 카테고리의 다른 글

Java GC 1차개정본  (0) 2022.06.25
Dynamic Proxy 직접 구현해보기-2  (0) 2021.08.10
Comparator의 동작방식  (0) 2021.07.27
Comparator VS Comparable  (0) 2021.07.26
정적 언어와 동적언어 그리고 덕 타이핑  (0) 2021.07.22