티스토리 뷰

‘대리인'이란 의미로, 일을 해야 할 본인을 대신(대리)하는 사람을 뜻한다.

본인이 아니라도 가능한 일을 맡기기 위해서 대리인을 세운다.

대리인은 어디까지나 대리에 지나지 않기 때문에 할 수 있는 일에는 한계가 있다.

대리인이 할 수 있는 범위를 넘는 일이 발생하면, 대리인은 본인한테 와서 상담을 한다.

객체지향에서는 ‘본인', ‘대리인' 모두 객체가 된다.

즉, 바빠서 일을 할 수 없는 본인 객체 대신에 대리인 객체가 어느 정도 일을 처리하게 된다.

 

다음 링크는 프록시 패턴의 예제 코드다.

 

GitHub - kkoon9/Java-Design-Pattern: Java 언어로 배우는 디자인 패턴 입문 예제 코드

Java 언어로 배우는 디자인 패턴 입문 예제 코드. Contribute to kkoon9/Java-Design-Pattern development by creating an account on GitHub.

github.com

프록시 패턴의 등장인물

Subject(주체)의 역할 - Printable

Proxy 역할과 RealSubject 역할을 동일시하기 위한 인터페이스(API)를 결정한다.

Subject 역할 덕분에 Client 역할은 Proxy 역할과 RealSubject 역할의 차이를 인식할 필요없다.

Proxy(대리인)의 역할 - PrinterProxy

Client 역할의 요구를 할 수 있는 만큼 처리를 한다.

만약, 자신만으로 처리할 수 없으면 Proxy 역할은 RealResubject 역할에게 처리를 맡긴다.

Proxy 역할은 정말로 RealSubject 역할이 필요해지면 그때 RealSubject 역할을 생성한다.

Proxy 역할은 Subject 역할에서 정해지는 인터페이스(API)를 구현한다.

RealSubject(실제의 주체)의 역할 - Printer

‘대리인'인 Proxy 역할에서 감당할 수 없는 일이 발생했을 때 등장하는 것이 ‘본인'인 RealSubject 역할이다.

이 역할도 Proxy 역할과 마찬가지로 Subject 역할에서 정해져 있는 인터페이스(API)를 구현한다.

Client(의뢰인)의 역할 - Main

Proxy 패턴을 이용하는 역할

대리인을 사용해서 속도 올리기

프록시 패턴에서는 Proxy 역할이 대리인이 되어 가능한 일만 처리를 대신한다.

예제 코드에서는 Proxy 역할을 사용해 실제로 print할 때까지 무거운 처리를 지연시킬 수 있었다.

예제 코드 말고 초기화에 시간이 걸리는 기능이 많이 존재하는 대규모 시스템을 생각해보자.

기동 시점에서는 이용하지 않는 기능까지 전부 초기화하면, 어플리케이션의 기동에 시간이 많이 걸리는 문제가 발생한다.

🤔
대리인과 본인을 분리할 필요가 있나?

 

PrinterProxy 클래스와 Printer 클래스로 분리하지 않을 수 있다.

그러나 Proxy 역할과 RealSubject 역할을 분리해서 프로그램의 모듈을 만들면, 개별적으로 수정할 수 있다.

PrinterProxy 클래스의 구현을 바꾸면 Printable 인터페이스에 선언되어 있는 메서드 중에서 무엇을 대리인이 처리하고 무엇을 본인이 처리할 것인지를 변경할 수 있다.

게다가 이와 같은 수정을 마무리해도 Printer 클래스 쪽은 수정할 필요가 전혀 없다.

만약, 지연평가를 실행시키고 싶지 않으면, Main 클래스에서 PrinterProxy 클래스의 인스턴스를 new 하지 않고 Printer 클래스의 인스턴스를 new하면 된다.

대리와 위임

대리인이 혼자 처리할 수 있는 일은 대리인이 처리한다.

대리인이 혼자 처리할 수 없을 때에는 처리할 수 있는 본인에게 ‘위임'한다.

PrinterProxy 클래스의 print에서 real.print를 호출하고 있는 부분이다.

원래 현실에서는 본인이 대리인에게 책임을 위임하기 때문에, 디자인 패턴에서 뜻하는 위임과는 반대된다.

투과적이란 표현

PrinterProxy 클래스와 Printer 클래스는 같은 Printable이란 인터페이스를 구현한다.

Main 클래스는 실제로 호출하는 곳을 상관하지 않는다.

이와 같은 경우, PrinterProxy 클래스는 ‘투과적'이라고 할 수 있다.

Main 클래스와 Printer 클래스 사이에 PrinterProxy 클래스가 놓여있어도 문제가 되지 않는다.

HTTP Proxy

HTTP Proxy는 HTTP 서버(웹 서버)와 HTTP 클라이언트(웹 브라우저) 사이에서 웹 페이지의 캐싱을 실행하는 소프트웨어다.

HTTP Proxy는 많은 기능을 가지고 있기 때문에 여기에서는 일례로 페이지의 캐싱에 대해서 설명한다.

웹 브라우저가 어떤 웹 페이지를 표시할 때 일일이 원격지에 웹 서버에 엑세스해서 그 페이지를 취득하지 않고, HTTP Proxy가 캐시해서 어떤 페이지를 대신해서 취득한다.

최신 정보가 필요하거나 페이지의 유효기간이 지났을 때 웹 서버에 웹 페이지를 가지러 간다.

여기서 웹 브라우저가 Client, HTTP Proxy가 Proxy, 웹 서버가 ResultSubject 역할을 수행한다.

Proxy 종류

Virtual Proxy(가상 프록시)

이 포스팅에서 소개한 Proxy 패턴

정말로 인스턴스가 필요한 시점에서 생성, 초기화를 실행한다.

Remote Proxy(원격 프록시)

RealSubject 역할이 네트워크의 상대 쪽에 있음에도 불구하고 마치 자신의 옆에 있는 것처럼(투과적으로) 메서드를 호출할 수 있다.

Java의 RMI가 여기 해당한다.

Access Proxy

RealSubject 역할의 기능에 대해서 엑세스 제한을 설정하는 것이다.

정해진 사용자면 메서드 호출을 허가하고, 그 외에는 에러로 처리한다.

관련 패턴

  • Adapter 패턴
  • Decorator 패턴

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

커맨드(Command) 패턴  (0) 2022.04.18
플라이웨이트(Flyweight) 패턴  (0) 2022.04.18
상태(State) 패턴  (0) 2022.04.18
메멘토(Memento) 패턴  (0) 2022.04.03
옵저버(Observer) 패턴  (0) 2022.04.02
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
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 29 30 31
글 보관함