마이크로서비스 아키텍처는 분산 시스템의 복잡성을 관리하기 위해 다양한 디자인 패턴을 활용합니다. 마이크로서비스 환경에서 Service Discovery, Circuit Breaker, Saga, API Gateway와 같은 패턴들이 각각 어떤 문제점을 해결하고, 전체 시스템의 견고성, 확장성, 그리고 장애 허용성에 어떻게 기여하는지 구체적인 시나리오와 함께 설명해주세요.
힌트 · Service Discovery는 서비스 위치를 찾고, Circuit Breaker는 실패 전파를 방지하며, Saga는 분산 트랜잭션을 관리하고, API Gateway는 진입점을 통합합니다. 이들은 마이크로서비스의 복잡성을 줄이고 안정성을 높이는 데 핵심적인 역할을 합니다.
모범답안
마이크로서비스 환경에서 복잡성을 관리하고 시스템 안정성을 높이기 위해 다양한 디자인 패턴이 활용됩니다.
Service Discovery는 동적으로 변화하는 서비스 인스턴스의 위치를 자동으로 찾아 서비스 간 통신을 가능하게 합니다. 예를 들어, 사용자 요청이 들어왔을 때 주문 서비스는 Service Discovery를 통해 현재 활성화된 결제 서비스 인스턴스의 주소를 알아내 통신합니다. 이는 서비스의 확장성과 가용성을 높여줍니다.
Circuit Breaker는 특정 서비스에 장애가 발생했을 때, 해당 서비스로의 요청을 차단하여 실패가 다른 서비스로 전파되는 것을 막습니다. 예를 들어, 결제 서비스가 응답하지 않으면 Circuit Breaker가 작동하여 더 이상 결제 서비스로 요청을 보내지 않고 즉시 실패 응답을 반환합니다. 이는 시스템 전체의 장애를 방지하고 복구 시간을 단축하는 데 기여합니다.
Saga는 여러 마이크로서비스에 걸쳐 있는 복잡한 비즈니스 트랜잭션을 관리합니다. 각 마이크로서비스는 자체 트랜잭션을 수행하고, 실패 시에는 이전 단계의 트랜잭션을 보상하는 방식으로 전체 트랜잭션의 일관성을 유지합니다. 예를 들어, 주문 생성 시 결제, 재고 확인, 배송지 설정 등 여러 서비스가 관여하는데, Saga 패턴을 통해 각 단계가 성공하거나 실패 시 롤백을 처리하여 데이터 불일치를 방지합니다.
API Gateway는 모든 클라이언트 요청의 단일 진입점 역할을 합니다. 인증, 로깅, 라우팅, 응답 변환 등의 기능을 중앙에서 처리하여 각 마이크로서비스는 비즈니스 로직에만 집중할 수 있게 합니다. 예를 들어, 모바일 앱에서 상품 목록을 조회하는 요청이 오면 API Gateway는 해당 요청을 상품 서비스로 라우팅하고, 필요한 경우 사용자 인증 정보도 함께 전달합니다. 이는 클라이언트의 복잡성을 줄이고 시스템의 보안 및 관리 효율성을 높입니다.
이 패턴들은 상호 보완적으로 작용하여 마이크로서비스 환경의 견고성, 확장성, 그리고 장애 허용성을 크게 향상시킵니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 디자인 패턴 면접 질문
- Singleton 패턴은 전역적으로 유일한 인스턴스를 보장하는 데 유용하지만, 테스트 용이성 저해, 다중 스레드 환경에서의 문제, 그리고 과도한 사용 시 의존성 주입을 어렵게 만드는 등 여러 단점이 지적됩니다. 이러한 Singleton 패턴의 문제점을 극복하고, 테스트 용이성과 유연성을 높이면서도 전역적인 유일성을 보장해야 하는 상황에서 Dependency Injection (DI) 또는 Monostate 패턴과 같은 대안을 어떻게 적용할 수 있는지 구체적인 코드 설계 관점에서 설명해주세요.
- 오래된 레거시 시스템은 종종 'God Object'나 'Feature Envy'와 같은 안티 패턴으로 인해 유지보수가 어렵고 확장성이 떨어집니다. 이러한 레거시 코드베이스를 점진적으로 리팩토링하여 디자인 패턴을 적용하고자 할 때, 어떤 전략과 패턴을 사용하여 기존 기능을 손상시키지 않으면서 코드 품질을 향상시킬 수 있을지 구체적인 단계와 적용 가능한 패턴(예: Strategy, Facade, Adapter)을 제시하여 설명해주세요.
- 디자인 패턴은 코드의 구조와 유지보수성을 향상시키지만, 일부 패턴은 잘못 적용되거나 특정 상황에서 성능 오버헤드를 유발할 수 있습니다. 예를 들어, Chain of Responsibility, Decorator, Visitor 패턴 등은 런타임 시 추가적인 객체 생성이나 메서드 호출로 인해 성능 저하를 일으킬 가능성이 있습니다. 이러한 패턴들이 성능에 미칠 수 있는 부정적인 영향을 분석하고, 성능 최적화를 고려하여 패턴을 설계하거나 대안을 선택하는 방법에 대해 설명해주세요.
- 고도로 동시성(concurrent)이 요구되는 시스템을 설계할 때, 전통적인 디자인 패턴만으로는 충분하지 않거나 오히려 복잡성을 증가시킬 수 있습니다. 이러한 환경에서 Producer-Consumer, Reactor, Actor 모델과 같은 동시성 패턴(Concurrency Patterns)이 어떻게 스레드 안전성, 자원 관리, 그리고 성능 최적화를 달성하는 데 기여하는지 설명하고, 이들 패턴을 적용할 때 주의해야 할 점과 잠재적인 문제점(예: 데드락, 라이브락)에 대해 논의해주세요.