티스토리 뷰

★ Design Pattern

디자인패턴 2) Proxy Pattern

유쾌한 개발자 anyjava 2014. 2. 10. 11:09

프록시 패턴 (Proxy Pattern)


1. 개요

Proxy의 사전적 의미는 대리, 대리권 이라는 뜻을 가지고 있다. 실제 사용하려는 객체를 대신해서 역할을 해주는 패턴이라고 이해하면 될 것이다. 주로 원래 객체의 접근제어를 목적으로 이용된다. 어떤 이유 때문에 proxy 패턴이라 불려지는지 알아 보도록 하자.

우리가 알아볼 패턴유형으로는 Virtual Proxy, Protection Proxy, Remote Proxy 등이 있다.

2. 클래스 다이어그램

Alt Text

  • Subject interface
    proxy 클래스와 RealSubject 클래스가 구현을 하는 인터페이스로 Client 에서는 이 인터페이스만 알고 있으므로 내부 동작은 어떻게 이뤄지는 지 모르게 된다.
  • Porxy class
    RealSubject 객체를 참조하고 있으며, 클라이언트로 부터 들어오는 메소드 호출에 대해서 적절한 행동을 취하게 된다. 비용이 많은 객체 생성, 보안관리, 리모트 콜 등의 작업들이 추가 되어진다.
  • RealSubject class
    실제 동작을 하는 클래스 이다.
  • Client class
    RealSubject 클래스를 사용하게 될 Client 클래스이며, 어떤 객체를 통해서 동작되는지는 client 쪽에서는 모른다.

3. Java로 구현한 패턴

  1. Virtual Proxies
/**
 * Subject Interface
 */
public interface Image {
    public void showImage();
}
/**
 * Proxy
 */
public class ImageProxy implements Image {
    /**
     * Private Proxy data
     */
    private String imageFilePath;
    /**
     * Reference to RealSubject
     */
    private Image proxifiedImage;


    public ImageProxy(String imageFilePath) {
        this.imageFilePath= imageFilePath;    
    }

    @Override
    public void showImage() {

        // create the Image Object only when the image is required to be shown

        proxifiedImage = new HighResolutionImage(imageFilePath);

        // now call showImage on realSubject
        proxifiedImage.showImage();

    }

}
/**
 * RealSubject
 */
public class HighResolutionImage implements Image {

    public HighResolutionImage(String imageFilePath) {

        loadImage(imageFilePath);
    }

    private void loadImage(String imageFilePath) {

        // load Image from disk into memory
        // this is heavy and costly operation
    }

    @Override
    public void showImage() {

        // Actual Image rendering logic

    }

}

4. 활용 분야

  1. Virtual Proxy
    객체 생성에 많은 비용이 발생하는경우, 실제사용할때 객체가 생성되도록 대리자를 두어 접근하도록 제어한다.

  2. Remote Proxy
    원격객체에 대한 로컬의 대리자 역활을 한다. Java RMI 를 통하거나 소켓통신을 통하여 원격객체에 데이터를 얻거나 메소드를 호출할 경우 대리자를 통하여 호출이 이루어진다.

  3. Protection Proxy
    접근제어가 필요한 객체에 대한 접근을 통제하고 Proxy 객체를 통해 접근가능한 정도만 노출시킬때 사용한다.

  4. Smart Reference
    실제객체에 접근할때 부가적인 기능을 수행하고자 할때 사용한다.

5. 마치며

위에서도 보았듯이 proxy 패턴을 구현하는 것은 어렵지 않을것으로 보여진다. Proxy 패턴을 이용했을때 어떤 이점이 있는지를 고민해보는게 좋을듯 하다. Spring AOP 에서 proxy패턴이 적용된다고 하니 Spring AOP에 대해 스터디 후 내용 추가나 예제 코드를 보강하겠다.



[참고사이트]

http://www.oodesign.com/proxy-pattern.html


[ 연재글 ]

- 디자인패턴 1) Singleton Pattern ( http://blog.anyjava.net/97 )

댓글
댓글쓰기 폼