프록시 패턴은 어떤 객체를 사용하고자 할 때 객체를 직접적으로 참조하는 것이 아니라, 대행하는 객체를 통해 대상 객체에 접근하는 방식을 말한다.
프록시 패턴의 핵심은 요청을 대신하는 것이다!
실제 객체가 원격 시스템에서 돌아갈 때, 객체의 생성 비용이 많이 들어 실제 사용 시점에 객체를 생성할 때, 실제 객체에 접근을 제한 및 제어를 해야 할 때 사용한다.
기본적인 프록시 패턴의 구조는 이렇다.
Proxy 클래스와 RealSubject 클래스는 공통 인터페이스인 Subject 인터페이스를 구현한다. 그래서 사용자의 입장에서는 이 메소드가 프록시 객체가 하는 일인지, 아닌지 구별할 수 없다. 또 공통 인터페이스를 구현하기 때문에 일반 객체와 사용방법이 똑같다. 그래서 사용자가 사용하는 방법은 똑같다!
프록시 패턴은 객체에 대한 보안을 제공한다는 장점이 있다. 프록시 객체가 실제 객체의 방패막이 되어, 직접적으로 실제 객체에 접근할 수 없도록 한다. 이를 통해 객체가 악의적으로 변형되는 것을 막는다.
하지만, 실제 객체를 생성하기 전에 한 단계를 더 거치기 때문에 객체 생성이 빈번하게 일어나는 경우 성능이 저하될 수 있다.
프록시 패턴의 종류에는 가상 프록시(Virtual Proxy), 보호 프록시(Protection Proxy), 원격 프록시(Remote Proxy) 등이 있다.
① 가상 프록시
실제 객체의 사용 시점을 제어하기 위해 사용한다. 실제 객체는 클라이언트가 처음 요청하거나 액세스할 때 생성되고, 그 이후에는 프록시를 참조하여 객체를 재사용하게 된다. 즉, 실제 객체가 필요하게 되기 전까지 객체의 생성을 미루게 해주는 것이다.
또 객체 생성 전이나 도중에 객체를 대신하기도 한다. 예를 들어 CD 커버를 보여주는 뷰어에서 이미지를 불러오는 동안 다른 무언가를 보여주고 싶을 때 가상 프록시를 사용한다.
② 보호 프록시
실제 객체에 대한 접근을 제어하기 위해 사용한다. 사용자의 접근 권한에 따라 다른 수준의 권한을 부여할 때 사용한다. 프록시 객체는 사용자가 요청에 대한 권한이 있는지 확인하고, 허가받지 않은 사용자로부터 웹 사이트의 핵심 기능을 보호한다.
③ 원격 프록시
멀리 떨어진 객체의 로컬 프록시를 제공하기 위해 사용한다. 프록시 객체의 메소드를 호출하면 네트워크를 통해 실제 객체의 메소드를 호출하게 된다. 메소드의 호출 결과는 네트워크를 통해 프록시 객체의 메소드로 반환된다. 그리고 이것을 사용자에게 보여준다. 원격 모니터링이 대표적인 예다.
'Design Pattern' 카테고리의 다른 글
템플릿 메소드 패턴, Template Method Pattern (0) | 2020.08.21 |
---|---|
퍼사드 패턴, Pacade Pattern (0) | 2020.08.20 |
어답터 패턴, Adapter Pattern (0) | 2020.08.20 |
전략 패턴, Strategy Pattern (0) | 2020.08.20 |
싱글턴 패턴, Singleton Pattern (feat. synchronized와 volatile) (0) | 2020.08.20 |