Proxy ?
Proxy는 우리말로 대리자, 대변인 이라는 뜻.
구체적으로 인터페이스를 사용하고 실행시킬 클래스에 대한 객체가 들어갈 자리에 대리자 객체를 대신 투입해 클라이언트 쪽에서 실제 실행시킬 클래스에 대한객체를 통해 메서드를 호출하고 반환 값을 받는지, 대리자 객체를 통해 메서드를 호출하고 반환 값을 받는지 전혀 모르게 처리하는 것입니다.
프록시는 흐름제어만 할 뿐 결과값을 조작하거나 변경시키면 안됩니다.
Proxy Pattern
특정 객체에 대한 접근을 제어하거나 기능을 추가할 수 있는 패턴
- 초기화 지연, 접근 제어, 로깅, 캐싱 등을 다양하게 응용해 사용 할 수 있다.
장점
- 기존 코드를 변경하지 않고 새로운 기능을 추가할 수 있다.
- 기존 코드가 해야 하는 일만 유지할 수 있다.
- 기능 추가 및 초기화 지연 등으로 다양하게 활용할 수 있다.
단점
- 코드의 복잡도가 증가한다.
클라이언트가 어떤 일에 대한 요청(RealSubject의 request()메서드 호출)을 하면, Proxy가 대신 RealSubject의 request()메서드 호출을 하고 그 반환 값을 클라이언트에게 전달합니다.
Main 에서 Service의 runSomething() 메서드를 직접 호출 하지 않고 Proxy에게 대신 시킵니다. 그럼 Proxy는 Service의 인스턴스를 가지고 있으면서 직접 Service의 runSomething()메서드를 호출하고 그 반환 값을 요청자 Main에게 넘겨줍니다.
Proxy Pattern 예제
proxy 에서 많은 용량을 차지하거나 하는 기능일 경우 사용할때만 생성을 한다거나 할 수 있다.
우리가 원하는 기능을 추가할 수 있다(메인 기능 외에) 로깅, 시간 측정 등..
단점 : 코드가 복잡해지며 상속은 한개만 가능하기 때문에 제약이 생기고 final 형이면 상속 받는것도 불가능 하다.
해당 소스를 보면 OCP 와 SRP 규칙 모두를 사용할 수 있다.
OCP ( Open Closed Principle ) : 개방-폐쇄 원칙
기존 코드를 변경하기 않으면서 기능을 추가할 수 있도록 설계가 되어야 한다.
클래스나 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 한다.
SRP ( Single Responsibility Principle)의 정의 : 단일책임원칙
SOLID 원칙 중 하나이며, "클래스는 단 한개의 책임을 가져야 한다."를 의미하는 간단한 규칙입니다.
클래스가 여러 책임을 갖게 되면 그 클래스는 각 책임마다 변경되는 이유가 발생하기 때문에 클래스가 한개의 이유로만 변경되려면 클래스는 한 개의 책임만을 가져야한다고 합니다.