CS 기초 · 심화
오래된 레거시 시스템은 종종 'God Object'나 'Feature Envy'와 같은 안티 패턴으로 인해 유지보수가 어렵고 확장성이 떨어집니다. 이러한 레거시 코드베이스를 점진적으로 리팩토링하여 디자인 패턴을 적용하고자 할 때, 어떤 전략과 패턴을 사용하여 기존 기능을 손상시키지 않으면서 코드 품질을 향상시킬 수 있을지 구체적인 단계와 적용 가능한 패턴(예: Strategy, Facade, Adapter)을 제시하여 설명해주세요.
힌트 · 점진적 리팩토링은 기존 기능을 보호하면서 작은 단위로 개선하는 것입니다. Facade로 복잡한 서브시스템을 감싸고, Strategy로 변하는 부분을 분리하며, Adapter로 호환되지 않는 인터페이스를 연결하는 방법을 고려할 수 있습니다.
스트랭글러 패턴테스트 주도 개발 (TDD)추상화Facade 패턴Adapter 패턴
모범답안
레거시 시스템 리팩토링은 조심스럽게 접근해야 합니다. 먼저, '스트랭글러 패턴'을 적용하여 기존 시스템을 점진적으로 대체하는 방식을 고려합니다. 새로운 기능은 새로운 아키텍처로 개발하고, 기존 기능은 리팩토링을 통해 점진적으로 옮겨가는 것이죠.
리팩토링 시에는 '테스트 주도 개발(TDD)'을 적극 활용하여 기존 기능이 변경 후에도 정상적으로 작동하는지 확인합니다. 'Facade' 패턴을 사용하여 복잡한 레거시 시스템의 인터페이스를 단순화하고, 'Strategy' 패턴으로 알고리즘을 캡슐화하여 변경에 유연하게 대처할 수 있도록 합니다. 또한, 'Adapter' 패턴을 사용하여 새로운 인터페이스와 기존 인터페이스 간의 호환성을 확보합니다.
예를 들어, 결제 시스템의 복잡한 로직을 Facade로 감싸고, 다양한 결제 방식을 Strategy 패턴으로 구현하여 새로운 결제 방식 추가에 용이하도록 만들 수 있습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 디자인 패턴 면접 질문
- Decorator 패턴과 Proxy 패턴은 구조적으로 유사해 보이지만, 목적과 적용 방식에서 명확한 차이가 있습니다. 복잡한 시스템에서 특정 객체에 대한 횡단 관심사(cross-cutting concerns)를 적용하거나 접근 제어를 구현해야 할 때, 두 패턴 중 어떤 것을 선택해야 하며, 각각의 성능 및 유지보수 측면에서의 장단점은 무엇인지 구체적인 시나리오를 들어 설명해주세요.
- 이벤트 기반 아키텍처에서 Observer 패턴과 Publish-Subscribe 패턴은 모두 느슨한 결합을 통해 객체 간의 통신을 구현하는 데 사용됩니다. 하지만 이 둘은 아키텍처적 차이와 확장성, 그리고 구현 복잡성에서 중요한 차이를 가집니다. 대규모 분산 시스템에서 이 두 패턴 중 어느 것을 선택해야 하며, 그 선택이 시스템의 확장성, 성능, 그리고 장애 허용성에 어떤 영향을 미치는지 심층적으로 비교 설명해주세요.
- Singleton 패턴은 전역적으로 유일한 인스턴스를 보장하는 데 유용하지만, 테스트 용이성 저해, 다중 스레드 환경에서의 문제, 그리고 과도한 사용 시 의존성 주입을 어렵게 만드는 등 여러 단점이 지적됩니다. 이러한 Singleton 패턴의 문제점을 극복하고, 테스트 용이성과 유연성을 높이면서도 전역적인 유일성을 보장해야 하는 상황에서 Dependency Injection (DI) 또는 Monostate 패턴과 같은 대안을 어떻게 적용할 수 있는지 구체적인 코드 설계 관점에서 설명해주세요.
- 디자인 패턴은 코드의 구조와 유지보수성을 향상시키지만, 일부 패턴은 잘못 적용되거나 특정 상황에서 성능 오버헤드를 유발할 수 있습니다. 예를 들어, Chain of Responsibility, Decorator, Visitor 패턴 등은 런타임 시 추가적인 객체 생성이나 메서드 호출로 인해 성능 저하를 일으킬 가능성이 있습니다. 이러한 패턴들이 성능에 미칠 수 있는 부정적인 영향을 분석하고, 성능 최적화를 고려하여 패턴을 설계하거나 대안을 선택하는 방법에 대해 설명해주세요.
- 마이크로서비스 아키텍처는 분산 시스템의 복잡성을 관리하기 위해 다양한 디자인 패턴을 활용합니다. 마이크로서비스 환경에서 Service Discovery, Circuit Breaker, Saga, API Gateway와 같은 패턴들이 각각 어떤 문제점을 해결하고, 전체 시스템의 견고성, 확장성, 그리고 장애 허용성에 어떻게 기여하는지 구체적인 시나리오와 함께 설명해주세요.
- 고도로 동시성(concurrent)이 요구되는 시스템을 설계할 때, 전통적인 디자인 패턴만으로는 충분하지 않거나 오히려 복잡성을 증가시킬 수 있습니다. 이러한 환경에서 Producer-Consumer, Reactor, Actor 모델과 같은 동시성 패턴(Concurrency Patterns)이 어떻게 스레드 안전성, 자원 관리, 그리고 성능 최적화를 달성하는 데 기여하는지 설명하고, 이들 패턴을 적용할 때 주의해야 할 점과 잠재적인 문제점(예: 데드락, 라이브락)에 대해 논의해주세요.