-
구조패턴 - 프록시(Proxy) 패턴Java/디자인패턴 2024. 11. 13. 09:22반응형
프록시(Proxy) 패턴은 **구조 패턴(Structural Pattern)**에 속하는 디자인 패턴입니다. 프록시 패턴은 실제 객체에 대한 대리인(Proxy) 역할을 수행하는 객체를 제공하여, 원래 객체에 대한 접근을 제어하거나 추가적인 기능을 수행할 수 있도록 합니다. 주로 원래 객체에 접근하는 과정에서 제약을 두거나, 접근 전에 특정 작업을 수행해야 할 때 사용됩니다.
프록시 패턴의 목적
- 접근 제어: 원래 객체에 접근하기 전 또는 접근을 제한해야 할 때 사용됩니다. 예를 들어, 데이터베이스 연결, 원격 서버 연결, 파일 입출력 등 무거운 작업에 대해 프록시 객체가 중간에서 접근을 제어할 수 있습니다.
- 지연 초기화(Lazy Initialization): 실제 객체의 초기화가 비용이 큰 경우, 처음에는 프록시 객체를 사용하다가 필요할 때 실제 객체를 생성할 수 있습니다.
- 추가 기능 부여: 원래 객체에 접근하기 전이나 후에 로깅, 캐싱 등의 추가적인 기능을 수행할 수 있습니다.
프록시 패턴의 구조
- Subject: 프록시와 실제 객체가 공유하는 공통 인터페이스입니다.
- RealSubject: 실제로 동작을 수행하는 객체입니다.
- Proxy: RealSubject에 대한 접근을 제어하며, 필요할 때 RealSubject의 작업을 대리하여 처리합니다.
예제 코드 (Java)
아래 예제에서는 RealSubject가 실제 작업을 수행하는 클래스이고, Proxy 클래스가 이를 대리하여 접근을 제어합니다.
// Subject 인터페이스 interface Subject { void request(); } // RealSubject 클래스: 실제 작업을 수행하는 클래스 class RealSubject implements Subject { @Override public void request() { System.out.println("RealSubject: 실제 요청을 처리합니다."); } } // Proxy 클래스: RealSubject에 대한 접근을 제어하는 대리 클래스 class Proxy implements Subject { private RealSubject realSubject; @Override public void request() { // 실제 객체를 지연 초기화 if (realSubject == null) { realSubject = new RealSubject(); } System.out.println("Proxy: 요청 전 추가 작업을 수행합니다."); realSubject.request(); // 실제 작업 위임 System.out.println("Proxy: 요청 후 추가 작업을 수행합니다."); } } // 사용 예시 public class Main { public static void main(String[] args) { Subject proxy = new Proxy(); proxy.request(); } }
코드 설명
- Subject 인터페이스: 프록시와 실제 객체가 구현해야 할 메서드를 정의합니다.
- RealSubject 클래스: 실제로 작업을 수행하는 클래스입니다. request() 메서드에서 실제 작업을 처리합니다.
- Proxy 클래스: request() 메서드에서 실제 객체에 접근하기 전과 후에 추가 작업을 수행합니다. 또한, RealSubject 객체를 지연 초기화하여 필요한 시점에만 생성합니다.
- 프록시 객체 Proxy가 요청을 받으면, 먼저 실제 객체가 존재하는지 확인하고 없으면 초기화합니다.
- 그 후 request() 메서드 호출 전후에 추가 작업을 수행하고, 실제 작업은 RealSubject 객체에 위임합니다.
- Main 클래스: 클라이언트가 Proxy 객체를 통해 간접적으로 RealSubject에 접근하도록 합니다.
프록시 패턴의 활용 예
- 캐싱: 프록시가 데이터를 미리 캐시하여, 동일한 요청에 대해 여러 번 실제 객체에 접근하지 않도록 합니다.
- 접근 제어: 특정 조건이 충족될 때만 실제 객체에 접근할 수 있도록 제한합니다.
- 지연 초기화: 메모리나 자원 사용을 최적화하기 위해 필요할 때만 실제 객체를 생성합니다.
프록시 패턴의 장점과 단점
- 장점:
- 객체에 대한 접근 제어를 쉽게 할 수 있습니다.
- 객체 생성을 지연하여 자원 낭비를 줄일 수 있습니다.
- 접근 전후에 추가 작업을 쉽게 삽입할 수 있습니다.
- 단점:
- 코드 복잡도가 증가하며, 프록시 객체가 추가되므로 클래스가 많아집니다.
- 일부 상황에서는 오버헤드가 발생할 수 있습니다.
반응형'Java > 디자인패턴' 카테고리의 다른 글
구조적(Structural) - 플라이웨이트(Flyweight) 패턴 (1) 2024.11.15 행동(Behavioral) - 관찰자(Observer) 패턴 (0) 2024.11.14 생성패턴 - 팩토리 메소드(Factory Method) 패턴 (0) 2024.11.12 구조 패턴- 브릿지(Bridge) 패턴 (0) 2024.11.11 구조 패턴 - 어댑터(Adapter) 패턴 (0) 2024.11.10