클라이언트와 서버
클라이언트는 서버에 필요한 것을 요청하고, 서버는 클라이언트의 요청을 처리하는 것이다.
그런데 클라이언트가 요청한 결과를 서버에 직접 요청하는 것이 아니라 어떤 대리자를 통해서 대신 간접적으로 서버에 요청할 수 있다. 예를 들어서 내가 직접 마트에서 장을 볼 수도 있지만, 누군가에게 대신 장을 봐달라고 부탁할 수도 있다. 여기서 대신 장을 보는 대리자를 영어로 프록시(Proxy)라 한다.
예시
- 엄마에게 라면을 사달라고 부탁 했는데, 엄마는 그 라면은 이미 집에 있다고 할 수도 있다. 그러면 기대한 것 보다 더 빨리 라면을 먹을 수 있다. (접근 제어, 캐싱)
- 아버지께 자동차 주유를 부탁했는데, 아버지가 주유 뿐만 아니라 세차까지 하고 왔다. 클라이언트가 기대한 것 외에 세차라는 부가 기능까지 얻게 되었다. (부가 기능 추가)
- 그리고 대리자가 또 다른 대리자를 부를 수도 있다. 예를 들어서 내가 동생에게 라면을 사달라고 했는데, 동생은 또 다른 누군가에게 라면을 사달라고 다시 요청할 수도 있다. 중요한 점은 클라이언트는 대리자를 통해서 요청했기 때문에 그 이후 과정은 모른다는 점이다. 동생을 통해서 라면이 나에게 도착하기만 하면 된다. (프록시 체인)
대체 가능 그런데 여기까지 듣고 보면 아무 객체나 프록시가 될 수 있는 것 같다. 객체에서 프록시가 되려면, 클라이언트는 서버에게 요청을 한 것인지, 프록시에게 요청을 한 것인지 조차 몰라야 한다.
쉽게 이야기해서 서버와 프록시는 같은 인터페이스를 사용해야 한다. 그리고 클라이언트가 사용하는 서버 객체를 프록시 객체로 변경해도 클라이언트 코드를 변경하지 않고 동작할 수 있어야 한다
클래스 의존관계를 보면 클라이언트는 서버 인터페이스( ServerInterface )에만 의존한다.
그리고 서버와 프록시가 같은 인터페이스를 사용한다. 따라서 DI를 사용해서 대체 가능하다
프록시의 주요기능
1.접근 제어
- 권한따른 접근 차단
- 캐싱
- 지연 로딩
2. 부가 기능 추가
- 원래 서버가 제공하는 기능에 부가 기능
프록시 객체가 중간에 있으면 크게 접근 제어와 부가 기능 추가를 수행할 수 있다.
GOF 디자인 패턴 둘다 프록시를 사용하는 방법이지만 GOF 디자인 패턴에서는 이 둘을 의도(intent)에 따라서
프록시 패턴과 데코레이터 패턴으로 구분한다
프록시 패턴: 접근 제어가 목적
데코레이터 패턴: 새로운 기능 추가가 목적
김영한의 스프링 핵심원리 고급편 정리
'프레임워크 > 스프링' 카테고리의 다른 글
스프링이 지원하는 프록시 (0) | 2022.12.11 |
---|---|
[Spring]스프링 시큐리티 퍼옴 xml 사용안하는 버젼 (0) | 2022.11.13 |
[Spring] 템플릿 콜백 패턴 (1) | 2022.11.11 |
[Spring] 동시성 문제(쓰레드 로컬) (0) | 2022.11.05 |
[Spring] 로그 추적기 파라미터로 동기화 개발 (0) | 2022.11.01 |