토스(Toss)는 100명 이상의 프론트엔드 엔지니어가 하루 수백 번 배포하는 대규모 개발 환경에서 모노리포(monorepo)의 고질적인 문제를 해결하고 효율성을 극대화한 사례를 공개했습니다. 과거에는 서비스별로 의존성 버전이 파편화되어 개발 경험 저하와 설치 시간 증가 등의 문제가 있었으나, '카탈로그(Catalog)' 시스템 도입을 통해 이를 성공적으로 극복했습니다.
토스는 pnpm/Yarn의 카탈로그 기능을 활용해 React, Next.js, TypeScript 등 핵심 라이브러리 10~20개의 표준 버전을 중앙에서 정의하고, 각 서비스는 이를 참조하도록 했습니다. 신규 서비스는 카탈로그 참조가 기본값이며, 기존 서비스도 100% 마이그레이션을 완료했습니다. 이 결과, Yarn PnP 파일 크기는 96MB에서 15MB로 84% 감소했고, 개발 서버 실행 속도는 26.7초에서 20.3초로 23% 개선되었으며, 캐시 없는 의존성 설치 시간은 528.4초에서 249.9초로 52% 단축되는 등 정량적인 성과를 거두었습니다.
이러한 기술적 개선과 함께 토스는 엄격한 운영 정책을 수립했습니다. 카탈로그는 'stable-26.08'처럼 발행 연월로 버저닝하며, 한 달에 최대 1회만 발행하고 파괴적 변경은 절대 허용하지 않습니다. 파괴적 변경이 필요한 경우 자동 코드 변환 스크립트(codemod)와 AI 스킬을 함께 제공하여 개발자의 마이그레이션 부담을 줄였습니다. 또한, 자체 개발한 'yarn-plugin-catalogs'를 통해 카탈로그 정책을 코드로 강제하고, 사내 패키지들도 별도의 모노리포로 통합하여 린트(lint) 도구, 파괴적 변경 검사기, E2E 테스트, 릴리즈 워크플로우를 갖추는 등 체계적인 관리를 하고 있습니다.
토스의 사례는 대규모 모노리포 환경에서 단순히 기술 스택을 통합하는 것을 넘어, 일관된 정책을 전파하고 강제할 수 있는 수단과 가시성을 확보하는 것이 얼마나 중요한지를 보여줍니다. 카탈로그라는 기술 위에 월 1회 발행 정책, 정책 강제 도구, 정기 미팅, 패키지 모노리포와 같은 운영적 노력을 1년간 쌓아 올린 결과, 개발 생산성과 안정성을 동시에 잡을 수 있었습니다. 이는 모노리포 운영에 어려움을 겪는 다른 기업들에게 폴리리포(polyrepo) 전환을 고려하기 전에 문제의 본질을 명확히 정의하고 운영 정책을 강화하는 것이 더 효과적인 해결책이 될 수 있음을 시사합니다.