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 실행절차
-
- 클라이언트가 Subject 인터페이스를 통해 method호출
-
- 프록시 객체가 method 호출을 받아 필요한 경우 RealSubject 객체를 생성하거나 접근
-
- 프록시 객체가 RealSubject의 method를 호출하기 전 필요한 작업을 수행(전처리)
-
- RealSubject에게 실제 method 호출이 위임됨
-
- RealSubject가 작업을 수행하고 결과를 프록시에게 반환
-
- 프록시가 결과를 클라이언트에게 반환전 가공 작업을 수행(필요한 경우)
-
- 클라이언트는 프록시를 통해 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/