[6단원]디자인 패턴 - 프록시 패턴

프록시 패턴(Proxy Pattern)

  • 대리자, 대변인
  • 누군가를 대신해 그 역할을 수행

프록시 적용전

public class ClientWithNoProxy {
    public static void main(String[] args) {
        // 프록시를 이용하지 않은 호출
        Service service = new Service();
        System.out.println(service.runSomething());
    }
}
public class Service {
    public String runSomething() {
        return "서비스 짱!!!";
    }
}
  • Service 객체의 runSomething() 메서드 직접 호출

프록시 적용 후

public class Service implements IService {
    public String runSomething() {
        return "서비스 짱!!!";
    }
}
public class Proxy implements IService {
    IService service1;
    
    public String runSomething() {
        System.out.println("호출에 대한 흐름 제어가 주목적, 반환 결과를 그대로 전달");
        service1 = new Service();
        return service1.runSomething();
    }
}
public interface IService {
    String runSomething();
}
public class ClientWithProxy {
    public static void main(String[] args) {
        
        // 프록시를 이용한 호출
        IService proxy = new Proxy();
        System.out.println(proxy.runSomething());
    }
}

  • 실제 서비스와 클라이언트 사이에 대리자(프록시) 를 두어, 특정 로직을 실행한 후, 실제 객체의 메서드 호출 혹은 반대의 작업 가능

구성

  1. 실제 서비스 객체 (Service)
    • 실제 로직이 구현되어있음.
  1. 대리자 객체 ( Proxy )
    • 실제 서비스 객체의 메서드 호출, 추가 로직 수행가능
  1. 인터페이스 ( IService )
    • 대리자와 실제 서비스 객체가 구현해야할 메서드를 정의함

작동

  1. 메서드 호출
    • 클라이언트가 대리자의 메서드 호출
  1. 메서드 가로채기
    • 대리자가 호출을 가로채어 추가적인 로직 수행
  1. 실제 메서드 호출
    • 이후 대리자가 실제 서비스 객체의 메서드 호출
  1. 메서드 호출 결과 변환
    • 실제 서비스 객체의 메서드 호출 결과를 클라이언트에게 반환

중요 포인트

  1. 대리자는 실제 서비스와 같은 이름의 메서드 구현
  1. 인터페이스를 사용함.
  1. 실제 서비스의 참조 변수를 가짐
  1. 대리자는 추가적인 로직 수행 후 실제 서비스의 메서드를 호출하고 해당 값을 클라이언트에게 반환
  1. 프록시 패턴은 OCP + DIP 적용 설계 패턴
    • 개방 폐쇄 원칙
      • 기존의 코드를 변경하지 않고 새로운 기능 추가가능
      • 마티즈나 쏘나타 등 차량들은 IService 같은 인터페이스를 구현함으로, 차량의 종류를 바꿔도 프록시 패턴이 영향을 받지 않는다.
    • 의존 역전
      • 상위 모듈이 하위 모듈에 의존 X
      • 특정 모듈이 IService 인터페이스를 구현함으로서, 종류를 변경해도 프록시 패턴의 영향을 미치지 않음.


Uploaded by N2T