정상에서 IT를 외치다

[디자인패턴] 프록시 패턴 본문

디자인패턴

[디자인패턴] 프록시 패턴

Black-Jin 2019. 7. 2. 15:19
반응형

안녕하세요. 블랙진입니다.

책 HeadFirstDesignPattern 을 보며 코드를 Kotlin 으로 바꿔가며 공부한 내용입니다.


프록시 패턴


어떤 객체에 대한 접근을 제어하기 위한 용도로 대리인이나 대변인에 해당하는 객체를 제공하는 패턴



프록시가 접근을 제어하는 몇가지 방법


1. 원격프록시를 써서 원격 객체에 대한 접근을 제어할 수 있습니다.

2. 가상 프록시를 써서 생성하기 힘든 자원에 대한 접근을 제어할 수 있습니다.

3. 보호 프록시를 써서 접근 권한이 필요한 자원에 대한 접근을 제어할 수 있습니다.


프록시 패턴을 이용하면 원격 객체라든가 생성하기 힘든 객체, 보안이 중요한 객체와 같은 다른 객체에 대한 접근을 제어하는 대변자 객체를 만들 수 있습니다.




원격 프록시


원격 프록시는 다른 JVM에 들어있는 객체의 대변인에 해당하는 로컬 객체입니다. 프록시의 메소드를 호출하면 그 호출이 네트워크를 통해서 전달되어 결국 원격 객체의 메소드가 호출됩니다. 그리고 그 결과는 다시 프록시를 거쳐서 클라이언트한테 전달됩니다.




가상 프록시


가상 프록시는 생성하는데 많은 비용이 드는 객체를 대신하는 역활을 맡습니다. 실제로 진짜 객체가 필요하게 되기 전까지 객체의 생성을 미루게 해주는 기능을 제공하기도 합니다. 객체 생성 전, 또는 객체 생성 도중에 객체를 대신하기도 하고요. 객체 생성이 완료되고 나면 그냥 RealSubject에 요청을 직접 전달해줍니다.



바보 같은 질문은 없습니다.


원격 프록시하고 가상 프록시는 완전히 다는것 같은데 같은 패턴이 맞나요?


클라이언트에서 실제 객체의 메소드를 호출하면, 그 호출을 중간에 가로챈다는 공통점이 있습니다. 이렇게 간접적으로 작업을 처리하면 요청 내역을 원격 시스템에 있는 객체에 전달할 수도 있고, 생성하는 데 많은 비용이 드는 객체를 대변해줄 수도 있고, 클라이언트별로 호출할 수 있는 메소드를 제한하는 보디가드 역활을 하는 것도 가능합니다.


가상프록시는 데코레이터 패턴같이 보이는데 아닌가요?


이 둘은 용도를 가지고 구분할 수 있습니다. 데코레이터는 클래스에 새로운 행동을 추가하기 위한 용도로 쓰이지만 프록시는 어떤 클래스에 대한 접근을 제어하기 위한 용도로 쓰입니다.


프록시랑 어댑터는 어떤 차이가 있나요?


프록시와 어댑터는 모두 클라이언트와 다른 객체 사이에 끼여들어서 클라이언트로부터 요청을 받아와서 다른 객체한테 전달해주는 역활을 합니다. 어댑터에서는 다른 객체의 인터페이스를 바꿔주지만, 프록시에서는 똑같은 인터페이스를 사용한다는 차이점이 있습니다. 그리고 보호 프록시의 경우에는 한 가지 더 유사점이 있습니다. 보호 프록시에서는 클라이언트의 역활에 따라서 객체에 있는 특정 메소드에 대한 클라이언트의 접근을 제어합니다. 그러다 보니 보호 프록시에서는 클라이언트한테 인터페이스의 일부분만 제공할 수 있습니다. 이런 점은 어댑터하고 비슷하다고 할 수 있습니다.

반응형
Comments