프록시 패턴 (Proxy Pattern)
Proxy는 대리인을 뜻하는 것으로, 청와대의 대변인을 생각하면 쉽습니다. 청와대 대변인들은 본인 의견을 말하기 보다 입장을 대리해서 이야기하는데, 이 개념이 엔티티에 적용되었다고 생각하면 됩니다.
프록시 패턴은 Service 메서드가 가진 메서드와 같은 이름을 사용하는데, 이를 위해 인터페이스를 이용합니다. 즉, 인터페이스로 구현을 강제하는 것이지요. 이로 같은 이름의 메서드가 구현되는데, 클라이언트는 실제 서비스 객체로 값을 받는지 프록시로 값을 받는지 알 수 없습니다.
여기서 중요한 포인트가 존재합니다. 대변인은 공식 입장문에 자신의 이야기를 추가하지 않지요? 그것처럼 프록시 패턴도 반환되는 결과 값을 그대로 반환할 뿐, 절대 무언가를 가감하지 않고 순수하게 제어의 흐름을 변경하거나 다른 로직을 사용하기 위해 사용됩니다.
즉, 제어 프름을 조정하기 위한 목적으로 중간에 Proxy를 두는 패턴입니다.
중요한 포인트를 살펴보겠습니다.
- Proxy는 인터페이스를 상속 받아 실제 서비스와 같은 이름의 메서드를 구현합니다.
- Proxy는 실제 서비스에 대한 참조변수를 가지며, 실제 서비스가 구현된 클래스의 인스턴스를 생성합니다.
- Proxy는 실제 서비스의 이름을 가진 메서드를 호출해 값을 클라이언트에게 반환합니다.
- Proxy는 실제 서비스 메서드 호출 전/후 별도의 로직을 수행할 수 있습니다.
- Proxy 패턴은 반환 값의 변환을 목적으로 하지 않고, 오롯이 제어의 흐름을 바꾸거나 다른 로직을 수행하기 위해 사용됩니다.
프록시 패턴의 UML
- 위 포인트에서 언급했듯, Proxy는 실제 서비스. 즉, RealSubject에 대한 참조변수를 가집니다.
- 또한 Proxy와 RealSubject는 동일한 Interface로 구현되기에 RealSubject가 들어가는 자리라면 어디든 Proxy를 사용할 수 있습니다.
[ Polymorphism 적용됨 ] - 클라이언트는 이러한 Proxy를 활용해 RealSubject와 데이터를 통신합니다.
프록시 패턴 장/단점
- 장점
기본 객체의 리소스가 무거운 경우, Proxy 객체에서 처리해 부하를 줄일 수 있습니다.
기본 객체를 수정하지 않고, 클라이언트에서의 사용과 기본 객체 사이에 일련의 로직을 프록시 객체를 통해 넣을 수 있습니다.
프록시 객체는 기본 객체와 클라이언트 사이에 존재해 일종의 방패 역할을 하기도 합니다. - 단점
중간에 프록시 객체가 존재해 간혹 응답이 느릴 수 있습니다.
프록시 패턴의 활용
- Virtual Proxy
주체 클래스(RealSubject) 가 리소스 집약적인 경우 사용함
만약 주체 클래스가 해상도 높은 이미지를 처리한다고 하였을 때, 이를 인스턴스화 한다면 많은 메모리를 차지하게 됨. 이때 자잘한 작업을 Proxy로 처리하며, 이외에 것들은 주체 클래스에서 처리하도록 함. - Protection Proxy
주체 클래스(RealSubject) 접근을 제어하기 위한 경우
Client의 접근 권한을 파악해 Proxy는 해당 클라이언트가 RealSubject에 접근을 허용할지 말지 결정할 수 있으며, 접근 권한에 따라 주체 클래스의 메소드를 호출하도록 구현할 수 있음 - Remote Proxy
Proxy 클래스는 local에, 주체 클래스(RealSubject)는 원격(Remote)에 존재하는 경우
대표적 예시로 Google Docs. 브라우저는 브라우저대로 필요한 자원을 Local에 두고, 또 다른 일부 자원은 Google 서버에 있는 형태
프록시 패턴 활용 예제
정리
- 다형성을 갖도록 디자인해 클라이언트가 하나의 인터페이스에 접근할 수 있으며
- 리소스 집약적 객체가 실제로 필요해질 때까지 간단한 프록시 클래스로 전처리와 같은 작업을 수행할 수 있음 ( Virtual Proxy )
- 클라이언트가 주체 클래스에 접근하는 것에 대한 제한 혹은 클라이언트의 접근 권한에 따라 서로 다른 방식으로 요청이 처리되도록 할 수 있음 ( Protection Proxy )
- 동일한 물리적 또는 가상 공간에 있지 않은 시스템을 로컬에 존재하는 것처럼 표현이 가능함 ( Remote Proxy )
> 어댑터 패턴
참고 자료
yaboong.github.io/design-pattern/2018/10/17/proxy-pattern/
스프링 입문을 위한 자바 객체 지향의 원리와 이해
'Development > Spring Framework' 카테고리의 다른 글
스프링디자인패턴(4) 싱글턴 패턴 - Singleton Pattern (0) | 2021.04.02 |
---|---|
스프링 삼각형과 설정 정보 (2) AOP (0) | 2021.03.28 |
스프링 삼각형과 설정 정보 (1) IoC/DI (0) | 2021.03.28 |
스프링디자인패턴(3) 데코레이터 패턴 - Decorator Pattern (0) | 2021.03.25 |
스프링 디자인패턴(1) 어댑터 패턴 - Adapter Pattern (0) | 2021.03.23 |