950 words
5 minutes
[design-pattern]Proxy Pattern

Overview#

프록시 패턴에 대헤 간단히 정리

01. Proxy Pattern#

  • 프록시 패턴은 객체에 대한 접근을 제어하기 위해 사용되는 디자인 패턴
  • 다른 객체에 대한 접근을 제어하기 위해 대리 객체(Proxy) 혹은 자리표시자를 제공
  • 기본적으로 실제 객체에 직접 접근하는 대신 프록시를 통해 접근하는 것이 핵심

02. Proxy Pattern 구성#

  • Subject interface는 실제 객체와 프록시가 구현해야 하는 인터페이스. 해댱 인터페이스를 통해 클라이언트가 실제 객체와 프록시를 동일하게 사용할 수 있도록 함
  • RealSubject는 실제 작업을 수행하는 객체
  • Proxy는 실제 객체에 대한 참조를 가지면서 Subject 인터페이스를 구현. 일종의 중재자 역할을 하면서 적절한 시점에 RealSubject에 작업을 위임

03. Proxy Pattern 종류#

  • Virtual Proxy: 실제 객체를 지연 로딩하거나 캐싱
  • Remote Proxy: 네트워크를 통해 원격 객체에 접근
  • Protection Proxy: 권한 제어
  • Smart Reference Proxy: 객체의 참조를 관리하고 추가 기능을 제공

Concept

  • Proxy Pattern : 다른 객체에 대한 접근을 제어하기 위해 대리자를 제공하는 구조적 디자인 패턴
  • Subject Interface : 실제 객체와 프록시 객체가 공통으로 구현하는 인터페이스로 투명성 제공
  • RealSubject : 실제 작업을 수행하는 객체로 클라이언트가 최종적으로 사용하고자 하는 기능 보유
  • Proxy Class : 실제 객체에 대한 참조를 가지며 접근을 제어하고 추가 기능을 제공
  • Virtual Proxy : 비용이 많이 드는 객체의 생성을 필요한 시점까지 지연시키는 프록시
  • Remote Proxy : 다른 주소 공간에 있는 객체에 대한 로컬 대표자 역할의 프록시
  • Protection Proxy : 접근 권한을 제어하여 보안을 담당하는 프록시
  • Smart Reference Proxy : 객체 접근 시 추가적인 기능을 제공

04. Proxy Pattern 실행절차#

    1. 클라이언트가 Subject 인터페이스를 통해 method호출
    1. 프록시 객체가 method 호출을 받아 필요한 경우 RealSubject 객체를 생성하거나 접근
    1. 프록시 객체가 RealSubject의 method를 호출하기 전 필요한 작업을 수행(전처리)
    1. RealSubject에게 실제 method 호출이 위임됨
    1. RealSubject가 작업을 수행하고 결과를 프록시에게 반환
    1. 프록시가 결과를 클라이언트에게 반환전 가공 작업을 수행(필요한 경우)
    1. 클라이언트는 프록시를 통해 RealSubject의 기능을 사용

Concept

  • 투명성 : 클라이언트가 프록시와 RealSubject를 구분하지 않고 동일하게 사용할 수 있는 특성
  • 중재자 : 프록시가 클라이언트와 RealSubject 사이에서 중재 역할을 수행
  • 지연생성 : 실제 객체의 생성을 필요한 시점까지 지연시키는 기법. 지연생성을 하는 이유느 비용이 많이 드는 객체의 생성을 최적화하기 위함
  • 전처리/후처리 : 프록시가 실제 작업 전후에 수행하는 추가적인 로직
  • 접근제어 : 프록시가 실제 객체에 대한 접근을 관리 및 제한
  • Adapter vs Proxy : Adapter는 인터페이스 변환이 목적, Proxy는 같은 인터페이스로 접근 제어가 목적

05. Proxy Pattern : Java#

  • subject interface
public interface BookService {
Book getBookById(String bookId);
double getBookPrice(String bookId);
}
  • real subject
public class DataBookService implements BookService {
@Override
public Book getBookById(String bookId) {
// 실제 데이터베이스나 외부 API에서 책 정보를 가져오는 로직
return new Book(bookId, "Sample Book", 29.99);
}
[design-pattern]Proxy Pattern
https://yjinheon.netlify.app/posts/01programming/design-pattern/design-pattern-proxy/
Author
Datamind
Published at
2024-07-14
License
CC BY-NC-SA 4.0