피드로 돌아가기
뱅크샐러드는 어떻게 레거시 서비스를 박살 내는가
뱅크샐러드 기술블로그뱅크샐러드 기술블로그
Backend

뱅크샐러드는 어떻게 레거시 서비스를 박살 내는가

뱅크샐러드가 Python/MongoDB 기반 모놀리식 레거시 서비스 1개를 Go/gRPC 기반 마이크로서비스 15개로 분해해 신규 서비스 배포 속도 향상

2020년 9월 21일13advanced

Context

뱅크샐러드의 초기 마이크로서비스 'jg'는 3년간의 폭발적 성장 과정에서 핵심 비즈니스 로직을 담당하는 거대한 모놀리식 서버로 변질되었다. 서비스는 복잡도가 눈덩이처럼 불어나 코드 수정이 어려워졌고, 더 심각하게는 비즈니스 로직을 정확히 아는 사람이 없었으며, 단위 테스트는 높은 커버리지를 유지했으나 까다로운 비즈니스 로직에 대한 테스트는 빈약했다.

Technical Solution

  • 조직 구조에 맞춘 서비스 분해: 피자 2판 규모의 스쿼드 체계에 기반해 15개의 마이크로서비스로 재설계하고 각 서비스가 독립된 오너십을 가지도록 구성
  • Shadowing 기반 검증: 레거시 서비스와 신규 서비스가 동일한 HTTP 요청에 대해 같은 응답을 반환하는지 비교하는 메커니즘 도입, StatsD와 Kibana를 통해 응답 차이(diff)를 로깅 및 추적
  • 점진적 트래픽 이관: 초기 전체 요청의 1% 수준을 신규 서비스로 라우팅해 diff를 모니터링하고 검증 후 트래픽 비율을 단계적으로 증가
  • Dual write 처리: PUT/DELETE 등 데이터 조작 요청은 모든 diff와 무관하게 신규 서비스에도 동시 전송해 두 DB 간 데이터 정합성 유지
  • Go/gRPC 기반 서버 템플릿 제공: 15개 서비스 구현 시 보일러플레이트 코드 작성을 자동화하고 팀원들이 비즈니스 로직 구현에 집중하도록 지원
  • 매일 스탠드업 미팅: 프로젝트 초중반에는 일일 15분, 막바지에는 2시간마다 미팅을 진행해 팀원 간 협업 복잡도와 실패 비용 최소화

Impact

레거시 서비스 분해 완료 후 1개월 이내에 서버 차원의 기능 개선이 다수 이루어졌으며, 이는 레거시 서비스 존속 시에는 불가능했던 속도의 개발이었다.

Key Takeaway

높은 복잡도의 대규모 시스템 마이그레이션은 조직의 커뮤니케이션 구조를 아키텍처 설계의 기준으로 삼고(Conway's Law), Shadowing을 통해 '신규 서비스가 기존 서비스를 얼마나 정확히 대체했는가'를 정량 측정함으로써 프로젝트의 가시성과 팀의 자신감을 확보할 수 있다.


모놀리식 서비스를 마이크로서비스로 분해하는 작업을 진행하는 팀에서 Shadowing 패턴(동일 요청을 신규/레거시 서비스 양쪽에 전송하고 응답 diff를 수집)을 적용하면 숨겨진 버그(타임존 처리 차이, 부동소수점 연산 방식 차이 등)를 사전에 발견하고 안전한 트래픽 이관(1% → 단계적 증가)의 근거로 활용할 수 있다.

원문 읽기