프록시(Proxy) 패턴

프록시 패턴은 다른 객체에 대한 대리자 또는 대변인 역할을 수행하는 디자인 패턴입니다.
이 패턴을 사용하면 객체에 대한 간접적인 접근을 제공하고, 객체의 동작을 제어하거나 보완할 수 있습니다.
프록시를 통해 객체에 대한 추가적인 기능을 제공하거나 객체의 생성 및 소멸을 관리할 수 있습니다.

구성 요소

실제 객체(Real Subject): 프록시가 대리하는 실제 객체입니다. 실제 작업을 수행합니다.
프록시(Proxy): 실제 객체와 동일한 인터페이스를 구현하며, 실제 객체에 대한 간접적인 접근을 제공합니다. 추가적인 기능을 제공하거나 객체의 생성 및 소멸을 관리할 수 있습니다.
클라이언트(Client): 프록시를 통해 실제 객체에 접근하고 사용합니다.

구현:

  1. 실제 객체 클래스를 생성합니다. 이 클래스는 프록시가 대리하는 실제 작업을 수행합니다.
  2. 프록시 클래스를 생성합니다. 이 클래스는 실제 객체와 동일한 인터페이스를 구현하며, 실제 객체에 대한 간접적인 접근을 제공합니다. 필요에 따라 추가적인 기능을 제공하거나 객체의 생성 및 소멸을 관리합니다.
  3. 클라이언트에서는 프록시를 통해 실제 객체에 접근하고 사용합니다.

장점

실제 객체에 대한 간접적인 접근을 제공하여 보안, 성능 개선, 지연 로딩 등의 기능을 추가할 수 있습니다.
클라이언트와 실제 객체 사이의 결합도를 낮춥니다.
실제 객체의 생성 및 소멸을 관리할 수 있습니다.

단점

프록시 클래스를 추가로 생성해야 하므로 코드의 복잡성이 증가할 수 있습니다.

예시

이메일을 보낼때 이메일 내용 전후에 광고를 붙이려고 한다.

Subject

public interface MessageSender {
    void sendMessage(String message);
}

Real Subject

public class EmailSender implements MessageSender {
    @Override
    public void sendMessage(String message) {
        System.out.println("Email message sent: " + message);
    }
}

Proxy

public class MessageSenderProxy implements MessageSender {

    private final MessageSender sender;

    public MessageSenderProxy(MessageSender sender) {
        this.sender = sender;
    }


    @Override
    public void sendMessage(String message) {
        System.out.println("AD");
        this.sender.sendMessage(message);
        System.out.println("AD");
    }
}

client

class MessageSenderProxyTest {

    @Test
    public void sendMessage_test() {
        MessageSender sender = new MessageSenderProxy(new EmailSender());
        sender.sendMessage("Hello");
    }
}

결론

프록시 패턴은 다른 객체에 대한 대리자 역할을 수행하여 객체에 대한 간접적인 접근을 제공합니다.
이를 통해 보안, 성능 개선, 지연 로딩 등의 기능을 추가할 수 있습니다.
또한, 클라이언트와 실제 객체 사이의 결합도를 낮추고, 실제 객체의 생성 및 소멸을 관리할 수 있습니다.

예제는 이곳 에서 확인하실수 있습니다.