본문 바로가기

디자인 패턴

디자인 패턴 - (원격)프록시 패턴 (Proxy Pattern)

1. 정의

  • 특정 객체로의 접근을 제어하는 대리인(특정 객체를 대변하는 객체)을 제공한다.

2. 예시

  • 클라이언트가 원격에 있는 부산과 제주도 기계의 로그를 요청한다.

3. 그림

4. 클래스 다이어그램

5. 코드

public class Client {
    public static void main(String[] args){
        String[] locations = new String[]{"부산 기계", "제주도 기계"};

        System.out.println("[서울 본사에서 지방에 있는 기계 로그 요청]");
        for (String lo : locations) {
            Subject subject = new Proxy(lo);
            System.out.println(subject.request());
        }
    }
}
/* 출력
[서울 본사에서 지방에 있는 기계 로그 요청]
부산에 있는 기계 로그 : Ok
제주도에 있는 기계 로그 : Ok
*/
public interface Subject {
    String request();
}
public class Proxy implements Subject{
    String location;

    public Proxy(String location) {
        this.location = location;
    }

    @Override
    public String request() {

        // 원격 요청
        if(location.equals("부산 기계")){
            return new BusanMachineSubjectImpl().request();
        }
        else return new JejuMachineSubjectImpl().request();
    }
}
public class BusanMachineSubjectImpl implements Subject{
    @Override
    public String request() {
        return "부산에 있는 기계 로그 : Ok";
    }
}
public class JejuMachineSubjectImpl implements Subject{
    @Override
    public String request() {
        return "제주도에 있는 기계 로그 : Ok";
    }
}

https://github.com/kang-seongbeom/design_pattern

💡 Github에서 디자인 패턴 코드를 볼 수 있습니다.

6. 설명

  • 프록시와 기계는 Subject를 구현한다.
  • 같은 인터페이스를 구현하기 때문에, 클라이언트는 기계의 로그를 마치 로컬에 있는것 처럼 요청을 할 수 있다.
  • 프록시가 클라이언트의 요청을 받아 RMI(Remote Method Invocation) 또는 API로 외부에 요청한다.
  • 프록시가 결과를 반환 받으면 그 결과를 클라이언트에게 돌려준다.