TroubleShooting & Study/Architecture & Design Pattern

[Proxy Pattern] 프록시 패턴

DH_0518 2024. 5. 3. 10:07

 

Proxy

 

 

영어로 Proxy는 '대리', '대리인' 이라는 뜻을 가지고 있다. 뜻 그대로 프록시 패턴이란, 원본 객체에 직접적으로 접근 하는 것이 아니라 어떤 '대리자'를 통해서 간접적으로 원본 객체를 사용하는 것을 말한다.

 

 

그림을 통해 자세히 알아보자

Proxy Pattern

 

인터페이스를 구현한 'Origin Object'와 'Proxy Object'가 있다. 'Proxy Object'는 'Origin Object'를 컴포지션하여 멤버 변수로 사용하고있다. 이때 Client에서 요청이 온다면 다음처럼 작동 할 것이다.

  1. Client에서 Request를 보냄
  2. Controller를 거친 뒤, 'Origin Object'가 아닌 'Proxy Object'를 호출
  3. 'Proxy Object'는 method A를 구현하고, 기타 작업을 수행 후 'Origin Object'의 method A를 호출
  4. 결과 return

 

 

 

 

Proxy Pattern

 

위의 그림에서 봤듯이 프록시 패턴은 특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴을 말한다. 그렇다면 원본 객체에 곧 바로 접근하여 기능을 추가하지 않고, 번거롭게 대리자를 통해 간접적으로 접근하는 이유가 무엇인지, 구조는 어떻게 되어있는지를 알아보자

 

 

(* 아래의 대상은 원본 객체를 의미)

Proxy Pattern의 장점, 활용

  • 기존 코드의 변경 없이 새로운 기능을 추가할 수 있다 (OCP 원칙)
  • 이로 인해 기존 코드는, 부가 기능 없이 본래 기능만 하도록 유지할 수 있다 (SRP 원칙)
  • 보안(Security)
    • Client가 작업을 수행할 수 있는 권한이 있는지 확인하고, 권한이 있는 경우에만 요청을 대상으로 전달할 수 있다
  • 캐싱(Caching)
    • 내부 캐시를 유지하여, 데이터가 캐시에 아직 존재하지 않는 경우에만 대상으로 요청을 넘긴다
    • 이를 통해 동일한 요청에 대해 다시 서비스 로직을 수행하지 않고 캐시된 결과를 반환시킬 수 있다
  • 데이터 유효성 검사(Data validation)
    • Client에서 넘어온 입력이, 대상으로 전달되기 전에 유효성 검사를 할 수 있다
  • 지연 로딩(Lazy Loading)
    • 대상의 생성 비용이 비싸다면, 실제로 대상이 사용되기 전까지 호출을 연기할 수 있다
  • 로깅(Logging)
    • 프록시가 클라이언트와 대상 사이에 위치하여, 메서드 호출을 인터셉트하고 이를 기록할 수 있다
    • 이를 통해 각 메서드의 호출 시간, 매개변수, 반환값 등을 기록하여 디버깅이나 성능 모니터링에 활용할 수 있다
  • 원격 객체(Remote objects)
    • 대상이 다른 주소 공간(서버)에 있거나 네트워크를 통해 접근해야 할 때, 원격 위치에 있는 객체를 가져와서 로컬처럼 보이게 할 수 있다
    • 이를 통해 네트워크 통신의 복잡성을 숨기고 클라이언트가 마치 로컬 객체를 사용하는 것처럼 편리하게 접근할 수 있다

 

 

Proxy Pattern의 구조

  • Subject: Proxy와 Real Subject를 하나로 묶는 인터페이스
    • 대상과 프록시를 동일하게 해주는 추상 메서드 'operation()' 을 정의한다
    • 클라이언트는 인터페이스를 통해 통신하기에, Proxy와 Real Subject를 의식할 필요가 없다(즉, 몰라도 된다)
  • RealSubject: 원본 객체로, '대상' 이라고 부른다
  • Proxy: 대상 객체(RealSubject)를 중계하는 대리자 객체
    • 프록시는 대상을 composition한다
    • 프록시는 대상과 같은 이름의 메서드(인터페이스에 정의된 메서드)를 호출하며, 별도의 로직을 수행할 수 있다
    • 프록시는 흐름 제어만을 할 뿐, 결과값을 조작하거나 변경시키면 안된다. 결과의 변화가 없는 추가적인 로직은 가능하다

 

 

Proxy 구현

  1. interface의 구현체인 실제 객체를 생성
  2. 이후, 또다른 interface의 구현체이자 우리가 사용할 프록시 객체를 생성
  3. 프록시 객체에서 composition으로 실제 객체를 필드로 선언
  4. 프록시 객체에서 내가 원하는 추가적인 동작을 구현하고, 실제 객체의 method를 사용

백기선님 강의 영상 코드

 

 

 

 

 

 

 

Proxy Pattern vs Decorator Pattern

 

 

 

디자인 패턴중에 Decorator Pattern은 Proxy Pattern과 비슷하기에 둘을 헷갈릴 수 있다.

하지만 'GoF(Gang of Four) 디자인 패턴'에 따르면, Proxy Pattern과 Decorator Pattern 모두 Proxy 개념을 사용하고 구현 방법 역시 동일한 디자인 패턴이지만 의도에 따라 둘을 구분하고 있다.

 

 

Proxy Pattern vs Decorator Pattern

  • Proxy Pattern
    • 접근 제어와 부가적인 기능 추가를 목적으로 한다
  • Decorator Pattern
    • 런타임시에 원본 객체에 기능을 동적으로 추가하려는 목적으로 사용한다
    • 부가적인 기능이 아닌, 기존 기능의 확장에 집중한다

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Reference

 

[스프링 핵심 원리 고급편(3)] : 프록시 패턴(Proxy Pattern)

☁️ 들어가기 로그 추적기의 수정을 최소화하기 위해, 템플릿 메서드 패턴과 콜백 패턴까지 도입하였다. 하지만 결과적으로 수백개의 클래스에 로그를 남기고 싶다면 모두 고쳐야 한다는 단점

velog.io

 

💠 프록시(Proxy) 패턴 - 완벽 마스터하기

Proxy Pattern 프록시 패턴(Proxy Pattern)은 대상 원본 객체를 대리하여 대신 처리하게 함으로써 로직의 흐름을 제어하는 행동 패턴이다. 프록시(Proxy)의 사전적인 의미는 '대리인'이라는 뜻이다. 즉, 누

inpa.tistory.com