[디자인 패턴] 프록시 패턴
프록시 패턴은 위임에 대한 패턴이다.
GoF의 정의에 따르면 프록시 패턴은
[다른 객체에 접근할 때, 중간에서 역할을 대리하는 객체를 두고 그걸 통해 접근하는 것]이다.
참 간단하면서도 복잡한 놈인데.
예를 들어 클라이언트가 서드파티 API 등을 사용하게 하는 대신,
그 API의 사용을 프록시에서 수행하고 그 프록시를 클라이언트가 인터페이스로서 사용하게 하는 것이다.
이렇게 하는 것으로 클라이언트가 특정 구현에 의존하지 않게 할 수 있다.
뿐만 아니라 사용편의성을 위해 프록시를 쓸 수도 있다. 그 대표적인 사용 사례 중 하나는 포인터를 감싸놓은 스마트 포인터다. 스마트 포인터는 사용자와 포인터 사이의 프록시였던 것이다. 자잘한 세부사항에 신경쓰지 않고 사용할 수 있게 해주는.
빠른 이해를 DB에 대한 예제를 보겠다.데이터베이스의 students라는 테이블에서 name 목록을 전부 읽어 출력한다고 가정한다.그럼 대충 생각없이 짠다면 이런 식으로 될 수 있다.
음... 이대로도 잘 굴러가긴 할 것이다.
저걸 프록시 클래스로 분리하면
대강 이런 식이 된다.
사용자 측의 코드가 훨씬 간결해진 것을 볼 수 있다.
그리고 확장성을 고려할 필요가 있다면 프록시에도 인터페이스를 두는 것이 좋겠다.
한데 쏘공의 명장인 로버트 마틴은 이 패턴을 다소 부정적으로 보았다. 프록시는 대부분의 앱에서 필요 없는 무거운 솔루션이고, 더 간단하게 해결할 방법이 많다는 것이다.사실 위의 코드만 보면 간단해보이지만 프록시는 생각보다 복잡하고 심오한 패턴이다. A와 B 사이에 프록시를 끼워놨을 경우 A와 B는 자유로워지지만, 프록시는 A와 B 모두에 의존적이므로 A나 B가 변경될 경우 따라서 변경되어야 하는 취약점을 가진다. 게다가 간단하고 깔끔한 위임 모델을 만드는게 굉장히 어려운 일이라는데. 무슨 말인진 잘 모르겠다.
예시 코드https://github.com/myyrakle/DesignPatterns/tree/master/Proxy
myyrakle/DesignPatternsContribute to myyrakle/DesignPatterns development by creating an account on GitHub.github.com

참조
클린 소프트웨어
GoF 디자인 패턴
https://ko.m.wikipedia.org/wiki/%ED%94%84%EB%A1%9D%EC%8B%9C_%ED%8C%A8%ED%84%B4