ComputerScience/디자인 패턴
[디자인 패턴] 프록시 패턴
slown
2024. 5. 21. 02:43
목차
1. 프록시 패턴?
2. 프록시 패턴의 장단점
3. 구현 예제
1. 프록시 패턴?
프록시 패턴(Proxy Pattern)은 디자인 패턴 중 하나로, 어떤 객체에 대한 접근을 제어하기 위해 그 객체의 대리인 역할을 하는 객체를 사용하는 패턴입니다. 프록시 패턴은 객체에 대한 접근을 제어하거나 기능을 추가하거나, 리소스를 효율적으로 사용하기 위해 사용됩니다.
2. 프록시 패턴의 장단점
장점
- 접근 제어 : 클라이언트가 실제 객체에 직접 접근하지 않도록 제어하여 객체의 접근을 관리하고 권한 검사 등을 수행할 수 있다.
- 지연 초기화 : 실제 객체의 생성 및 초기화를 지연시키는 데 사용하여 필요한 순간만에 생성 및 초기화하여 성능을 최적화할 수 있다.
- 캐싱 : 결과를 캐싱하여 중복 계산을 피하고 성능을 향상시킬 수 있다.
- 유효성 검사 : 실제 객체에 접근하기 전에 데이터의 유효성 검사를 통해 검증할 수 있다.
- 원격 액세스 : 원격 프록시를 사용하여 다른 시스템에서 실행 중인 객체에 접근할 수 있으며 분산 시스템에서 객체 간 통신을 용이하게 한다.
단점
- 복잡성 증가 : 추가적인 객체를 도입하기 때문에 코드의 복잡성이 증가할 수 있다.
- 성능 저하 : 프록시 객체에 접근하는 데 추가적인 오버헤드가 발생할 수 있으며, 일부 성능 저하가 발생할 수 있다.
- 디자인 복잡성 : 프록시 패턴을 오용하면 코드를 과도하게 복잡하게 만들 수 있다.
3. 구현 예제
프록시 패턴은 클라이언트가 접근할 Subject와 이에 대한 구현체인 RealSubject,Proxy가 존재한다.
- Subject: 프록시와 실제 객체가 구현할 공통 인터페이스.
- RealSubject: 실제로 동작하는 객체.
- Proxy: 실제 객체에 대한 접근을 제어하는 객체.
프록시 패턴의 예시를 들면 다음과 같습니다.
// Subject 인터페이스
interface Image {
void display();
}
// RealSubject 클래스
class RealImage implements Image {
private String filename;
public RealImage(String filename) {
this.filename = filename;
loadImageFromDisk();
}
private void loadImageFromDisk() {
System.out.println("Loading " + filename);
}
@Override
public void display() {
System.out.println("Displaying " + 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 ProxyPatternDemo {
public static void main(String[] args) {
Image image = new ProxyImage("test_image.jpg");
// 이미지는 처음 호출 시에만 로드됩니다.
image.display();
System.out.println("");
// 이미지는 이미 로드되었으므로 바로 표시됩니다.
image.display();
}
}
코드를 설명하자면 다음과 같습니다.
- Image 인터페이스: RealImage와 ProxyImage가 구현할 공통 인터페이스입니다.
- RealImage 클래스: 실제 이미지 객체로, 파일을 디스크에서 로드하고 이미지를 표시합니다.
- ProxyImage 클래스: RealImage 객체에 대한 접근을 제어하는 프록시 객체입니다. 이미지가 처음 요청될 때만 RealImage 객체를 생성하고 이후에는 생성된 객체를 사용합니다.
- ProxyPatternDemo 클래스: 클라이언트 코드로 ProxyImage를 사용하여 이미지를 표시합니다.
프록시 패턴을 사용하면 객체 생성 비용이 높은 객체에 대한 접근을 효율적으로 제어할 수 있습니다. 이 예제에서는 이미지가 처음 요청될 때만 로드되고, 이후에는 캐싱된 객체를 사용하여 성능을 최적화합니다.
출처: https://ittrue.tistory.com/555 [IT is True:티스토리]