클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아니라 어떤 대리자를 통해서 대신 간접적으로 서버에
요청할 수 있다. 예를 들어서 내가 직접 마트에서 장을 볼 수도 있지만, 누군가에게 대신 장을 봐달라고 부탁할 수도 있다.
여기서 대신 장을 보는 대리자를 영어로 프록시(Proxy)라 한다.
클라이언트 -> 프록시 -> 서버
이때 클라이언트 서버는 단순히 이용자, 서버개발자가 아니라 요청하는 클레스 - 응답하는 클레스의 관계에서도 적용된다.
재미있는 점은 직접 호출과 다르게 간접 호출을 하면 대리자가 중간에서 여러가지 일을 할 수 있다는 점이다.
엄마에게 라면을 사달라고 부탁 했는데, 엄마는 그 라면은 이미 집에 있다고 할 수도 있다. 그러면 기대한 것 보다 더 빨리 라면을 먹을 수 있다. (접근 제어, 캐싱)
아버지께 자동차 주유를 부탁했는데, 아버지가 주유 뿐만 아니라 세차까지 하고 왔다. 클라이언트가 기대한 것 외에 세차라는 부가 기능까지 얻게 되었다. (부가 기능 추가)
프록시가 다른 프록시 요청가능 (프록시 체인)
이 프록시의 핵심은 클라이언트가 프록시가 사용됐는지도 몰라야한다는것 = 인터페이스등을 사용해서 DI로 클라이언트는 인터페이스를 의존하고 실제 인스턴스는 프록시가 될수도 서버가 될수도있는 방식 사용하는것
프록시를 통해서 할 수 있는 일은 크게 2가지로 구분할 수 있다.
접근 제어-권한에 따른 접근 차단,캐싱,지연 로딩
부가 기능 추가-원래 서버가 제공하는 기능에 더해서 부가 기능을 수행한다.(예) 요청 값이나, 응답 값을 중간에 변형한다.,예) 실행 시간을 측정해서 추가 로그를 남긴다)
둘다 프록시를 사용하는 방법이지만 GOF 디자인 패턴에서는 이 둘을 의도(intent)에 따라서 프록시 패턴과 데코레이터 패턴으로 구분한다.
프록시 패턴: 접근 제어가 목적
데코레이터 패턴: 새로운 기능 추가가 목적