ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [객체지향의 원리와 이해] 프록시 패턴 (proxy pattern)
    개발/OOP, Design Pattern 2021. 1. 2. 01:48

    프록시 패턴

    제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴

    • 실제 서비스 객체가 가진 메소드를 직접 실행하지 않고, 대리자 객체를 대신 투입해 실행하는 패턴이다.
    • 클라이언트 쪽에서는 실제 서비스를 통해 실행하는지, 대리자 객체를 통해 실행하는지 알 수 없다.
    • 대리자를 둠으로써 실제 서비스의 메소드 호출 전후로 별도 로직을 수행하는 방식으로 제어 흐름이 가능하다.
    • 개방 폐쇄 원칙(OCP)의존 역전 원칙(DIP)를 적용한 패턴이다.

    중요 포인트
    대리자는 실제 서비스와 같은 이름의 메서드를 구현한다. 이때 인터페이스를 사용한다.
    대리자는 실제 서비스에 대한 참조 변수를 갖는다.(합성)
    대리자는 실제 서비스의 같은 이름을 가진 메서드를 호출하고 그 값을 클라이언트에게 돌려준다.
    대리자는 실제 서비스의 메서드 호출 전후에 별도의 로직을 수행할 수도 있다.

    예제

    • 클라이언트에서 어떠한 서비스를 실행하고 싶다.
    • 서비스에서는 랜덤숫자를 생성해서 짝수일때만 서비스를 실행하게 하고싶다.
      그래서..
    • 클라이언트에서는 직접 서비스를 실행하는 대신, 프록시를 호출하고
    • 프록시에서는 서비스에 있는 실행가능여부 확인 메소드possibleRunning()를 실행하고
    • 반환값이 true일 때, 실제 서비스runSomething()를 실행한다.

    ClientWithProxy.java

    public class ClientWithProxy {
        public static void main(String[] args) {
            // 프록시를 이용한 호출
            IService proxy = new Proxy();
            System.out.println(proxy.runSomething());
        }
    }

    Proxy.java

    public class Proxy implements IService {
        Service service;
    
        @Override
        public String runSomething() {
            System.out.println("호출에 대한 흐름 제어가 주목적, 반환 결과를 그대로 전달");
            service = new Service(RandomNumber.generate());
            System.out.println(service.randomNumber);
            if (service.possibleRunning()) {
                return service.runSomething();
            }
            return "실패했습니다.";
        }
    }

    Service.java

    public class Service implements IService {
        int randomNumber;
    
        public Service(int randomNumber) {
            this.randomNumber = randomNumber;
        }
    
        public String runSomething() {
            return "서비스를 실행합니다.";
        }
    
        public boolean possibleRunning() {
            if (randomNumber%2 == 0) {
                return true;
            }
            return false;
        }
    }

    IService.java

    public interface IService {
        String runSomething();
    }

    댓글

Designed by Tistory.