CS 기초 · 중급
Proxy 패턴은 실제 객체에 대한 접근을 제어하거나 기능을 추가할 목적으로 사용됩니다. Proxy 패턴의 동작 원리를 설명하고, Virtual Proxy, Remote Proxy, Protective Proxy의 차이점을 구체적인 예시와 함께 설명해 주세요.
힌트 · Proxy는 실제 객체를 대신하는 대리자 역할을 합니다. 각 프록시 유형은 목적에 따라 실제 객체에 대한 접근을 다르게 제어합니다.
대리자접근 제어Virtual ProxyRemote ProxyProtective Proxy
모범답안
Proxy 패턴은 실제 객체에 대한 접근을 제어하거나 부가 기능을 제공하기 위해 중간에 대리자(Proxy)를 두는 디자인 패턴입니다. 클라이언트는 Proxy를 통해 실제 객체에 접근하며, Proxy는 접근 제어, 로깅, 캐싱 등의 역할을 수행할 수 있습니다.
Virtual Proxy는 실제 객체의 생성을 지연시키는 데 사용됩니다. 예를 들어, 큰 이미지 파일을 로딩할 때, Virtual Proxy는 이미지 로딩이 완료될 때까지 placeholder 이미지를 보여주다가 로딩이 완료되면 실제 이미지를 보여줍니다.
Remote Proxy는 서로 다른 주소 공간에 존재하는 객체에 대한 접근을 제공합니다. 예를 들어, 클라이언트가 서버에 있는 객체를 사용해야 할 때, Remote Proxy는 네트워크 통신을 처리하여 클라이언트가 마치 로컬 객체를 사용하는 것처럼 보이게 합니다.
Protective Proxy는 실제 객체에 대한 접근 권한을 제어합니다. 예를 들어, 특정 사용자에게만 접근 권한이 있는 객체에 대해, Protective Proxy는 사용자의 권한을 확인하고 권한이 있는 경우에만 실제 객체에 접근을 허용합니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 디자인 패턴 면접 질문
- 비동기적으로 발생하는 이벤트에 대해 여러 컴포넌트가 독립적으로 반응해야 하는 상황에서 Observer 패턴을 적용할 수 있습니다. 이 패턴의 동작 원리를 설명하고, Push 모델과 Pull 모델의 차이점 및 각각의 장단점을 비교해 주세요.
- 기존 객체의 기능을 변경하지 않고 동적으로 새로운 기능을 추가해야 할 때 Decorator 패턴을 활용할 수 있습니다. 상속 대신 Decorator 패턴을 사용하는 이유와, 언제 이 패턴을 적용하는 것이 효과적인지 설명해 주세요.
- Adapter 패턴과 Facade 패턴은 모두 기존 시스템이나 라이브러리와의 상호작용을 돕는 구조 패턴입니다. 두 패턴의 목적과 사용 시점을 비교하여 설명하고, 각각의 실질적인 적용 사례를 들어주세요.
- Decorator 패턴과 Proxy 패턴은 구조적으로 유사해 보이지만, 목적과 적용 방식에서 명확한 차이가 있습니다. 복잡한 시스템에서 특정 객체에 대한 횡단 관심사(cross-cutting concerns)를 적용하거나 접근 제어를 구현해야 할 때, 두 패턴 중 어떤 것을 선택해야 하며, 각각의 성능 및 유지보수 측면에서의 장단점은 무엇인지 구체적인 시나리오를 들어 설명해주세요.
- 이벤트 기반 아키텍처에서 Observer 패턴과 Publish-Subscribe 패턴은 모두 느슨한 결합을 통해 객체 간의 통신을 구현하는 데 사용됩니다. 하지만 이 둘은 아키텍처적 차이와 확장성, 그리고 구현 복잡성에서 중요한 차이를 가집니다. 대규모 분산 시스템에서 이 두 패턴 중 어느 것을 선택해야 하며, 그 선택이 시스템의 확장성, 성능, 그리고 장애 허용성에 어떤 영향을 미치는지 심층적으로 비교 설명해주세요.
- Singleton 패턴은 전역적으로 유일한 인스턴스를 보장하는 데 유용하지만, 테스트 용이성 저해, 다중 스레드 환경에서의 문제, 그리고 과도한 사용 시 의존성 주입을 어렵게 만드는 등 여러 단점이 지적됩니다. 이러한 Singleton 패턴의 문제점을 극복하고, 테스트 용이성과 유연성을 높이면서도 전역적인 유일성을 보장해야 하는 상황에서 Dependency Injection (DI) 또는 Monostate 패턴과 같은 대안을 어떻게 적용할 수 있는지 구체적인 코드 설계 관점에서 설명해주세요.