본문 바로가기
스터디/헤드퍼스트 디자인패턴

[헤드퍼스트 디자인패턴] 10. 프록시 패턴 (Proxy pattern)

by 디토20 2022. 8. 21.
반응형

 

 

 

[헤드퍼스트 디자인패턴] 10. 프록시 패턴 (Proxy pattern)

 

1. 프록시 패턴이란?

특정 객체로의 접근을 제어하는 대리인을 제공한다. 프록시 패턴을 사용하면 원격 객체나 생성하기 힘든 객체, 보안이 중요한 객체와 같은 다른 객체로의 접근을 제어하는 대리인 객체를 만들 수 있다.

 

 

2. 프록시에서 접근을 제어하는 몇가지 방법

  • 원격 프록시를 써서 원격 객체로의 접근을 제어할 수 있다.
  • 가상 프록시(virtual proxy)를 써서 생성하기 힘든 자원으로의 접근을 제어할 수 있다.
  • 보호 프록시(protection proxy)를 써서 접근 권한이 필요한 자원으로의 접근을 제어할 수 있다.

 

 

3. 프록시 패턴의 클래스 다이어그램

 

  • RealSubject : 진짜 작업을 처리하는 객체
  • Proxy : RealSubject의 레퍼런스가 들어있어서, 진짜 객체가 필요할 경우 레퍼런스를 사용해 요청을 전달. Proxy에서 RealSubject의 인스턴스를 생성하거나, 그 객체의 생성 과정에 관여하는 경우가 많다.
  • Subject : RealSubject와 Proxy 모두 Subject 인터페이스를 구현하므로써 형태를 동일하게 맞출 수 있다.

 

 

4. 원격 프록시와 가상 프록시

원격 프록시
  • 다른 JVM에 들어있는 객체의 대리인에 해당하는 로컬 객체
  • 프록시의 메소드를 호출하면 그 호출이 네트워크로 전달되어 원격 객체의 메소드가 호출
  • 그 결과는 프록시를 거쳐서 클라이언트에게 전달

 

가상 프록시
  • 생성하는데 비용이 많이 드는 객체를 대신한다.
  • 진짜 객체가 필요한 상황이 오기 전까지 객체의 생성을 미루는 기능을 제공한다.
  • 객체 생성이 끝나면 RealSubject에 직접 요청을 전달한다.

 

ex) CD 커버 뷰어

- CD 커버를 보여주는 뷰어를 만들 때, 네트워크 상태와 연결 속도에 따라 이미지를 가져오는데 시간이 걸릴 수 있으므로 기다리는 동안 화면에 다른 것을 보여주고, 전체 어플리케이션이 멈추지 않도록 하는 가상 프록시 만들기

class ImageProxy implements Icon {
    ImageIcon imageIcon;
    URL imageURL;
    Thread retrievalThread;
    boolean retrieving = false;
    
    public ImageProxy(URL url) { imageURL = url; }
    

    //이미지 로딩 전까지 기본 너비, 높이를 리턴
    public int getIconWidth() {
        if (imageIcon != null) {
            return imageIcon.getIconWidth();
        } else {
            return 800;
        }
    }
   
    public int getIconHeight() {
        if (imageIcon != null) {
            return imageIcon.getIconHeight();
        } else {
            return 600;
        }
    }
     
    //이미지 아이콘 객체가 없다면 이미지를 가져오고
    //간단한 메시지를 출력해줌
    public void paintIcon(final Component c, Graphics  g, int x,  int y) {
        if (imageIcon != null) {
            imageIcon.paintIcon(c, g, x, y);
        } else {
            g.drawString("Loading CD cover, please wait...", x+300, y+190);
            if (!retrieving) {
                retrieving = true;

                retrievalThread = new Thread(new Runnable() {
                    public void run() {
                        try {
                            imageIcon = new ImageIcon(imageURL, "CD Cover");
                            //이미지가 완전히 로딩되어야 생성자에서 객체 리턴해줌
                            c.repaint();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
                retrievalThread.start();
            }
        }
   }
}

 

 

보호 프록시
  • 접근 권한을 바탕으로 객체로의 접근을 제어하는 프록시
  • java.lang.reflect 패키지에 프록시 기능이 내장되어있음
728x90
반응형

댓글