프록시(Proxy) 패턴
디자인 패턴 ·프록시 패턴은 다른 객체에 대한 대리자 또는 대변인 역할을 수행하는 디자인 패턴입니다.
이 패턴을 사용하면 객체에 대한 간접적인 접근을 제공하고, 객체의 동작을 제어하거나 보완할 수 있습니다.
프록시를 통해 객체에 대한 추가적인 기능을 제공하거나 객체의 생성 및 소멸을 관리할 수 있습니다.
구성 요소
실제 객체(Real Subject): 프록시가 대리하는 실제 객체입니다. 실제 작업을 수행합니다.
프록시(Proxy): 실제 객체와 동일한 인터페이스를 구현하며, 실제 객체에 대한 간접적인 접근을 제공합니다. 추가적인 기능을 제공하거나 객체의 생성 및 소멸을 관리할 수 있습니다.
클라이언트(Client): 프록시를 통해 실제 객체에 접근하고 사용합니다.
구현:
- 실제 객체 클래스를 생성합니다. 이 클래스는 프록시가 대리하는 실제 작업을 수행합니다.
- 프록시 클래스를 생성합니다. 이 클래스는 실제 객체와 동일한 인터페이스를 구현하며, 실제 객체에 대한 간접적인 접근을 제공합니다. 필요에 따라 추가적인 기능을 제공하거나 객체의 생성 및 소멸을 관리합니다.
- 클라이언트에서는 프록시를 통해 실제 객체에 접근하고 사용합니다.
장점
실제 객체에 대한 간접적인 접근을 제공하여 보안, 성능 개선, 지연 로딩 등의 기능을 추가할 수 있습니다.
클라이언트와 실제 객체 사이의 결합도를 낮춥니다.
실제 객체의 생성 및 소멸을 관리할 수 있습니다.
단점
프록시 클래스를 추가로 생성해야 하므로 코드의 복잡성이 증가할 수 있습니다.
예시
이메일을 보낼때 이메일 내용 전후에 광고를 붙이려고 한다.
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");
}
}
결론
프록시 패턴은 다른 객체에 대한 대리자 역할을 수행하여 객체에 대한 간접적인 접근을 제공합니다.
이를 통해 보안, 성능 개선, 지연 로딩 등의 기능을 추가할 수 있습니다.
또한, 클라이언트와 실제 객체 사이의 결합도를 낮추고, 실제 객체의 생성 및 소멸을 관리할 수 있습니다.
예제는 이곳 에서 확인하실수 있습니다.