2. 프록시 패턴(Proxy Pattern)

  • 프록시란?

    대리자, 대변인의 뜻을 가지고 있는 단어.

    즉, 다른 누군가를 대신해 그 역할을 수행하는 존재를 말합니다.

  • 대변인 처럼 자신의 입장을 가감해서 값을 변경하는게 목적이 아닌, 제어의 흐름을 변경하거나 다른 로직을 중간에 실행하기 위해서 사용합니다.

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

  • 인터페이스를 중간에 두고 타이어를 교체하는 설계구조(DIP)와 자동차 인터페이스 아래에 자동차 종류를 두는 구조(OCP) 를 적용한 것이 프록시 패턴


  • 프록시의 주요 기능

    • 접근 제어

      • 권한에 따른

      • 캐싱

      • 지연 로딩

    • 부가 기능 추가

      • 원래 서버가 제공하는 기능에 더해 부가 기능 수행

      • ex : 요청 값 / 응답 값을 중간에 변형

      • ex : 실행시간 측정 및 로그 남기기 등

    • 단점 : 생성해야 할 클래스가 너무 많음.


  • 대체가능

    • 객체에서 프록시가 되려면 클라이언트는 서버에게 요청한 것인지, 프록시에게 요청한 것인지 조차 몰라야함. → 서버와 프록시는 같은 인터페이스를 사용해야함.

    • 서버와 프록시가 같은 인터페이스 사용 → 서버 객체를 프록시 객체로 변경해도 클라이언트 코드를 변경하지 않고 동작할 수 있어야함.

  • 서버와 프록시가 같은 인터페이스 사용

    • 위 그림에서 Client는 ServerInterface 인터페이스에만 의존함(서버와 프록시는 같은 인터페이스 사용)

      → DI를 사용해서 대체 가능

    • Client → Server 관계에서 Client → Proxy → Server로 의존관계를 변경해도 클라이언트 코드를 전혀 변경하지 않아도 됨.

  • GOF 디자인 패턴

    • GOF 디자인 패턴에서는 의도(intent)에 따라 proxy pattern과 decorator pattern으로 구별함. (데코레이터 패턴도 프록시를 사용함)

      • proxy : 접근 제어가 목적

      • decorator : 새로운 기능 추가가 목적

  • (예제) V1 App 인스턴스 의존 관계

  • (예제) V1 프록시 의존 관계

  • 프록시 런타임 객체 의존 관계 설정

    • 프록시를 실제 스프링 빈 대신 등록함

    • 실제 객체는 스프링 빈으로 등록 X

    • 프록시는 내부에 실제 객체를 참조하고 있음.

Last updated