특정 객체에 접근을 조절하기 위해 대리자(프록시)를 둠으로 필요할 때만 비싼 대가의 기능을 사용하도록한다.
1. 다음과 같은 이미지를 화면에 출력하는 Image클래스가 있다 하자.
class Image {
private String filename;
public Image(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading " + filename);
}
public void display() {
System.out.println("Displaying " + filename);
}
}
2. 2개의 Image클래스를 사용한다면 다음과 같은 Client로 나타낼 수 있다.
public class Client {
public static void main(String[] args) {
Image image1 = new Image("test1.jpg");
Image image2 = new Image("test2.jpg");
}
}
Client는 Image를 생성하는 즉시 이미지를 로드한다. 이러한 상황에서 이미지를 로드하는데 시간이 걸리거나 자원을 많이 소모하는 경우 전체적인 성능에 영향을 줄 수 있다.
Client와 Image사이에 대리자(Proxy)를 두어서 실제 객체의 생성단계를 뒤로 미루자!
1. Image
interface Image {
void display();
}
RealImage와 ProxyImage의 공통기능인 display를 정의한다.
2. RealImage
class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println("Loading " + filename);
}
@Override
public void display() {
System.out.println("Displaying " + filename);
}
}
이전의 Image와 동일하다.
3. ProxyImage
class ProxyImage implements Image {
private RealImage realImage;
private String filename;
public ProxyImage(String filename) {
this.filename = filename;
}
@Override
public void display() {
if (realImage == null) {
realImage = new RealImage(filename);
}
realImage.display();
}
}
대리자역할을 하는 Proxy객체로 RealImage에 대한 참조를 가지고 있다가 실제 요청이 들어오는 display메시지를 받으면 realImage를 생성한 후 realImage에 display메시지를 전달한다.
4. Client
public class Client {
public static void main(String[] args) {
Image image1 = new ProxyImage("test1.jpg");
Image image2 = new ProxyImage("test2.jpg");
image1.display();
image2.display();
}
}
전과의 Client코드가 비슷하지만 실제 realImage가 생성되는 때는 new ProxyImage()가 아닌 image.display()이다.
Proxy와 RealSubject를 사용하는 객체는 자신이 보낸 요청이 Proxy가 처리하는지 RealSubject가 처리하는지 모른다. 하지만 전체 프로그램 속도는 빨라진다.
프록시의 목적에 따라 이름이 다를 수 있다. 위 예제같은 경우는 실제 생성시기를 뒤로 미루는 역할을 하였지만, 입력데이터의 검증이나 사용자의 권한 확인과 같은 추가적인 기능을 수행할 수 있다.
프록시의 종류로는 원격 프록시(Remote), 가상 프록시(Virtual), 보호 프록시(Protection), 스마트 프록시(Smart)가 있다.