Java로 배우는 디자인패턴 입문 Chapter 21. Proxy 패턴
필요해질 때 만든다
교재: 자바언어로배우는디자인패턴입문(개정판)/YukiHiroshi저/김윤정역/영진닷컴
덕성여자대학교 컴퓨터학과
최 승 훈
01. Proxy 패턴
Proxy
– 대리인
– 본인을 대신해서 일을 처리하는 사람
client
대리인 본인(1) 대리인이 client의 요청들을 처리하다가...
(2) 본인이 필요한 시점이 되면, 본인을 생성해서 본인에게 일을 맡긴다.
02. 예제 프로그램
이름을 가진 프린터
– 화면에 문자열을 표시하는 프로그램
02. 예제 프로그램
02. 예제 프로그램
Printable 인터페이스
– PrinterProxy와 Printer 클래스를 동일시하기 위한 인터페이스
02. 예제 프로그램
Printer 클래스
– ‘본인’을 나타내는 클래스
– 생성자: heavyJob (5초가 걸리는 상대적으로 오래 걸리는 일) 을 호출함
– setPrinterName( ) / getPrinterName( ) – print( )
프린터 이름과 문자열을 화면에 출력함 – heavyJob( )
[Thread.sleep(1000) 후 ‘.’을 찍는 일]을 5번 실행함.
02. 예제 프로그램
PrinterProxy 클래스
– Printer 클래스의 ‘대리인’을 나타내는 클래스 – name 필드: 대리인의 이름을 저장함
– real 필드: ‘본인’에 대한 참조를 저장함
– setPrintername( ): real이 null 이 아니면, 즉, 본인 객체가 이미 생성되어 있으면, 그 객체에도 이름을 설정한다.
– print( )
realize( ) 호출 후, ‘본인’ 객체의 print( ) 메소드를 호출한다 =>
위임 – realize( )
실제 일을 하는 ‘본인’ 객체가 생성되지 않았으면 생성한다.
– setPrintername( )과 realize( ) 는 synchronized 로 선언됨
02. 예제 프로그램
Main 클래스
– PrinterProxy를 경유해서, Printer를 이용하는 클래스
– 먼저, PrinterProxy 생성 후, 이름을 설정한 후 , “hello, world”
를 출력한다.
– 이름을 설정하거나 표시하는 동안에는, Printer 클래스의 인스 턴스(본인)은 아직 생성되지 않는다.
– print( ) 메소드가 호출되어야 비로소, Printer 객체가 생성된다.
필요할 때 비로소 생성된다.
02. 예제 프로그램
시퀀스 다이어그램
(1) 대리인이 client의 요청들을 처리하다가...
(2) 본인이 필요한 시점이 되면, 본인을 생성해서 본인에게 일을 맡긴다.
03. 등장 역할
Subject(주체)의 역할
– Proxy와 RealSubject를 동일시하기 위한 인터페이스(API)를 정 한다.
– 예제에서는, Printable 인터페이스가 해당됨
Proxy(대리인)의 역할
– Client로부터의 요구를 가능한 한 자신이 처리함
– 혼자서 처리할 수 없으면 RealSubject 역할에게 위임한다.
– Proxy 역할은, RealSubject 역할이 정말로 필요해지면 그 때가 서 RealSubject 역할을 생성한다.
– 예제에서는 PrinterProxy 클래스가 해당됨
03. 등장 역할
Client(의뢰자)의 역할
– Proxy 패턴을 이용하는 역할
– 예제에서는, Main 클래스가 해당됨
04. 독자의 사고를 넓혀주는 힌트
대리인을 사용해서 스피드업
– Proxy 역할이 대리인이 되어서, 할 수 있는 일은 모두 처리한다.
– 실제로 무거운 처리(예: Printer 인스턴스 생성)는 필요할 때까 지 지연시킨다.
– 초기화하는데 시간이 많이 걸리는 대규모의 시스템에서 유용 하다.
기동하는 시점에서 아직 이용하지 않는 기능까지 전부 초기화하 면, 애플리케이션 기동에 시간이 걸림
시간이 걸리는 아직 필요하지 않는 초기화는, 필요한 시점까지 미 루자.
04. 독자의 사고를 넓혀주는 힌트
대리와 위임
– 대리인이 처리할 수 있는 일은 대리인이 처리한다.
– 대리인이 처리할 수 없을 때는 본인에게 위임한다.
투명적이라는 것(transparent)
– 클라이언트(Main) 입장에서는, 실제로 호출하는 것이
PrinterProxy 객체인지, Printer 객체인지 상관하지 않는다.(투 명하게 보인다)
04. 독자의 사고를 넓혀주는 힌트
HTTP Proxy
– Proxy는 HTTP 서버(웹 서버)와 HTTP 클라이언트(웹 브라우저) 사이에 들어가, 웹 페이지의 캐싱 등을 실행하는 소프트웨어 – 여기에도, Proxy 패턴을 적용할 수 있다.
웹 브라우저가 웹 페이지를 표시할 때, 일일이 원격지에 있는 웹 서버로부터 페이지를 얻어오는 것이 아니다.
대신에, HTTP 프록시가 캐쉬한 페이지를 얻어온다.
최신 정보가 필요하게 되었거나, 페이지의 유효기간이 다 되었을 때에 비로소 웹버서로 웹 페이지를 가지러 간다.
웹 브라우저 => Client 역할
HTTP Proxy => Proxy 역할
웹 서버 => RealSubject 역할
04. 독자의 사고를 넓혀주는 힌트
ProxyHTTP 웹서버
(HTTP 서버)
(1) 웹 서버로부터 미리
웹페이지들을 가져다 놓는다(캐싱)
(2) 최신 정보가 필요하면 원격지에 있는 웹 서버로부터 가져온다.
웹 브라우저 웹 브라우저
웹 브라우저
04. 독자의 사고를 넓혀주는 힌트
다양한 Proxy
– Virtual Proxy (가상 프록시)
이번 장 예제와 같이, 인스턴스가 필요해진 시점에서 생성, 초기 화를 실행하는 객체
– Remote Proxy (원격 프록시)
RealSubject 역할이 멀리 떨어져 있을 때, 클라이언트는 이 원격 프록시를 통해서 자신의 근처에 있는 것처럼 메소드를 호출할 수 있다.
– Access Proxy
RealSubject 역할의 기능에 대해, 접근 제한 기능을 수행하는 프 록시
05. 관련 패턴
Adapter 패턴
Decorator 패턴
06. 요약