Proxy 알아보기

이건우·2025년 3월 30일

웹 프로그래밍

목록 보기
38/43

프록시란?

대상(원본 객체)을 대신해서 어떤 일을 처리해주는 대리 객체 를 생성해서 실행하는 등,
원래 객체의 앞에서 중간 역할을 하는 껍데기로 감싸서,
제어, 로깅, 보안, 트랜잭션, 성능 최적화 등의 여러가지 작업들을
가로채서 처리하는 패턴, 즉 이러한 방식으로 작동하게 하는
가로채서 대신 수행하며 앞뒤로 필요한 역할을 수행하는 패턴을 프록시 라고 합니다.

왜 프록시를 사용할까?

프록시는 단순히 원본 객체를 감싸는 데 그치지 않고, 원본 객체에 접근하기 전후로 다양한 부가 작업을 수행할 수 있기 때문에 자주 사용됩니다.
ex)

  • 접근 제어
    어떤 사용자가, 어떤 조건에서, 어떤 기능에 접근할 수 있는지를 제어하여,
    보안과 권한 관리를 핵심 로직과 분리해서 처리

  • 로깅 및 모니터링
    메서드 실행 전후로 로그를 남기거나, 실행 시간 측정

  • 성능 최적화

    • 캐싱 (Caching) : 같은 요청이 반복된다면, 이전 결과를 저장해두고 재사용
    • 지연 로딩: 리소스가 큰 객체를 실제로 필요할 때까지 만들지 않음
  • 트랜잭션 처리
    데이터베이스 작업 중 문제가 생기면 롤백하고,
    정상적으로 끝나면 커밋하는 로직을 앞뒤로 끼워넣음

  • 원격 호출
    프록시가 네트워크 통신을 감추고, 클라이언트가 로컬 객체처럼 사용

프록시 패턴의 구성 요소

Subject (인터페이스 또는 추상 클래스)

실제 객체(RealSubject)와 프록시(Proxy)가 모두 구현하거나 상속하는 공통 타입입니다.
클라이언트는 이 공통 타입만 보고 사용할 수 있기 때문에, 프록시가 끼어들 수 있게 됩니다.

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에 분리

단점

  • 구조가 복잡해질 수 있음
    모든 객체에 대해 별도의 프록시 클래스를 만들어야 할 수도 있음

  • 디버깅 어려움
    중간에 프록시가 껴있기 때문에 호출 흐름이 헷갈릴 수 있음


프록시 = 유지보수성과 확장성을 높여주는 중요한 아키텍처 도구!

profile
새싹개발자

0개의 댓글