⚡프록시 패턴이란?
프록시 패턴(Proxy pattern)은 다른 객체를 대신해서 클라이언트와 상호 작용하는 객체를 제공하는 구조적인 디자인 패턴이다.
클라이언트는 프록시 객체를 사용하여 실제 객체에 대한 직접적인 접근을 피하고 프록시 객체가 실제 객체에 대한 간접적인 접근을 제공 한다. 이를 통해 실제 객체의 생성 및 소멸 등에 대한 부담을 줄이고 보안, 로깅, 캐싱 등의 부가 기능을 제공할 수 있다.
프록시 패턴은 크게 가상 프록시, 원격 프록시, 보호 프록시, 스마트 프록시 등으로 분류할 수 있습니다.
가상 프록시는 실제 객체의 생성을 지연시켜 성능을 향상시키는 역할을 한다.
원격 프록시는 네트워크를 통해 분산된 객체에 접근하는 역할을 한다.
보호 프록시는 클라이언트에게 필요한 권한이나 보안 문제를 처리하는 역할을 한다.
스마트 프록시는 실제 객체에 대한 추가적인 작업을 처리하는 역할을 한다.
프록시 패턴은 대규모 시스템에서 많이 사용되는데 이는 복잡한 로직을 가진 객체를 별도의 객체로 분리하여 각 객체가 담당하는 기능을 명확하게 분리할 수 있기 때문이다. 또한 프록시 객체를 이용하여 실제 객체에 대한 부하를 줄이고 캐싱 등의 성능 향상 기능을 구현할 수 있다.
프록시 패턴 구조
- Subject: 실제 객체와 프록시 객체의 공통 인터페이스를 정의.
- RealSubject: 실제 객체를 나타내는 클래스로, Subject를 구현.
- Proxy: RealSubject와 동일한 인터페이스를 가지며, RealSubject를 대신하여 클라이언트 요청 처리.
⚡프록시 패턴은 어떤 경우에 사용하는가?
- 원격지에 존재하는 객체에 대한 접근: 객체가 원격 서버에 있을 경우 직접적으로 접근하기보다는 프록시 객체를 통해 접근하는 것이 더 안전하고 효율적일 수 있다.
- 객체에 대한 접근 제어: 객체에 대한 접근을 허용하거나 제한하기 위해 프록시 패턴을 사용할 수 있다. 예를 들어 객체에 대한 접근 권한이 있는지 확인하고 권한이 없으면 접근을 거부하는 것이 가능하다.
- 객체 생성 및 소멸에 대한 제어: 객체의 생성 및 소멸 시점을 제어하기 위해 프록시 패턴을 사용할 수 있다. 예를 들어 객체 생성 시점에 캐시에 저장하거나 객체 소멸 시점에 자원 해제 등의 작업을 수행할 수 있다.
- 객체에 대한 부가적인 기능 제공: 객체에 대해 부가적인 기능을 제공하고자 할 때 프록시 패턴을 사용할 수 있다. 예를 들어 객체의 메소드 호출 시점에 로깅, 성능 측정 등의 작업을 수행할 수 있다.
- 객체에 대한 복잡한 접근 방식 제공: 객체에 대한 복잡한 접근 방식을 제공하고자 할 때 프록시 패턴을 사용할 수 있다. 예를 들어 객체에 대한 복잡한 쿼리를 수행하거나 객체를 필터링하거나 객체를 변환하는 등의 작업을 수행할 수 있다.
실생활에서 사용가능한 예를 들면 웹의 경우 이전 방문한 웹페이지의 복사본을 저장하고 이후에 같은 페이지를 요청할 때 로컬에서 바로 제공이 가능하도록 구현할 수 있다. 게임의 경우로 예를 들면 플레이어나 봇이 게임에서 필요한 리소스를 미리 로드하고 캐시 할 때 프록시 패턴이 사용될 수 있다.
⚡프록시 패턴의 장단점
장점
- 보안을 강화할 수 있다. 클라이언트는 프록시를 통해서만 접근이 가능하므로 프록시를 통해 인증 및 권한 체크를 할 수 있다.
- 객체 접근을 제어할 수 있다. 프록시는 실제 객체에 대한 접근을 제어하므로 객체의 접근을 제어할 수 있다.
- 성능을 향상할 수 있다. 객체 생성 및 초기화 등의 부하가 큰 작업이 필요한 경우 프록시를 통해 필요한 시점에 객체를 생성하거나 초기화할 수 있다.
단점
- 구현이 복잡해질 수 있다. 프록시 객체를 따로 구현해야 하므로 구현이 복잡해질 수 있습니다.
- 추가적인 메모리 사용이 필요할 수 있다. 프록시 객체를 생성하는 비용이 들 수 있으며 실제 객체에 대한 참조를 유지하기 위한 추가적인 메모리 사용이 필요할 수 있다.
- 프록시 객체가 실제 객체의 모든 기능을 대체할 수 없다. 일부 기능은 프록시 객체에서 처리할 수 없으므로 실제 객체에 직접 접근이 필요할 수 있다.
⚡프록시 패턴 소스 정리
⚡생각
이것으로 디자인 패턴 - 구조 패턴에 대한 마무리가 되었다. 다음에는 행동 패턴에 대해서 내용을 정리하려고 한다.
구조 패턴을 사용하는 경우는 유연하고 효율적으로 유지하면서 객체들과 클래스들을 더 큰 구조로 조립을 가능하도록 도와주는 패턴이다. 구조 패턴을 정리하면서 개발 소스 내에서 어떻게 사용해야 할까? 고민을 했지만 당장에 어떻게 써야겠다를 떠올린 경우도 있고 이미 사용한 경우도 있지만 몇 가지 패턴에 대해서는 어떻게 써야 할지 잘 모르겠는 경우가 있었다. 정리를 해놓고 앞으로 개발을 하면서 어떻게 써야할지 고민도 하고 기존 구조도 리팩터링 할 수 있다고 생각한다. 디자인 패턴이 정답은 아니지만 이미 선배 개발자분들이 시행착오를 겪어가면서 만들어놓은 것이다. 상황에 맞게 잘만 사용한다면 개발을 더욱더 쉽고 잘하는 개발자가 될 수 있다고 생각한다.
'디자인 패턴' 카테고리의 다른 글
[디자인 패턴] 플라이웨이트 패턴에 대한 내용 정리 (0) | 2023.04.07 |
---|---|
[디자인 패턴] 퍼사드 패턴에 대한 내용 정리 (0) | 2023.04.05 |
[디자인 패턴] 데코레이터 패턴에 대한 내용 정리 (0) | 2023.03.28 |
[디자인 패턴] 복합체 패턴에 대한 내용 정리 (0) | 2023.03.26 |
[디자인 패턴] 브리지 패턴에 대한 내용 정리 (0) | 2023.03.25 |