1. 프록시 패턴 (Proxy Pattern)
1️⃣ 프록시 패턴이란?
1) 개념
어떤 객체에 직접 접근하지 않고, 대리 객체(Proxy) 를 통해 접근하도록 만드는 디자인 패턴
2) 동작 구조
Client → Proxy → Real Object3) 목적
- 실제 객체에 대한 접근을 제어하기 위해 사용됨
✔ 접근 제어
✔ 성능 최적화
✔ 지연 로딩
✔ 로깅 / 캐싱 / 보안 처리
2️⃣ 기본 구조 (Structure)
1) 구성 요소
구성 | 역할 |
Subject | 공통 인터페이스 |
RealSubject | 실제 객체 |
Proxy | RealSubject 대신 동작하는 대리 객체 |
Client | Subject를 사용하는 사용자 |
2) 구조 흐름
- Client는 RealSubject를 직접 모름
- Proxy를 통해 요청
- Proxy가 제어 로직 수행
- 필요 시 RealSubject 호출
3️⃣ 핵심 아이디어
1) 프록시의 본질
"실제 객체에 접근하기 전 중간에서 통제하는 객체"
4️⃣ 주요 사용 유형 (프록시 종류)
1) Virtual Proxy (가상 프록시)
- 무거운 객체 생성 지연
- Lazy Loading
- 예시
- 이미지 로딩
- 대용량 데이터
if(realObject == null){
realObject = new RealObject();
}
realObject.request();2) Protection Proxy (보호 프록시)
- 접근 권한 제어
- 인증 / 인가
- 예시
- 관리자만 접근 가능 기능
if(user.isAdmin()){
realObject.request();
}3) Remote Proxy (원격 프록시)
- 다른 주소 공간 객체 접근
- 네트워크 호출 추상화
- 예시
- RPC
- API Client
4) Smart Proxy (스마트 프록시)
- 부가 기능 수행
- 로깅 / 캐싱 / 참조 카운팅
log("요청 시작");
realObject.request();
log("요청 종료");5️⃣ 간단 예제 (Java 스타일)
1) Subject 인터페이스
interface Service {
void request();
}2) RealSubject
class RealService implements Service {
public void request() {
System.out.println("실제 작업 수행");
}
}3) Proxy
class ProxyService implements Service {
private RealService realService;
public void request() {
System.out.println("접근 제어 / 로깅");
if(realService == null){
realService = new RealService();
}
realService.request();
}
}4) Client
Service service = new ProxyService();
service.request();6️⃣ 프록시 패턴의 장단점
1) 장점
- 실제 객체 보호 가능
- 책임 분리 (SRP)
- 성능 최적화 가능
- 부가 기능 확장 쉬움
2) 단점 👎
- 구조 복잡도 증가
- 클래스 수 증가
- 디버깅 어려움 가능
7️⃣ 프록시 vs 데코레이터 차이
구분 | 프록시 | 데코레이터 |
목적 | 접근 제어 | 기능 확장 |
초점 | 통제 / 보호 | 행동 추가 |
사용 맥락 | 보안 / 지연 로딩 | 기능 조합 |
8️⃣ 그림으로 이해하기

2. 실습 (ex02)
1️⃣ 프록시 패턴 (Proxy Pattern)
Doorman에게 지갑검사도 시키고 싶어!
→ Doorman의 책임이 늘어남
→ 기존 Doorman을 수정하는 건 좋지 않음 (OCP 위반)
→ DoormanProxy 만들어서 책임 추가
1) DoormanProxy.java
C:\workspace\java_lab\designapp\src\ex02\DoormanProxy.java
package ex02;
public class DoormanProxy extends Doorman {
// Doorman 아닌데 Doorman인 척!
@Override
public void 쫓아내(Animal a) {
System.out.println("지갑 검사");
super.쫓아내(a);
}
}2) App.java
C:\workspace\java_lab\designapp\src\ex02\App.java
package ex02;
public class App {
public static void main(String[] args) {
Tiger tiger = new Tiger();
Mouse mouse = new Mouse();
Doorman doorman = new DoormanProxy();
doorman.쫓아내(mouse);
}
}3) 결과

Share article