이번 포스팅은 프록시 패턴에 대해 알아볼 것이다. 프록시(Proxy)
는 '대리자'라는 의미이다.
즉, 프록시 패턴은 실제 객체를 대리하는 프록시 객체를 사용해서 실체 객체의 생성이나 접근을 제어할 수 있도록 해 주는 패턴이다.
쉽게 생각하면, 그냥 중간에 프록시라는 대리인이 껴있어서 그 대리인이 접근을 통제한다고 생각하면 된다.
이미지 캐싱을 할 경우를 가정해서 생각을 해보자.
어떤 사이트에 들어간다고 가정을 했을 때, 이미지 4개가 먼저 보여진다고 가정해보자.
이럴 경우 프록시 객체를 사용해서 맨 처음 사이트를 방문 후 다음에 다시 방문할 때, 먼저 보여지는 4개의 이미지를 캐싱을 해두면 이미지 객체에 도달하지 않고, 프록시 객체에서 이미지를 출력할 수 있다.
public interface Image {
void print();
}
public class RealImage implements Image {
public static List<Image> STORE = new ArrayList<>();
public RealImage() {
STORE.add(new Image1());
STORE.add(new Image2());
STORE.add(new Image3());
STORE.add(new Image4());
}
@Override
public void print() {
for (Image image : STORE) {
image.print();
}
}
}
public class Proxy implements Image {
@Override
public void print() {
if (RealImage.STORE.isEmpty()) { //저장소 확인
System.out.println("RealImage 객체 생성 ");
RealImage realImage = new RealImage(); // 프록시 객체가 진짜 객체에 의존하게 된다.
realImage.print();
} else {
System.out.println("프록시");
for (Image image : RealImage.STORE) {
image.print();
}
}
}
}
public class Site {
private Image proxy;
public Site(Image proxy) {
this.proxy = proxy;
}
public void draw(){
long startTime = System.currentTimeMillis(); // 시간 측정
proxy.print(); //프록시에게 이미지 출력을 위임.
long endTime = System.currentTimeMillis();
long resultTime = endTime - startTime;
System.out.println("==========="+resultTime);
}
}
Site -> Proxy -> RealImage
로 의존하게 된다.RealImage 객체에서 이미지를 출력
하고, 1.xxms가 걸린다.프록시 객체에서 이미지를 출력
하고, 0.xxms가 걸리는 것을 알 수 있다. 이것은 프록시 객체에서 진짜 객체에 대한 접근을 차단하고 생성을 제한했다
고도 볼 수 있다.public class Main {
public static void main(String[] args) {
Proxy proxy = new Proxy(); // 프록시 객체에 실제 객체 주입
Site site = new Site(proxy); //클라이언트 객체에는 프록시 객체 주입
//프록시에서 이미지 출력 x
site.draw();
//프록시에 이미지 출력
site.draw();
}
}
결과
이미지 1 출력
이미지 2 출력
이미지 3 출력
이미지 4 출력
===========1
프록시
이미지 1 출력
이미지 2 출력
이미지 3 출력
이미지 4 출력
===========0
가상 프록시(virtual proxy)
라고 한다.보호 프록시
,원격 프록시
등이 있다.상속을 받아서 프록시로 사용하는
방법도 있다. 하지만 상속을 받는 경우, 상위 객체가 항상 생성되기 때문에 가상 프록시로 쓰기에는 적합하지 않다.Reference