Java/Spring

Proxy 패턴

코딩공부 2025. 3. 12. 02:23

Proxy Pattern은 객체에 대한 접근을 제어하기 위해, 해당 객체를 감싸는(즉, 대리 객체) 역할을 하는 디자인 패턴

 

- 실제 객체에 직접 접근하는 대신 프록시 객체를 통해 간접적으로 접근

- 프록시 객체는 실제 객체를 대신해 특정 작업을 수행하거나, 실제 객체에 대한 접근을 제어 가능 

- 초기화 지연, 접근제어, 로깅, 캐싱 등 다양하게 사용 가능

Proxy 패턴 - 출처: 위키백과

프록시 패턴의 구조

  1. Subject: 실제 객체가 구현해야 하는 인터페이스
    - 프록시 객체와 실제 객체가 공유하는 공통의 인터페이스로, 프록시 객체는 이 인터페이스를 구현
  2. RealSubject: 실제로 기능을 수행하는 객체
    - Subject 인터페이스를 구현하여, 실제 비즈니스 로직을 처리
  3. Proxy: Subject 인터페이스를 구현
    - 실제 객체에 대한 접근을 제어
    - 실제 객체를 호출하기 전에 추가적인 작업 가능
// Subject Interface
public interface Subject {
    void request();
}

// 실제 객체
public class RealSubject implements Subject {
    @Override
    public void request() {
        System.out.println("Subject: Handling request");
    }
}

// Proxy 클래스
public class Proxy implements Subject {
    private Subject subject;

    @Override
    public void request() {
        // 요청을 가로채서 추가적인 작업을 수행하거나, 조건에 따라 접근을 제어
        if (realSubject == null) {
            realSubject = new RealSubject(); // Lazy Loading
        }
        System.out.println("Proxy: Performing additional work before forwarding request");
        realSubject.request(); // 실제 객체에 요청을 전달
    }
}

// 클라이언트
public class Client {
    public static void main(String[] args) {
        Subject proxy = new Proxy(); // Proxy 객체를 통해 실제 객체에 접근
        proxy.request();
    }
}

 

프록시 패턴의 장점

  • 유연한 접근 제어: 객체에 대한 접근을 제어할 수 있으며, 이를 통해 보안, 권한 관리, 트랜잭션 관리 등을 추가 가능
  • 지연 로딩: 실제 객체의 초기화를 지연시켜 리소스를 절약 가능
  • 기능 확장: 실제 객체의 기능을 변경하지 않고 프록시 객체에서 추가적인 기능을 제공
  • 성능 최적화: 캐싱과 같은 기법을 사용해 성능을 최적화

프록시 패턴의 단점

  • 복잡도 증가: 프록시 객체가 추가되면 설계가 복잡
  • 성능 오버헤드: 프록시 객체를 거쳐야 하기 때문에 성능에 약간의 오버헤드가 발생
    - 특히, 프록시가 복잡한 작업을 할 경우 성능이 저하

프록시 패턴의 사용 사례

  • AOP (Aspect-Oriented Programming):
    - Spring과 같은 프레임워크에서 트랜잭션 관리, 보안, 로깅 등 부가적인 기능을 핵심 비즈니스 로직에 적용할 때 사용
    - Spring의 @Transactional이 프록시 패턴을 사용해 트랜잭션을 관리하는 방식
  • 리모트 호출: 원격 서버에 위치한 객체에 접근할 때 프록시를 사용하여 네트워크 통신을 관리
  • 리소스 최적화: 데이터베이스 연결, 파일 시스템 등 리소스를 최적화하기 위해 가상 프록시를 사용