[디자인 패턴] 2. Proxy 패턴

김주희's avatar
Jul 23, 2025
[디자인 패턴] 2. Proxy 패턴
프록시가 어디 쓰이는지 사례 찾아보기 (프로그래밍에서)
 
notion image
예시 코드와 함께 이해해보자
 
Cat, Mouse, Animal, Doorman은 이전의 전략 패턴의 클래스와 동일하다.
지금 나는 Doorman에게 쫓아내라는 책임 전에 안녕이라고 인사를 하도록 책임을 부여하고 싶은 상황이다. Doorman의 쫓아내 라는 메서드 내부에서 System.out.println("안녕");을 추가할 수 있겠으나 이렇게 되면 기존의 Doorman을 수정하게 되고, 이는 OCP를 위배하는 것이다. (SRP는 위배까지는 아니고 단일 책임만 갖도록 노력하는 것)
 
OCP를 위배하지 않고 안녕이라고 인사하는 책임을 추가하려면 어떻게 해야할까?
이때 Proxy 패턴이 적용된다.
DoormanProxy 클래스를 만들어서 인사하는 책임을 추고 Doorman은 여전히 쫓아내는 책임만 갖도록 한다. 즉 책임을 분리하는 것이다. 이렇게 하면 OCP도 위배하지 않고 책임은 분리된 구조로 설계가 가능하다.
 
프록시 패턴 적용 방식에는 두 가지가 있다.
먼저 composition 방식과 extends 방식인데 후자는 비추천한다. 프록시 패턴이 적용되는 다양한 경우가 있겠지만 우리의 예시 사장님과 비서, 문지기와 문지기 프록시의 예시로 볼 때, 사장님은 비서가 아니고 문지기 프록시는 문지기가 아니다. 따라서 말이 맞지 않고 문지기는 문지기 프록시를 가진다고 보는 것이 맞다. 따라서 모든 경우에 extends 방식을 적용하기 보다 말이 되는 경우에만 extends 방식을 적용하고 기본적으로는 composition 방식이 적절하다고 볼 수 있다.
 

1. composition 방식

package ex02; public class DoormanProxy { private Doorman doorman; // has public DoormanProxy(Doorman doorman) { this.doorman = doorman; } public void 쫓아내(Animal animal) { System.out.println("안녕"); doorman.쫓아내(animal); } }
 
 
package ex02; public class App { public static void main(String[] args) { // 1. init Mouse m1 = new Mouse(); Doorman d1 = new Doorman(); Cat c1 = new Cat(); DoormanProxy dp = new DoormanProxy(d1); // 2. run dp.쫓아내(m1); dp.쫓아내(c1); } }
 
추후 동물 문지기, 곤충 문지기 등 많아지면 Doorman도 추상화 시킨다.
 

2. extends 방식

extends 방식도 가능은 하다. 그러나 DoormanProxy와 Doorman이 같지는 않다. 사장님과 비서는 다르니까. 즉 말이 되는 경우에만 extends 방식을 사용하도록 하자.
package ex02; public class DoormanProxy extends Doorman{ // extends 방식 public void 쫓아내(Animal animal) { System.out.println("안녕"); super.쫓아내(animal); } }
 
 
 
 
 
 
 
 
+) 스프링은 타입으로 찾아서 DI 해줌
 
Share article

jay0628