디자인패턴

프록시 패턴 설명 및 장단점

KayEsQuo 2021. 8. 24. 21:46

프록시 패턴이란

사전적 의미

프록시 패턴(proxy pattern)은 컴퓨터 프로그래밍에서 소프트웨어 디자인 패턴의 하나이다.

일반적으로 프록시는 다른 무언가와 이어지는 인터페이스의 역할을 하는 클래스이다. 프록시는 어떠한 것(이를테면 네트워크 연결, 메모리 안의 커다란 객체, 파일, 또 복제할 수 없거나 수요가 많은 리소스)과도 인터페이스의 역할을 수행할 수 있다.

프록시 패턴의 잘 알려진 예로는 참조 횟수 스마트 포인터 객체이다.

복합적인 오브젝트들의 다수의 복사본이 존재해야만 하는 상황에서 프록시 패턴은 애플리케이션의 메모리 사용량을 줄이기 위해서 플라이웨이트 패턴과 결합된 형태로 나올 수도 있다.

출처 : 나무위키

 

 

처음 사전적 의미로 보고는 한 번에 이해가 되지 않았다. 많은 블로그와 아래와 같은 클래스 다이어그램으로도 쉽게 와닿지 않았다. 이해가 되지 않았던 것은 이것이 언제 쓰이고 왜 쓰여야 하는지, 원리는 왜 이렇게 만들어졌는지 였다.

  이번 글에서는 앞서 언급한 원리와 사용 이유에 대해 정리해보고 내가 생각한 장점과 단점을 끝으로 마무리 짓고자 한다. 우선 원리 프락시 패턴의 원리는 아래 그림과 같다. 클라이언트가 proxy에게 요청을 보내면, 요청을 받은 proxy가 실제 서비스를 하는 메서드를 찾아 호출하는 것이다. 설명한 내용 중 한 가지 중요한 사실은 B는 실행을 하기 위한 대리인일 뿐이지, 실제 실행을 하지 않는 점이다. 또한 대리인은 C가 어떤 행동을 해야 하는지 알고는 있다는 점이다.

 

 

 

장점

  • 전처리 및 후처리 사용에 용이하다. ( B가 C에게 요청하기 전 다른 작업을 전처리로 가능하다는 점)
  • 특정 메서드에 대한 보안이 좋다. (B가 C에게 요청을 하여 A는 C가 무슨 일이 일어나는지 정확히 알기 힘들다는 점)

단점

  • 프로시패턴을 사용 시 가독성이 떨어진다. ( A->B->C라는 구조로 누군가 거쳐가야 한다는 점 이런 경우가 많아지면 가독성이 떨어질 우려)

 

 

클래스 다이어그램 및 코드

앞서 설명한 것을 토대로 클래스 다이어그램과 코드로 정리해보면 다음과 같다.

여기서 A는 Client를 담당하고, B는 Proxy 그리고 C는 realClass를 나타낸다.

그리고 윗 그림 중 한 집단을 그림으로 표현했는데 클래스 다이어그램에서 인터페이스를 나타낸다.

 

 

Subject Interface

public interface Subject {
    String Do();
}

real class

public class real implements Subject{
 
    @Override
    public String Do() {
        return "이것이 진짜다";
    }
     
}

Proxy class

public class Proxy implements Subject{
 
    Subject real;
     
    @Override
    public String Do() {         
        r = new real();
        return r.Do();
    }
 
}

Main

public class Main {
 
    public static void main(String[] args) {
        //직접 호출하지 않고 프록시 호출함.
        IService proxy = new Proxy();
        System.out.println(proxy.Do());
    }
}

 

개인적으로 프록시 패턴을 써야 하는 이유에 대해 의문이 많이 들었다. 그러나 위 그림에서 알 수 있듯이 B(대리인)가 전처리 후처리를 가능하게 해 준다는 점에서 사용 이유를 이해할 수 있었다. 그렇지만 프록시패턴을 남발하지 않는 선에서 가독성을 생각하며, 사용하면 효율적으로 사용할 수 있다는 생각이 든다.

 

 

'디자인패턴' 카테고리의 다른 글

템플릿 메서드 패턴 설명  (0) 2021.08.25