23P by xguru 2022-02-28 | favorite | 댓글 4개

Monorepo란 무엇인가

  • "여러 개의 개별 프로젝트를, 잘 정의된 관계를 통해서 하나의 Repo에 담은 것"
  • Monorepo ≠ Monolith

왜 해야할까 ?

  • 기존의 Polyrepo(여러개의 Repo를 사용하던 방식)를 선택한 이유는 "팀 자율성(team autonomy)" 때문이었음
    • 팀들이 각자 원하는 라이브러리를 선택하고, 누가 코드에 기여하고 사용하는 지를 결정하는게 가능
  • PolyRepo
    • 코드 공유가 번거로움
    • 코드 중복이 많음
    • 공유 라이브러리의 크리티컬 버그 및 큰 변경시 비용이 많이 듬
    • 프로젝트별 일관되지 않은 개발도구 사용
  • Monorepo
    • 새로운 프로젝트를 생성하는 오버헤드가 없음
    • 전체 프로젝트에 걸침 아토믹 커밋
    • 모든 것을 버전 번호 하나로 관리
    • 개발자 모빌리티(프로젝트간 이동)

Monorepo 툴들이 제공하는 기능들과 각 도구간 비교

→ Bazel, Gradle, Lage, Lerna, Nx, Rush, Turborepo

  • 로컬 캐슁
  • 로컬 태스크 오케스트레이션
  • 분산 캐슁
  • 분산 태스크 실행
  • 투명한 리모트 실행
  • 영향받는 프로젝트/패키지 감지
  • 워크스페이스 분석
  • 종속성 그래프 시각화
  • 코드 공유
  • 일관적인 툴링
  • 코드 생성
  • 프로젝트 제약 및 가시성

인식의 전환

모노레포는 여러분의 "조직코드에 대해 생각하는 방식"을 바꿉니다

  • 일관성을 추가하고,
  • 새 프로젝트 생성할 때나 대규모 리팩토링을 수행할 때 마찰을 줄이며,
  • 코드 공유 및 팀간 협업을 촉진함으로써
  • 조직이 보다 효율적으로 작업할 수 있음

다양한 솔루션들이 있지만, 각자 목표가 다름

  • Bazel (by Google) : “A fast, scalable, multi-language and extensible build system.”
  • Gradle (by Gradle, Inc) : “A fast, flexible polyglot build system designed for multi-project builds.”
  • Lage (by Microsoft) : “Task runner in JS monorepos”
  • Lerna : “A tool for managing JavaScript projects with multiple packages.”
  • Nx (by Nrwl) : “Next generation build system with first class monorepo support and powerful integrations.”
  • Rush (by Microsoft) : “Geared for large monorepos with lots of teams and projects. Part of the Rush Stack family of projects.”
  • Turborepo (by Vercel) : “The high-performance build system for JavaScript & TypeScript codebases.”

응용 프로그램을 개발해서 고객사 마다 설치하다보면,
어떤 고객사는 더이상 업그레이드를 원치 않을때도 있고,
어떤 고객사는 그들만의 특별한 버전을 요구할때도 있어요.

그래서 이런 고객사들이 늘어나다 보면,
결국 Repository가 한 수십개의 고객사 맞춤 버전 branch 로 가득합니다.
각 branch 마다 조금씩 다른 버전이 들어있어요.

이런 상황에서 Monorepo 글을 보니까.. 정말 꿈같은 이야기처럼 들리네요. ㅎㅎ

토발즈가 대부분의 상황에서 공유라이브러리는 좋은 생각이 아니라고 했던게 생각나네요.. 최근 적용해보고 있는데 생각보다 공유할만한 부분은 적고 빌드시스템이 꼬이는부분은 커서 저는 모노레포가 기대만큼 이상적인 시스템이 아니라는 생각..

subversion 이 대세이던 시절에는 그냥 너무 당연했던 일인데 뭔가 아이러니하다는 생각이 많이 들어요.
프론트엔드 개발만 한정해서 다뤄지는 것도 의아하고요.
ms 에서 git 도 subversion 처럼 쓸 수 있게 가상파일시스템을 만들었는데 그게 일반화되지 않아서 슬프네요.

뭔가 요즘 보면 기술이 돌고 도는 느낌이 더 심하긴 해요.
어 이거 예전에 별로 였던 그거 아냐? 라는 생각이 들 때가 있어서.. 너무 오래 굴렀나 싶어요. 흑흑