[Java] 디자인 패턴, Proxy에 대해 알아보자

     

    📑 Proxy 소개

    • 구조 디자인 패턴이다.
    • 어떤 객체에 대한 접근을 제어하거나 기능을 확장하려고 할 때 사용
    • 클라이언트가 객체를 직접 사용하는 대신에 Proxy라는 대리자를 통해 객체에 접근하도록 만든다.
    • 실제 객체와 같은 인터페이스를 구현함으로써, 클라이언트가 실제 객체와 동일하게 Proxy 를 사용할 수 있게 해 준다.
    • Proxy 는 실제 객체의 생성과 관리, 생명주기를 관리하거나, 접근을 제어하며, 요청을 가로채 추가적인 행동을 수행하고 나서 실제 객체로 요청을 전달.

     

     

     

    📝 구성 요소

    요소 설명
    Subject ( 주제 )
    • 실제 객체와 Proxy 객체가 구현해야 하는 인터페이스
    • 클라이언트는 Proxy를 실제 객체처럼 사용할 수 있다.
    Real Subject ( 실제 주제 )
    • Proxy가 대신하여 요청을 처리하는 실제 객체
    Proxy
    • 실제 객체에 대한 참조를 유지한다.
    • 실제 객체에 대한 접근을 제어
    • 프록시는 Subject 인터페이스를 구현, 클라이언트의 요청을 받아 적절한 처리를 한 후 실제 객체에 요청을 전달할 수 있다.

    Main이 RealProxy에 직접접근을 할 수가 없다.

     

     

    🔍 Point

    클라이언트가 직접 대상 객체 (RealSubject)에 접근하는 대신, 그 사이에 Proxy객체가 위치하여 여러 가지 중요한 작업을 수행

     

     

    🏁 주요 유형

    프록시 종류 설명
    가상 프록시 (Virtual Proxy) 객체를 생성하는 것이 비용이 많이 들 때, 객체가 실제로 필요할때까지 객체의 생성을 지연시키는 데 사용
    보호 프록시 (Protection Proxy) 객체에 대한 접근을 제어할 때 사용하며, 특정 사용자에게만 접근 권한을 부여
    원격 프록시 (Remote Proxy) 다른 주소 공간에 있는 객체에 대한 접근을 제어할 때 사용되며, 원격 객체와의 통신을 관리
    스마트 프록시 (Smart Proxy) 실제 객체에 대한 추가적인 작업을 제공할 때 사용되며, 참조 횟수를 세는 등의 추가적인 기능을 수행

     

     

     

    🍖 Proxy 사용 이유 ( 장점 )

    1. 접근 제어와 보안 강화

    • 프록시는 실제 객체에 대한 접근을 제어.
    • 민감한 정보나 자원에 대한 보호를 강화할 수 있다.
    • 보호 프록시 (Protection Proxy)를 통해 사용자 인증을 요구하거나 특정 사용자에게만 접근 권한을 제공

    2. 비용 효율적인 지원 관리

    • 가상 프록시(Virtual Proxy)를 사용하면, 객체의 생성과 초기화를 지연시킬 수 있어, 불필요한 리소스 소모를 줄이고 성능을 최적화할 수 있다.

    3. 원격 객체 관리의 용이성

    • 원격 프록시 (Remote Proxy)를 통해 다른 네트워크 영역에 위치한 객체들을 마치 로컬 객체처럼 쉽게 다룰 수 있다.
    • 이는 분산 시스템이나 클라우드 서비스를 효율적으로 관리하는데 도움

    4. 추가 기능의 제공

    • 프록시를 통해 실제 객체의 기능에 부가적인 작업을 추가할 수 있다.

    5. 시스템의 격리와 결합도 감소

    • 프록시를 사용하면 클라이언트와 실제 서비스 사이의 결합도를 낮출 수 있다. 이는 시스템의 각 부분을 독립적으로 개발하고 테스트하는데 도움 된다.

    6. 인터페이스의 단순화

    • 복잡한 시스템이나 서드파티 라이브러리를 사용할 때, 프록시를 통해 더 간단하고 사용하기 쉬운 인터페이스를 클라이언트에게 제공한다.
    • 이는 시스템의 복잡성을 추상화하고 사용자 친화적인 작업 흐름을 만드는데 기여.

     

     

    🧑‍💻 코드 보기

    ☘️ Image

    public interface Image {
        void display();
    }

     

     

    ☘️ RealImage

    public class RealImage implements Image{
        private String fileName;
    
        public RealImage(String fileName) {
            this.fileName = fileName;
            loadFromDisk(fileName);
        }
    
        private void loadFromDisk(String fileName) {
            System.out.println("Loading: "+fileName);
        }
    
        public void display() {
            System.out.println("Displaying1: "+fileName);
        }
    }

     

     

    ☘️ ProxyImage

    public 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();
        }
    }

     

     

    ☘️ ProxyDemo

    public class ProxyDemo {
        public static void main(String[] args) {
            Image image = new ProxyImage("test_10mb.jpg");
            image.display();
            image.display();
        }
    }

     

     

    🐳 마무리

    같은 객체를 상속받은 두 개 이상의 객체가 서로를 보안하는 코드가 가장 인상적인 패턴이었다.

    인상 깊었던 것은, 자신의 상속을 그대로 사용하지 않고 다른 객체를 통해 대리인을 하듯이 한다는 부분이었다.

     

    마치, 무언가를 하기 위해서 행동을 할 때, 과정결과나눈 것 같은 기분이었다.

    반응형

    댓글

    Designed by JB FACTORY