2024. 10. 17. 00:34ㆍDesign Pattern
Proxy 패턴 - 개념과 구현
Proxy 패턴은 구조 패턴(Structural Pattern) 중 하나로, 다른 객체에 대한 접근을 제어하는 대리 객체(Proxy)를 제공하는 패턴입니다.
실제 객체에 대한 접근을 대리 객체가 대신 수행함으로써, 추가적인 기능을 수행하거나 접근 제어를 할 수 있습니다.
주로 원격 객체, 메모리 집약적인 객체, 보안이 필요한 객체 등에 사용됩니다.
1. Proxy 패턴이란?
Proxy 패턴은 클라이언트가 직접 객체에 접근하지 않고, 대신 프록시(Proxy) 객체를 통해 간접적으로 접근하도록 하는 패턴입니다. Proxy는 실제 객체에 대한 접근을 제어하며, 다양한 용도로 활용할 수 있습니다. 이를 통해 클라이언트와 실제 객체 간의 중간 계층 역할을 수행합니다.
언제 사용하는가?
- 원격 객체: 네트워크 상의 다른 서버에 있는 객체에 접근할 때.
- 메모리 집약적인 객체: 생성 비용이 큰 객체를 나중에 필요할 때까지 실제로 생성하지 않으려 할 때.
- 보안과 접근 제어: 특정 객체에 대한 접근을 제어하거나 제한할 필요가 있을 때.
2. Proxy 패턴의 종류
Proxy 패턴에는 여러 종류가 있으며, 각각의 사용 목적에 따라 달라집니다.
1. Remote Proxy (원격 프록시)
- 원격 객체에 대한 접근을 대신하는 프록시입니다. 네트워크를 통해 원격 서버에 있는 객체에 접근할 때 사용합니다.
2. Virtual Proxy (가상 프록시)
- 메모리나 리소스가 많이 드는 객체의 생성을 지연시키는 역할을 합니다. 실제로 객체가 필요할 때까지 생성하지 않고, 가상의 프록시 객체로 대체하여 관리합니다.
3. Protection Proxy (보호 프록시)
- 실제 객체에 대한 접근 권한을 제한하는 프록시입니다. 보안이 필요한 상황에서 특정 권한이 있는 사용자만 객체에 접근할 수 있도록 제어합니다.
4. Caching Proxy (캐싱 프록시)
- 반복되는 요청에 대해 객체의 상태나 결과를 캐싱하여, 성능을 최적화하는 역할을 합니다.
3. Proxy 패턴의 구조
Proxy 패턴의 구조는 크게 Subject, RealSubject, Proxy로 나뉩니다.
1. Subject (주제)
- 실제 객체와 프록시 객체가 구현해야 하는 공통 인터페이스입니다. 클라이언트는 이 인터페이스를 통해 실제 객체나 프록시 객체를 동일하게 다룹니다.
2. RealSubject (실제 주체)
- 실제로 작업을 수행하는 객체로, 클라이언트가 사용하려는 본래의 객체입니다.
3. Proxy (프록시)
- 실제 객체에 대한 대리 객체로, 클라이언트의 요청을 실제 객체에 전달하거나 필요한 경우에만 실제 객체를 생성하고 작업을 위임합니다.
4. Proxy 패턴의 구현 예시 (C#)
// Subject: 공통 인터페이스
public interface ISubject
{
void Request();
}
// RealSubject: 실제 객체
public class RealSubject : ISubject
{
public void Request()
{
Console.WriteLine("RealSubject: Handling Request.");
}
}
// Proxy: 대리 객체
public class Proxy : ISubject
{
private RealSubject _realSubject;
public void Request()
{
if (_realSubject == null)
{
_realSubject = new RealSubject(); // RealSubject 객체를 지연 생성
}
Console.WriteLine("Proxy: Handling Request before delegating to RealSubject.");
_realSubject.Request();
}
}
위 코드에서 ISubject는 클라이언트가 사용할 공통 인터페이스이며, RealSubject는 실제 작업을 수행하는 객체입니다. Proxy는 RealSubject 객체에 대한 대리 객체로, 요청이 들어왔을 때 객체를 지연 생성하고 작업을 위임합니다.
클라이언트 코드
public class Program
{
public static void Main(string[] args)
{
ISubject subject = new Proxy(); // 프록시 객체를 사용
subject.Request();
}
}
이 클라이언트 코드는 직접 RealSubject 객체를 생성하지 않고, 대신 Proxy 객체를 사용하여 작업을 처리합니다. 프록시는 필요한 시점에만 실제 객체를 생성하고 요청을 처리합니다.
5. Proxy 패턴의 장단점
장점:
- 객체 생성 지연: 실제 객체의 생성 비용이 큰 경우, Proxy 패턴을 사용하여 필요할 때만 객체를 생성할 수 있습니다.
- 보안 및 접근 제어: 특정 객체에 대한 접근 권한을 제어할 수 있습니다.
- 네트워크 통신 제어: 원격 객체와의 통신을 간단하게 제어할 수 있습니다.
단점:
- 추가 계층의 복잡성: 프록시 객체가 추가되면서 구조가 복잡해질 수 있으며, 성능에 영향을 미칠 수 있습니다.
- 디버깅 어려움: 프록시를 통해 객체에 접근하는 경우, 실제 객체와의 상호 작용을 추적하기 어려울 수 있습니다.
6. Proxy 패턴의 사용 사례
6.1. 가상 프록시 (Virtual Proxy)
메모리나 자원이 많이 드는 객체를 미리 생성하지 않고, 실제로 필요할 때 생성하는 방식으로 리소스를 절약할 수 있습니다. 예를 들어, 대용량 이미지나 대형 데이터베이스 객체를 지연 로드할 때 사용할 수 있습니다.
6.2. 원격 프록시 (Remote Proxy)
분산 시스템에서 네트워크를 통해 원격 서버에 있는 객체를 호출할 때, Proxy 패턴을 사용하면 원격 객체를 마치 로컬 객체처럼 사용할 수 있습니다.
6.3. 보호 프록시 (Protection Proxy)
보안이 중요한 애플리케이션에서, 특정 사용자나 권한이 있는 사용자만 객체에 접근할 수 있도록 Proxy를 통해 접근 제어를 구현할 수 있습니다.
Proxy 패턴은 실제 객체에 대한 접근을 제어하고, 이를 통해 다양한 부가 기능을 제공할 수 있는 유용한 구조 패턴입니다. 객체의 생성 지연, 보안, 캐싱, 네트워크 통신 등의 다양한 용도로 활용될 수 있으며, 실세계 애플리케이션에서 자주 사용됩니다. Proxy 패턴을 사용하면 클라이언트와 실제 객체 간의 상호작용을 보다 효율적이고 안전하게 관리할 수 있습니다.
'Design Pattern' 카테고리의 다른 글
커맨드(Command) 패턴 (0) | 2024.10.17 |
---|---|
브릿지(Bridge) 패턴 (0) | 2024.10.17 |
컴포지트(Composite) 패턴 (0) | 2024.10.17 |
프로토타입(Prototype) 패턴 (0) | 2024.10.14 |
DI (Dependency Injection) 및 IoC (Inversion of Control) 패턴 (0) | 2024.10.14 |