✔︎ proxy 패턴
인터페이스를 사용하고 실행시킬 클래스에 대한 객체가 들어갈 자리에 대리자(proxy) 객체를 대신 투입하는 패턴이다. 단 proxy 객체는 결과값을 조작하거나 변경시켜선 안된다.
- 대리자는 실제 서비스와 같은 이름의 메서드를 구현한다. (인터페이스를 사용)
- 대리자는 실제 서비스에 대한 참조 변수를 가진다.
- 대리자는 실제 서비스와 같은 이름을 가진 메서드를 호출하고 그 값을 클라이언트에게 돌려준다.
- 대리자는 실제 서비스의 메서드 호출 전후에도 별도의 로직을 수행할 수도 있다.
프록시 패턴은 RealSubject의 접근에 대한 제어를 목적으로 한다.(제어의 흐름을 조정)
proxy 패턴 종류
- 가상 프록시
- 꼭 필요로 하는 시점까지 객체의 생성을 연기하고, 해당 객체가 생성된 것처럼 동작하도록 만들고 싶을때 사용하는 패턴이다.
- 프록시 클래스에서 자잘한 작업들을 처리하고 리소스가 많이 요구되는 작업들이 필요할 때에만 주체 클래스를 사용하도록 구현한다.
- 보호 프록시
- 주체 클래스에 대한 접근을 제어하기 위한 경우에 객체에 대한 접근 권한을 제어하거나 객체마다 접근 권한을 달리하고 싶을때 사용하는 패턴으로 프록시 클래스에서 클라이언트가 주체 클래스에 대한 접근을 허용할지 말지 결정한다.
- 원격 프록시
- 로컬 환경에 존재하며 원격 객체에 대한 대변자 역할을 한다.
- 서로 다른 주소 공간에 있는 객체에 대해 같은 주소 공간에 있는 것처럼 동작하게 만든다.
proxy 패턴 단점
- 객체를 생성할 때 한단계를 거치게 되므로, 빈번환 객체 생성이 필요한 경우 성능이 저하될 수 있다.
- 프록시 내부에서 객체 생성을 위해 스레드가 생성, 동기화가 구현되어야 하는 경우 성능이 저하될 수 있다
- 로직이 난해해져 가독성이 떨어질 수 있다.
예제 코드
proxy 패턴 예제 코드
solid 관점
SOLID 관점에서 본 프록시 패턴
참고
✔︎ facade 패턴
서브 시스템의 일련의 인터페이스에 대한 통합된 인터페이스를 제공하며 이를 통해 서브 시스템을 더 쉽게 사용할 수 있도록 한다. (여러 서브 시스템 클래스를 하나의 클래스로 묶는다.)
예제 코드
facade 패턴 예제 코드
참고