1. 배경 및 문제점

Flex 팀은 모든 제품을 일주일에 한 번 배포하는 정기 배포 시스템을 운영했습니다. 이 시스템은 초기에는 편리했지만, 시간이 지나면서 몇 가지 심각한 문제점을 야기했습니다.

2. 문제 해결을 위한 전략: 모노레포 해체 및 폴리레포 전환

정기 배포 시스템을 폐기하려고 하다보니 기존의 모노레포 시스템이 더 이상 팀과 제품의 성장에 적합하지 않다고 판단, 정기 배포 시스템을 폐기하고 폴리레포로 전환하는 대규모 리팩터링 프로젝트를 시작했습니다. 이 과정에서 우리는 다음 세 가지 핵심 원칙을 세웠습니다.

원칙 1: 명확한 경계 없이 코드를 공유하지 마세요.

모노레포냐 폴리레포냐는 중요하지 않습니다. 가장 중요한 것은 코드베이스 내에 명확한 경계를 설정하는 것입니다. 기존 모노레포에서는 workspace:*를 통해 패키지를 자유롭게 공유하면서 의도치 않은 파급 효과(side effect)가 발생했습니다. A팀이 App1과 App2에 사용되는 패키지를 수정했는데, B팀이 App3에 사용하기 위해 해당 패키지를 수정하면서 App1과 App2에 갑작스러운 변경사항이 생기는 문제가 빈번했습니다.

이러한 문제를 해결하기 위해, 우리는 폴리레포를 채택하여 레포지토리 자체를 경계로 삼았습니다. 이는 업무 공유의 어려움, 코드 파편화, 원자적 커밋 불가능과 같은 단점이 있지만, 배포의 안정성과 속도를 크게 확보할 수 있는 장점이 훨씬 크다고 판단했습니다.

원칙 2: 코드베이스를 복잡한 상태로 방치하지 마세요.

개발자가 인지할 수 있는 의존성의 범위는 한정적입니다. 패키지 수가 375개까지 늘어나자 개발 생산성은 물론이고 팀의 개발 문화까지 악영향을 받기 시작했습니다. 이를 해결하기 위해 우리는 다음 두 가지 방법을 실행했습니다.

원칙 3: "뭔지 모를 공유 모듈"을 만들지 마세요.

무분별한 공유 모듈은 오히려 코드베이스의 취약성을 높이고 개발 생산성을 떨어뜨립니다. 우리는 공유 모듈의 기준을 명확히 정의했습니다.

이 외의 모든 코드는 과감하게 각 사용처에 내재화하고 중복을 허용했습니다. 이는 코드가 고립되도록 만들어 추후 개별 레포지토리로 분리하기 용이하게 했습니다. flex-apps와 같이 비즈니스 로직을 담는 앱은 의존성을 끊어 완벽하게 독립적으로 운영될 수 있도록 작업했습니다.

3. 결과 및 향후 계획