Decorator 패턴과 Proxy 패턴은 구조적으로 유사해 보이지만, 목적과 적용 방식에서 명확한 차이가 있습니다. 복잡한 시스템에서 특정 객체에 대한 횡단 관심사(cross-cutting concerns)를 적용하거나 접근 제어를 구현해야 할 때, 두 패턴 중 어떤 것을 선택해야 하며, 각각의 성능 및 유지보수 측면에서의 장단점은 무엇인지 구체적인 시나리오를 들어 설명해주세요.
힌트 · Decorator는 기능 확장, Proxy는 접근 제어 및 부가 기능 제공에 중점을 둡니다. 성능 및 유지보수 측면에서 런타임 오버헤드, 코드 복잡성, 그리고 책임 분리를 고려해야 합니다.
모범답안
Decorator와 Proxy는 구조는 비슷하지만 목적이 다릅니다.
Decorator는 기존 객체의 기능을 런타임에 동적으로 확장할 때 사용합니다. 예를 들어, 로깅이나 트랜잭션 관리 같은 횡단 관심사를 여러 객체에 공통적으로 적용하고 싶을 때, 각 객체에 Decorator를 감싸서 기능을 추가할 수 있습니다. 장점은 코드 중복 없이 기능을 재사용하고, 객체 간의 결합도를 낮춰 유지보수성이 좋다는 것입니다. 단점은 객체 생성이 많아져 런타임 오버헤드가 발생할 수 있다는 점입니다.
Proxy는 객체에 대한 접근을 제어하거나, 객체 생성 및 접근 전에 부가적인 작업을 수행할 때 사용합니다. 예를 들어, 원격 객체에 접근하거나, 민감한 데이터에 대한 접근 권한을 확인하는 경우에 Proxy를 사용할 수 있습니다. 장점은 원본 객체와 클라이언트 사이에 투명하게 작동하며, 접근 제어 로직을 분리하여 핵심 로직에 집중할 수 있다는 것입니다. 단점은 Proxy 객체가 추가되어 복잡성이 증가하고, 경우에 따라 성능 저하가 발생할 수 있습니다.
따라서 횡단 관심사를 기능 확장 관점에서 적용하려면 Decorator를, 접근 제어 또는 부가 기능 제공 관점에서는 Proxy를 선택하는 것이 좋습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 디자인 패턴 면접 질문
- 기존 객체의 기능을 변경하지 않고 동적으로 새로운 기능을 추가해야 할 때 Decorator 패턴을 활용할 수 있습니다. 상속 대신 Decorator 패턴을 사용하는 이유와, 언제 이 패턴을 적용하는 것이 효과적인지 설명해 주세요.
- Adapter 패턴과 Facade 패턴은 모두 기존 시스템이나 라이브러리와의 상호작용을 돕는 구조 패턴입니다. 두 패턴의 목적과 사용 시점을 비교하여 설명하고, 각각의 실질적인 적용 사례를 들어주세요.
- Proxy 패턴은 실제 객체에 대한 접근을 제어하거나 기능을 추가할 목적으로 사용됩니다. Proxy 패턴의 동작 원리를 설명하고, Virtual Proxy, Remote Proxy, Protective Proxy의 차이점을 구체적인 예시와 함께 설명해 주세요.
- 이벤트 기반 아키텍처에서 Observer 패턴과 Publish-Subscribe 패턴은 모두 느슨한 결합을 통해 객체 간의 통신을 구현하는 데 사용됩니다. 하지만 이 둘은 아키텍처적 차이와 확장성, 그리고 구현 복잡성에서 중요한 차이를 가집니다. 대규모 분산 시스템에서 이 두 패턴 중 어느 것을 선택해야 하며, 그 선택이 시스템의 확장성, 성능, 그리고 장애 허용성에 어떤 영향을 미치는지 심층적으로 비교 설명해주세요.
- Singleton 패턴은 전역적으로 유일한 인스턴스를 보장하는 데 유용하지만, 테스트 용이성 저해, 다중 스레드 환경에서의 문제, 그리고 과도한 사용 시 의존성 주입을 어렵게 만드는 등 여러 단점이 지적됩니다. 이러한 Singleton 패턴의 문제점을 극복하고, 테스트 용이성과 유연성을 높이면서도 전역적인 유일성을 보장해야 하는 상황에서 Dependency Injection (DI) 또는 Monostate 패턴과 같은 대안을 어떻게 적용할 수 있는지 구체적인 코드 설계 관점에서 설명해주세요.
- 오래된 레거시 시스템은 종종 'God Object'나 'Feature Envy'와 같은 안티 패턴으로 인해 유지보수가 어렵고 확장성이 떨어집니다. 이러한 레거시 코드베이스를 점진적으로 리팩토링하여 디자인 패턴을 적용하고자 할 때, 어떤 전략과 패턴을 사용하여 기존 기능을 손상시키지 않으면서 코드 품질을 향상시킬 수 있을지 구체적인 단계와 적용 가능한 패턴(예: Strategy, Facade, Adapter)을 제시하여 설명해주세요.