대상(원본 객체)을 대신해서 어떤 일을 처리해주는 대리 객체 를 생성해서 실행하는 등,
원래 객체의 앞에서 중간 역할을 하는 껍데기로 감싸서,
제어, 로깅, 보안, 트랜잭션, 성능 최적화 등의 여러가지 작업들을
가로채서 처리하는 패턴, 즉 이러한 방식으로 작동하게 하는
가로채서 대신 수행하며 앞뒤로 필요한 역할을 수행하는 패턴을 프록시 라고 합니다.
프록시는 단순히 원본 객체를 감싸는 데 그치지 않고, 원본 객체에 접근하기 전후로 다양한 부가 작업을 수행할 수 있기 때문에 자주 사용됩니다.
ex)
접근 제어
어떤 사용자가, 어떤 조건에서, 어떤 기능에 접근할 수 있는지를 제어하여,
보안과 권한 관리를 핵심 로직과 분리해서 처리
로깅 및 모니터링
메서드 실행 전후로 로그를 남기거나, 실행 시간 측정
성능 최적화
트랜잭션 처리
데이터베이스 작업 중 문제가 생기면 롤백하고,
정상적으로 끝나면 커밋하는 로직을 앞뒤로 끼워넣음
원격 호출
프록시가 네트워크 통신을 감추고, 클라이언트가 로컬 객체처럼 사용
실제 객체(RealSubject)와 프록시(Proxy)가 모두 구현하거나 상속하는 공통 타입입니다.
클라이언트는 이 공통 타입만 보고 사용할 수 있기 때문에, 프록시가 끼어들 수 있게 됩니다.
원래의 비즈니스 로직을 담당하는 객체입니다.
RealSubject를 참조하고, 메서드를 대신 호출하며 필요한 전후 부가작업을 수행합니다.
| 종류 | 설명 | 대표 예시 |
|---|---|---|
| 가상 프록시 | 리소스가 큰 객체의 생성을 지연시켜 필요할 때 생성함 (Lazy Initialization) | 대용량 이미지 로딩, 데이터베이스 연결 등 |
| 보호 프록시 | 접근 권한을 제어하기 위한 프록시. 사용자나 역할에 따라 제한 가능 | 관리자 권한 체크, 보안 설정 |
| 원격 프록시 | 원격에 있는 객체에 접근할 수 있도록 도와주는 프록시 | RMI(Remote Method Invocation), RPC |
| 캐싱 프록시 | 이전 결과를 캐시하여 불필요한 작업을 줄이고 성능을 최적화함 | API 결과 캐싱, 이미지/파일 캐싱 |
| 스마트 프록시 | 원본 객체에 추가적인 작업을 수행하는 프록시로, 부가기능 수행 | 로깅, 트랜잭션 처리, 리소스 관리 |
| 동적 프록시 | 런타임에 동적으로 생성되는 프록시로, 인터페이스 기반 또는 바이트코드 조작 기반 | Java의 java.lang.reflect.Proxy, CGLIB |
| 인터셉팅 프록시 | 요청 또는 응답을 가로채고 필터링하거나 변경하는 데 사용됨 | HTTP 요청 필터, 미들웨어 체인 |
원본 코드 수정 없이 부가기능 추가 가능
ex) 보안 검사, 캐싱, 트랜잭션 처리 등
객체 접근 제어 용이
ex) 비용이 많이 드는 객체는 실제 사용할 때만 생성 (Lazy Loading)
단일 책임 원칙(SRP)을 지키기 쉬움
핵심 로직은 RealSubject에, 부가 기능은 Proxy에 분리
구조가 복잡해질 수 있음
모든 객체에 대해 별도의 프록시 클래스를 만들어야 할 수도 있음
디버깅 어려움
중간에 프록시가 껴있기 때문에 호출 흐름이 헷갈릴 수 있음
프록시 = 유지보수성과 확장성을 높여주는 중요한 아키텍처 도구!