Monorepo 란?
vcs에서 같은 repository에 여러 프로젝트들이 모여있는 소프트웨어 개발 전략
장점
코드 재사용이 쉬움 - 다른 개발자의 코드를 볼 수 있기 때문에, 코드 재사용이 쉽다.
빌드 최적화 - 여러 프로젝트들이 third-party dependency에 의존하고 있을때, 그 dependency가 여러번 다운로드 되고, 빌드 될수있다. monorepo 에서는 참조된 의존성들이 같은 코드베이스에 존재하므로 빌드가 쉽게 최적화 될수있다.
의존성 관리가 편해짐 프로젝트들이 독립된 repository에서 실행이될때는 하나의 프로젝트의 버전이 다른 프로젝트의 어떤 버전와 호환이 되는지 sync를 할필요가 있다. 이러한 과정을 관리하는것은 정말 복잡한 일이다. monorepo는 프로젝트들사이에 호환성을 파악하기가 편리해진다.
One source of truth - 각각의 프로젝트들이 독립적인 설정들을 갖는것 대신에, 모든 프로젝트들에 대해서 하나의 config만 가지게 되므로 프로젝트 관리하기가 편해진다.
Atomic Commit Convention 시스템의 한가지 측면만 영향을 주는 commit을 말한다. atomic commit을 하게되면 에러가 발생했을때, 에러의 발생원인을 더 찾기 쉬워진다. 왜냐하면 해당 에러에 관한 커밋들만 보면되기 때문이다. 결국 monorepo는 한번의 커밋으로 모든 패키지들에 영향을 줄수 있으므로, 개발 프로세스가 빨라진다.
Large-scale 코드 리팩토링 개발자들이 전체 프로젝트에 대해서 접근 할수 있으므로, 리팩토링후에 전체 프로젝트의 각각의 sub-project들이 계속해서 동작함을 보장할수 있다.
팀들간의 협업효과가 증가한다. 팀들이 서로서로의 프로젝트들을 개선할수 있기때문에 협업효과가 증가한다.
단점과 한계점
version information의 손실 - 전체 프로젝트들을 통틀어서 버저닝을 하게되면 서브 프로젝트들의 버저닝 정보가 손실될수있다.
프로젝트별 접근통제가 힘들어진다 - 프로젝트에 있는 모든 소프트웨어에 읽기 접근이 가능하므로, 새로운 보안이슈가 생겨날수있다. 하지만 Apache Subversion을 사용하면 path별로 권한 설정이 가능해진다.
빌드 시간이 증가한다 - 독립된 프로젝트를 빌드하는것보다 빌드시간이 증가한다.
Git performance - 전체 코드가 하나의 리포에있으므로, git이 트래킹해야하는 커밋수가 많아진기때문에 git의 performance가 느려질수 있다.
하나의 repository가 여러개의 프로젝트들을 포함하고있으므로, 용량이 커진다. -> git의 sparse checkout (저장소의 특정 디렉토리나 파일만 보이도록 체크아웃하는 기능) 을 사용하면 해결이 가능