10년 가까이 성장한 대규모 BROS monolith에서 여러 team이 하나의 거대한 delivery-service module과 main DB를 공유하며 생긴 불명확한 ownership, listener call chain, 성능 문제를 4개월 반 동안 점진적으로 개선한 사례를 소개한다. 스파게티 코드를 '알덴테'까지 무장애로 끌고 간 방법이 핵심이다.
핵심 포인트- 39개 application event와 19개 후처리 listener가 순환 service call로 얽힌 구조를, 미사용 listener 삭제 후 남은 로직을 소유 domain의 direct method call로 옮기고 transaction을 분리해 listener를 Kafka·SNS 등 필요한 다섯 개로 축소
- rider server가 common module의 delivery transaction을 직접 실행하던 것을 delivery server API 호출로 바꾸고 actor dependency를 entry server 앞으로 빼내며, rider notification은 messenger server가 Kafka event를 소비해 WebSocket 발행하도록 이관해 server별 역할을 조직 책임에 정렬
- 가장 많이 호출되는 진행 배달 API는 중복 query 제거·read replica 활용·insert 순간만 짧은 transaction·response 경량화로, network hop이 늘었는데도 latency 약 4ms·payload 최대 44%·peak writer DB CPU 최대 7% 감소, 모든 변경은 0·1·10·50·100% feature flag와 JSON diff·Boy Scout rule로 매주 무장애 배포
왜 읽나살아있는 대형 모놀리스를 멈추지 않고 점진적으로 분해하려는 엔지니어에게 listener 정리·책임 재배치·성능 최적화·무장애 배포 장치를 엮은 실측 회고.