Home 구조패턴 - 프록시 패턴
Post
Cancel

구조패턴 - 프록시 패턴

Proxy Pattern

디자인 패턴이란?

디자인 패턴이란?

  • 디자인 패턴은 소프트웨어 공학의 소프트웨어 설계에서 공통으로 발생하는 문제를 자주 쓰이는 설계 방법을 정리한 패턴이다.
  • 디자인 패턴을 참고하여 개발하면 효율성과 유지보수성, 운용성이 높아지며, 프로그램 최적화가 된다고 한다.  

디자인 패턴을 목적과 범위로 나눌수 있다

구분유형설명
 생성객체 인스턴스 생성에 관여, 클래스 정의와 객체 생성 방식을 구조화, 캡슐화를 수행
목적구조더 큰 구조 형성 목적으로 클래스나 객체의 조합을 다루는 패턴
 행위클래스나 객체들이 상호작용하는 방법과 역할 분담을 다루는 패턴
범위클래스클래스간 관련성(상속), 컴파일 시 정적으로 결정
 객체객체 간 관련성을 다루는 패턴, 런타임 시 동적으로 결정

  

프록시 패턴이란?

구조 패턴 중 하나로 실체 객체에 대한 대리 객체로 실체 객체에 대한 접근 이전에 필요한 행동을 취할수 있게 만들어준다.
이 점을 이용해서 미리 할당하지 않아도 상관없는 것들을 실제 이용할때 할당하게 하여 메모리용량을 아낄 수 있으며 실체 객체를 드러나지 않게 하여 정보은닉의 역할도 수행하는 디자인 패턴이다.

프록시? 일종의 대리자이자 비서 (주요기능을 다양한 방식으로 컨트롤 해주는 것)
팀장님한테 바로 보고하는게 아니라 사수한테 먼저 물어보는 방식

Decorator 패턴과의 차이: 주요기능에 기능을 추가하는 것

프록시 패턴 from wiki

대표적인 프록시

  1. 가상 프록시 : 프록시 클래스에서 자잘한 작업들을 처리하고 리소스가 많이 요구되는 작업들이 필요할 때에만 주체 클래스를 사용하도록 구현
    e.g) 해상도가 아주 높은 이미지를 처리해야 하는 경우 작업을 분산처리
       - 용량이 큰 이미지와 글이 있는 문서를 화면에 띄울떄, 텍스트를 먼저 불러오고 이미지는 추후처리

  2. 원격 프록시: 서로 다른 주소 공간에 있는 객체에 대해 마치 같은 주소 공간에 있는 것처럼 동작하는 방식.
    e.g) google Docs 브라우저는 브라우저대로 필요한 자원을 로컬에 가지고 있고 또다른 자원은 Google 서버에 있는 형태
  3. 보호 프록시: 객체에 대한 접근 권한을 제어하거나 객체마다 접근 권한을 달리하고 싶을때 사용하는 방식.
    e.g) 권한을 가진 사용자만이 정보열람을 할 수 있는 프로그램

이는 SOLID의 OCP(open closed principle), DIP (Dependency Inversion principle)의 설계원칙을 적용한 패턴으로 볼 수있다.

실제 이미지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public interface Image {
   void displayImage();
}

public class Real_Image implements Image {

    private String fileName;
    
    public Real_Image(String fileName) {
        this.fileName = fileName;
        loadFromDisk(fileName);
    }
    
    private void loadFromDisk(String fileName) {
        System.out.println("Loading " + fileName);
    }
    
    @Override
    public void displayImage() {
        System.out.println("Displaying " + fileName);
    }
}

프록시 이미지

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Proxy_Image implements Image {
    private Real_Image realImage;
    private String fileName;
    
    public Proxy_Image(String fileName) {
        this.fileName = fileName;
    }
    
    @Override
    public void displayImage() {
        if (realImage == null) {
            realImage = new Real_Image(fileName);
        }
        realImage.displayImage();
    }
}

//main
public class Proxy_Main {
    public static void main(String[] args) {
        Image image1 = new Proxy_Image("test1.png");
        Image image2 = new Proxy_Image("test2.png");
        
        image1.displayImage();
        System.out.println();
        image2.displayImage();
    }
}

장 단점

장점

  1. 사이즈가 큰 이미지(객체)가 로딩되기 전에도 프록시를 통해 참조가능
  2. 실제 객체의 public, protected 메소드들을 숨기고 인터페이스를 통해 사용가능
  3. 로컬에 있지않은 객체,메소드를 사용할 수 있다.
  4. 객체의 접근에 대해 사전 처리가능.

단점

  1. 객체를 생성할때 한 단계를 더 수행하기 떄문에, 자주 사용 시 성능저하
  2. 가독성 저하
  3. 프록시 내부에서 객체 생성을 위해 스레드 생성, 동기화가 구현되어야하므로 성능저하

결론

직접 실행 메서드를 호출하는 것을 피하면서 흐름을 제어하는데 큰 도움을 주는 패턴이다.

참고자료

코드 자료
Head First 디자인패턴
면접을 위한 CS 전공지식노트

This post is licensed under CC BY 4.0 by the author.