Proxy는 유저 클라이언트와 서버 사이에 중개장비로서 캐시 기법을 사용하여 서버로 가는 트래픽을 감소시킨다. 서버에 몰리는 유저가 많을 수록 서버의 트래픽이 증가하여 접속 시간이 지연되거나 서버 자체가 다운되는 경우가 있다. 서버가 Proxy를 가지게 되면 클라이언트는 Proxy에 접속하고 Proxy가 서버에 한 번 접속하여 그 내용을 읽어들여 저장하고 클라이언트에 제공하게 되므로 서버에 가는 트래픽이 감소하게 된다. 서버는 Proxy를 많이 둘 수록 원활하게 동작한다. 클라이언트가 Proxy를 이용하여 서버에 접속하게 되면 서버에는 클라이언트에 대한 정보가 기록된다. 하지만 Anonymous Proxy를 이용하면 Anonymous Proxy의 주소가 기록되므로 클라이언트의 정보가 기록되지 않는다.
ProxyFactoryBean
Spring은 일관된 방법으로 Proxy를 만들 수 있게 도와주는 추상레이어를 제공한다. 여기서 생성된 Proxy는 Spring의 Bean으로 등록되어야 한다.
Spring은 Proxy 오브젝트를 생성해주는 기술을 추상화한 Factory Bean을 제공한다. 그 Factory Bean이 바로 ProxyFactoryBean이다. ProxyFactoryBean은 Proxy를 생성해서 Bean 오브젝트로 등록하게 해주는 Factory Bean이다. ProxyFactoryBean은 순수하게 Proxy를 생성하는 역할만 담당한다. ProxyFactoryBean이 생성하는 Proxy에서 부가기능을 사용해야 한다면 MethodInterceptor interface를 구현해서 만들면 된다. MethodInterceptor는 InvocationHandler와 비슷하지만 한가지 다른 점이 있다.
바로 InvocationHandler의 invoke() 메소드는 타깃 오브젝트에 대한 정보를 제공해주지 않기 때문에 InvocationHandler를 구현한 클래스는 타깃에 대한 정보를 알고 있어야 했다.
반면에 MethodInterceptor의 invoke() 메소드는 ProxyFactoryBean으로부터 타깃 오브젝트에 대한 정보도 함께 제공을 받는다. 이덕분에 InvocationHandler를 구현한 클래스는 타깃 오브젝트가 있어야 만들어 질 수 있었지만, MethodInterceptor를 구현한 클래스는 타깃 오브젝트가 없어도 만들어 질 수 있다.
=> MethodInterceptor를 구현한 오브젝트는 타깃이 다른 여러 Proxy에서 함께 사용할 수 있고, Singleton Bean으로 등록 가능하다.