ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 구조패턴 - 프록시(Proxy) 패턴
    Java/디자인패턴 2024. 11. 13. 09:22
    반응형

    프록시(Proxy) 패턴은 **구조 패턴(Structural Pattern)**에 속하는 디자인 패턴입니다. 프록시 패턴은 실제 객체에 대한 대리인(Proxy) 역할을 수행하는 객체를 제공하여, 원래 객체에 대한 접근을 제어하거나 추가적인 기능을 수행할 수 있도록 합니다. 주로 원래 객체에 접근하는 과정에서 제약을 두거나, 접근 전에 특정 작업을 수행해야 할 때 사용됩니다.

    프록시 패턴의 목적

    • 접근 제어: 원래 객체에 접근하기 전 또는 접근을 제한해야 할 때 사용됩니다. 예를 들어, 데이터베이스 연결, 원격 서버 연결, 파일 입출력 등 무거운 작업에 대해 프록시 객체가 중간에서 접근을 제어할 수 있습니다.
    • 지연 초기화(Lazy Initialization): 실제 객체의 초기화가 비용이 큰 경우, 처음에는 프록시 객체를 사용하다가 필요할 때 실제 객체를 생성할 수 있습니다.
    • 추가 기능 부여: 원래 객체에 접근하기 전이나 후에 로깅, 캐싱 등의 추가적인 기능을 수행할 수 있습니다.

    프록시 패턴의 구조

    1. Subject: 프록시와 실제 객체가 공유하는 공통 인터페이스입니다.
    2. RealSubject: 실제로 동작을 수행하는 객체입니다.
    3. 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();
        }
    }

    코드 설명

    1. Subject 인터페이스: 프록시와 실제 객체가 구현해야 할 메서드를 정의합니다.
    2. RealSubject 클래스: 실제로 작업을 수행하는 클래스입니다. request() 메서드에서 실제 작업을 처리합니다.
    3. Proxy 클래스: request() 메서드에서 실제 객체에 접근하기 전과 후에 추가 작업을 수행합니다. 또한, RealSubject 객체를 지연 초기화하여 필요한 시점에만 생성합니다.
      • 프록시 객체 Proxy가 요청을 받으면, 먼저 실제 객체가 존재하는지 확인하고 없으면 초기화합니다.
      • 그 후 request() 메서드 호출 전후에 추가 작업을 수행하고, 실제 작업은 RealSubject 객체에 위임합니다.
    4. Main 클래스: 클라이언트가 Proxy 객체를 통해 간접적으로 RealSubject에 접근하도록 합니다.

    프록시 패턴의 활용 예

    • 캐싱: 프록시가 데이터를 미리 캐시하여, 동일한 요청에 대해 여러 번 실제 객체에 접근하지 않도록 합니다.
    • 접근 제어: 특정 조건이 충족될 때만 실제 객체에 접근할 수 있도록 제한합니다.
    • 지연 초기화: 메모리나 자원 사용을 최적화하기 위해 필요할 때만 실제 객체를 생성합니다.

    프록시 패턴의 장점과 단점

    • 장점:
      • 객체에 대한 접근 제어를 쉽게 할 수 있습니다.
      • 객체 생성을 지연하여 자원 낭비를 줄일 수 있습니다.
      • 접근 전후에 추가 작업을 쉽게 삽입할 수 있습니다.
    • 단점:
      • 코드 복잡도가 증가하며, 프록시 객체가 추가되므로 클래스가 많아집니다.
      • 일부 상황에서는 오버헤드가 발생할 수 있습니다.
    반응형

    댓글

Designed by Tistory.