프록시 패턴(Proxy Pattern)은 구조적 디자인 패턴으로, 대리인 역할의 객체를 사용하여 실제 객체에 대한 접근을 제어하는 방식이다.
프록시는 클라이언트와 실제 객체 사이의 인터페이스 역할을 하며, 접근 제어, 캐싱, 로깅, 지연 초기화와 같은 기능을 제공한다.
소프트웨어에서 직접 객체에 접근할 때 다음과 같은 문제가 발생할 수 있다:
프록시 패턴은 이러한 문제를 해결하기 위해 프록시 객체를 통해 실제 객체를 간접적으로 제어한다.
대형 이미지 파일을 표시하는 애플리케이션에서, 이미지를 사용하기 전까지 실제 이미지를 로드하지 않도록 설계할 수 있다.
Client → Proxy → RealSubject
↘ Subject
Proxy
객체를 통해 작업을 요청한다.Proxy
는 요청을 처리하거나, 필요시 RealSubject
에 요청을 전달한다.Proxy
와 상호작용하며, 실제 객체의 존재를 알 필요가 없다.이번 예시에서는 “이미지 로드 최적화”를 프록시 패턴으로 구현한다.
// Subject 인터페이스
interface Image {
void display();
}
// RealSubject 클래스
class RealImage implements Image {
private String fileName;
public RealImage(String fileName) {
this.fileName = fileName;
loadFromDisk();
}
private void loadFromDisk() {
System.out.println(fileName + " 로드 중...");
}
@Override
public void display() {
System.out.println(fileName + " 화면에 표시 중...");
}
}
// Proxy 클래스
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();
}
}
// 클라이언트 코드
public class Main {
public static void main(String[] args) {
Image image1 = new ProxyImage("photo1.jpg");
Image image2 = new ProxyImage("photo2.jpg");
// 이미지를 처음 요청할 때만 로드됨
image1.display();
System.out.println();
// 두 번째 호출에서는 로드 과정을 생략
image1.display();
System.out.println();
// 다른 이미지 로드
image2.display();
}
}
Image
인터페이스는 display
메서드를 정의한다.RealImage
클래스는 실제 이미지를 로드하고 표시하는 작업을 수행한다.ProxyImage
클래스는 RealImage
객체의 로드를 지연시키고, 필요할 때만 로드한다.Main
클래스는 프록시 객체를 사용하여 이미지를 요청한다.photo1.jpg 로드 중...
photo1.jpg 화면에 표시 중...
photo1.jpg 화면에 표시 중...
photo2.jpg 로드 중...
photo2.jpg 화면에 표시 중...
프록시 패턴(Proxy Pattern)은 객체에 대한 접근을 제어하거나, 추가 기능을 캡슐화하는 데 유용하다.
특히, 리소스가 무거운 객체의 생성을 지연시키거나, 민감한 리소스에 대한 접근을 제한할 때 유용하다.
아래 글에서 다른 디자인 패턴들을 확인할 수 있다.
디자인 패턴 모음