본문 바로가기

java(자바)

[java(자바)] 프록시 패턴(Proxy Pattern) _디버깅의 눈물

자바 프록시 패턴(Java Proxy Pattern)은 객체지향 프로그래밍에서 사용되는 디자인 패턴 중 하나로, 다른 객체에 대한 접근을 제어하거나 그 객체에 대한 부가적인 작업을 수행하기 위해 대리자(프록시) 역할을 하는 객체를 생성하는 패턴입니다.

 

프록시 객체는 실제 객체와 동일한 인터페이스를 구현하며, 실제 객체의 대리로 동작합니다. 이를 통해 프록시 객체는 실제 객체와 동일한 인터페이스를 제공하면서, 실제 객체를 사용하는 클라이언트의 요청을 제어하거나 필요한 추가 작업을 수행할 수 있습니다.

 

 

프록시 패턴을 구현하는 방법은 다음과 같습니다.

 

 

1.프록시 객체와 실제 객체가 동일한 인터페이스를 구현하도록 합니다.

 

2.프록시 객체는 실제 객체에 대한 참조를 가지며, 실제 객체를 생성하거나 참조합니다.

 

3.프록시 객체는 실제 객체의 메서드를 호출하면서, 필요한 부가 작업을 수행합니다.

 

 

예를 들어, 특정 인터넷 사이트에 대한 접근을 제어하는 프로그램을 만들고자 한다면, 프록시 패턴을 사용할 수 있습니다. 이 경우, 인터넷 사이트에 대한 접근을 제어하는 객체는 원격지에 존재할 수도 있습니다.

아래는 이를 구현한 예시 코드입니다.

 

 

// 인터페이스
public interface Internet {
    public void connectTo(String serverhost) throws Exception;
}

// 원격지 인터넷 클래스
public class RealInternet implements Internet {
    public void connectTo(String serverhost) throws Exception {
        System.out.println("Connecting to "+ serverhost);
    }
}

// 프록시 클래스
public class ProxyInternet implements Internet {
    private Internet internet = new RealInternet();
    private static List<String> bannedSites;

    static {
        bannedSites = new ArrayList<String>();
        bannedSites.add("abc.com");
        bannedSites.add("def.com");
        bannedSites.add("ijk.com");
        bannedSites.add("lnm.com");
    }

    public void connectTo(String serverhost) throws Exception {
        if(bannedSites.contains(serverhost.toLowerCase())) {
            throw new Exception("Access Denied");
        }

        internet.connectTo(serverhost);
    }
}

// 클라이언트 클래스
public class Client {
    public static void main(String[] args) {
        Internet internet = new ProxyInternet();

        try {
            internet.connectTo("google.com");
            internet.connectTo("abc.com");
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

 

 

위 예시 코드에서, Internet 인터페이스는 원격지 인터넷과 프록시 인터넷 모두에 의해 구현됩니다. RealInternet 클래스는 실제 인터넷에 대한 접근을 담당하고, ProxyInternet 클래스는 인터넷에 대한 접근을 제어합니다.

 

ProxyInternet 클래스에서는 RealInternet 객체를 생성하고, bannedSites 리스트를 이용하여 접근이 제한된 사이트에 대한 접근을 거부합니다. ProxyInternet 클래스의 connectTo() 메서드에서는 클라이언트가 접근하려는 사이트가 bannedSites 리스트에 포함되어 있는지 확인하고, 만약 포함되어 있다면 Access Denied 예외를 던집니다. 그렇지 않은 경우에는 RealInternet 객체의 connectTo() 메서드를 호출하여 인터넷에 접근합니다.

 

Client 클래스에서는 ProxyInternet 객체를 생성하여 Internet 인터페이스를 구현한 객체에 대한 접근을 제어합니다. Client 클래스에서는 google.com에 대한 접근은 허용되지만, abc.com에 대한 접근은 거부됩니다.