13-2. 프록시 패턴 (Proxy Pattern)

박은서's avatar
Feb 24, 2026
13-2. 프록시 패턴 (Proxy Pattern)

1. 프록시 패턴 (Proxy Pattern)

1️⃣ 프록시 패턴이란?

1) 개념

어떤 객체에 직접 접근하지 않고, 대리 객체(Proxy) 를 통해 접근하도록 만드는 디자인 패턴

2) 동작 구조

Client → Proxy → Real Object

3) 목적

  • 실제 객체에 대한 접근을 제어하기 위해 사용됨
✔ 접근 제어
✔ 성능 최적화
✔ 지연 로딩
✔ 로깅 / 캐싱 / 보안 처리

2️⃣ 기본 구조 (Structure)

1) 구성 요소

구성
역할
Subject
공통 인터페이스
RealSubject
실제 객체
Proxy
RealSubject 대신 동작하는 대리 객체
Client
Subject를 사용하는 사용자

2) 구조 흐름

  1. Client는 RealSubject를 직접 모름
  1. Proxy를 통해 요청
  1. Proxy가 제어 로직 수행
  1. 필요 시 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️⃣ 그림으로 이해하기

notion image

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) 결과

notion image
Share article