[Java] 디자인패턴 : 프록시(Proxy) 패턴

프록시는 클라이언트와 실제 객체 사이에 위치하여 클라이언트가 직접 실제 객체에 접근하지 못하게 하며, 필요에 따라 접근을 허용하거나 제어한다.
HootJem's avatar
Aug 13, 2024
[Java] 디자인패턴 : 프록시(Proxy) 패턴

1. 프록시 패턴이란?

💡
디자인 패턴 중 하나로, 특정 객체에 대한 접근을 제어하기 위해 그 객체의 대리인(프록시) 역할을 하는 객체를 사용하는 패턴이다. 프록시 패턴은 원래 객체에 대한 접근을 제어하거나, 접근을 지연시킬 때, 또는 원래 객체의 기능을 확장할 때 유용하게 사용된다.
 

2. 프록시 패턴의 주요 개념

2.1 프록시

원래 객체에 대한 접근을 제어하는 역할을 함. 프록시는 클라이언트와 실제 객체 사이에 위치하여 클라이언트가 직접 실제 객체에 접근하지 못하게 하며, 필요에 따라 접근을 허용하거나 제어한다.

2.2 실제 객체

프록시가 대신 접근을 제어하는 실제 객체로 모든 실제 작업은 이 객체가 수행한다.

2.3 클라이언트

프록시를 통해 실제 객체에 접근하는 객체로, 클라이언트는 프록시를 통해 실제 객체의 메서드를 호출한다.
클라이언트는 실제 객체와 직접 상호작용하지 않으며, 프록시를 통해 간접적으로 접근한다.

3. 예제

아래의 예제에서는 동물을 내쫓는 역할을 하는 Doorman 클래스와, 이 역할을 대신 수행하면서 추가적인 기능을 제공하는 DoormanProxy 클래스를 구현함.
public abstract class Animal { //추상 클래스 abstract String getName(); } public class Doorman { //실제 객체 역할을 하는 Doorman 클래스 public void getOut(Animal a){ System.out.println(a.getName()+"getOut!"); } } public class DoormanProxy { // 프록시 역할 private Doorman doorman; public DoormanProxy(Doorman doorman) { this.doorman = doorman; } public void getOut(Animal a){ System.out.println("Doorman 전에 추가 작업을 프록시에서 수행"); doorman.getOut(a); // 실제 Doorman 객체에 작업 위임 } } public class Mouse extends Animal { private String name = "쥐"; public String getName() { return name; } } public class Tiger extends Animal { private String name = "호랑이"; public String getName() { return name; } } // 클라이언트 코드 public class App { public static void main(String[] args) { Mouse m = new Mouse(); // -> mouse, animal DoormanProxy doormanProxy = new DoormanProxy(new Doorman()); // doormanProxy 가 Doorman 을 의존하고 있으므로 괄호에 Doorman 넣어야함 doormanProxy.getOut(m); //프록시를 통해 쥐를 내쫓음 } }

3.1 예제 설명

  • Doorman: 실제 동물을 내쫓는 역할을 하는 클래스
  • DoormanProxy: Doorman 객체에 대한 프록시로, Doorman이 하는 일을 대신 수행하면서 추가적인 작업(예: 메시지 출력)을 수행한다. 이를 통해 프록시 패턴이 실제 객체의 기능을 확장하거나 제어할 수 있는 방법을 보여줌.
  • 클라이언트: DoormanProxy를 사용하여 Mouse 객체를 내쫓는다. 클라이언트는 실제 Doorman 객체와 직접 상호작용하지 않으며, 프록시를 통해 간접적으로 접근한다.
 

3.2 프록시 패턴의 장점

  • 접근 제어: 프록시를 통해 객체에 대한 접근을 제어할 수 있다. 예를 들어, 접근 권한을 확인하거나 객체 생성을 지연시킬 수 있다.
  • 기능 확장: 프록시는 실제 객체에 추가적인 기능을 부여할 수 있다. 예를 들어, 메서드 호출 전에 로깅을 하거나, 호출 후 캐싱을 하는 등의 작업이 가능함.
  • 성능 최적화: 실제 객체의 생성이나 호출이 비용이 많이 들 때, 프록시를 통해 성능을 최적화할 수 있다.
 
Share article

[HootJem] 개발 기록 블로그