모노레포의 기술 정의 및 도입

임채영·2024년 11월 5일

학습 배경

신규 프로젝트 구축을 위한 프로젝트 관리 전략에서 접하게 모노레포와 멀티레포의 개념을 이해하고 모노레포의 도입을 위하여 학습 진행하였습니다.

모노레포와 멀티레포의 개념

모노레포(Monorepo) :

여러 프로젝트 코드가 동일한 저장소에 저장이 되어 관리되는 소프트웨어 개발 전략 으로 다수의 독립된 프로젝트가 하나의 레포지토리에서 관리가 되며 이는 팀과의 협업, 대규모 리팩토링, 코드의 재사용성 용이, 종속성 관리의 단순화 등 다양한 이점이 있습니다.

멀티레포(Multirepo) :

모노레포와 반대로 각각의 프로젝트는 개별 저장소를 가지며 독립성을 가지고 있습니다. 이런 멀티레포는 소규모의 프로젝트 혹은 다른 프로젝트와 큰 종속성이 필요하지 않은 경우 많이 사용되며 여러 개의 독립적인 프로젝트들이 각자 별도의 리포지토리에서 관리가 필요할때 용이합니다.

모노레포의 도입 기준

신규 프로젝트에서의 모노레포 도입이 필요한지를 생각해보기 위해 모노레포 프로젝트의 생성 기준을 알아보았습니다.

여러 프로젝트/패키지 관리 :
여러 프로젝트를 생성하고 패키지를 관리할 때 모노레포가 적합합니다. 공통으로 쓰는 유틸이나 컴포넌트, 재사용이 되는 코드를 한 곳에서 관리하며 중복된 코드를 줄이고 프로젝트 관리를 효율적으로 할 수 있습니다.

대규모 리팩토링 :
모노레포의 도입 시 공통 코드의 분리로 인해서 코드의 수정이 발생하면 관련된 모든 코드에 자동으로 반영되기 때문에 코드 유지보수가 용이합니다. 반대로 멀티레포의 경우 각각의 독립된 프로젝트임으로 수정이 일어날 경우 여러번의 수정을 해줘야하는 번거로움이 발생 할 수 있습니다.

동일 패키지 관리 및 일관된 개발 환경 :
모노레포는 각각의 프로젝트에서의 패키지 버전이 달라 충돌이 발생하는 일을 방지하고 각 패키지의 최신 버전으로의 업데이트를 일괄적으로 할 수 있어 관리가 쉽고 일관된 개발 환경을 제공 할 수 있습니다.

팀 간의 규모 및 협업 :
팀간의 협업이 필요하거나 규모가 큰 경우 모노레포가 유리할 수 있습니다. 단일 레포지토리에서 프로젝트의 관리가 가능하며, 다른팀에서의 작업 사항이 프로젝트에 어떤 영향을 미치는지 확인이 쉽고 유리합니다.

빌드 복잡성 :
빌드 복잡성이 높은경우에는 빌드 시간이 늘어나고, 모든 패키지가 의존성을 공유하지 않는 경우 오히려 멀티레포의 선정이 더 효율적이라고 볼 수 있습니다. 이 때 빌드 복잡성이란, 코드의 수정으로 연관된 모든 패키지들의 빌드가 일어나며 빌드의 빈도성과 빌드 시간의 증가에 영향이 미치기에 모노레포의 이점이 높다면 nx, turborepo와 같은 모노레포 도구를 통해 빌드 최적화 시키는 방법을 고려해 볼 수 있습니다.

보안 및 접근 권한 :
일반적으로 모노레포에서는 모든 팀원들이 프로젝트의 접근 권한을 가지고 있기 때문에 보안이 중요한 프로젝트이거나 패키지 접근에 대한 방지가 필요한 경우, 프로젝트를 분리하거나 모노레포에서의 권한 설정을 할 수 있도록 해야합니다.

모노레포 도입을 위한 준비작업

신규 프로젝트에서 PC, Mobile, Landing 프로젝트 이외에도 다양한 확장성을 고려함과 동시에 공통 모듈의 재사용성을 높이고 모노레포의 이점을 적극 활용하고자 멀티레포가 아닌 모노레포의 도입을 결정했습니다. 모노레포의 도입을 위해 필요한 작업들을 나열하고 수행하고자 합니다. (진행중)

1. 디렉토리 구조 설계

  • 각 패키지의 역할과 위치 정의하기 : 어떤 프로젝트가 독립적인지, 어떤 패키지가 공통으로 사용되는지 명확히 설계하기.

  • 일관된 경로와 네이밍 설정하기 : 모든 패키지에서 일관된 경로와 네이밍 설정을 통해 관리의 용이성 높이기.

2. 패키지 매니저 선택 및 워크스페이스 설정

  • 패키지 매니저 : 프로젝트에 맞는 패키지 매니저 결정하기. (npm, yarn, pnpm)

  • 워크스페이스 설정 : package.json 파일에 각 패키지의 워크스페이스 경로 설정

3. 빌드와 테스트 도구 선택

  • 모노레포에 특화된 도구를 선택해 빌드와 테스트 최적화 설정하기 (Nx, Lerna, Turbo)

4. 의존성 관리

  • 공통 의존성은 최상위 package.json에, 개별적인 의존성은 해당 package.json에 정의해 중복 설치 방지.

5. CI/CD 파이프라인 설정

  • 개별배포와 전체배포에 따른 배포전략을 구성하고 코드 수정시 자동으로 테스트와 빌드가 일어날 수 있도록 설정.

6. 코드 품질 관리 도구 설정

  • 린트 및 포맷팅 도구, 커밋 규칙 강제를 통해 코드 품질 관리 개선 (Eslint, Prettier, husky, lint-staged)

7. 의존성 및 패키지 간 참조 설정

  • 패키지 참조 설정과 경로 별칭 설정 하기 (package.json. tsconfig.json)

8. 문서화 및 가이드 작성

  • Readme 파일을 통해 각 프로젝트의 구조, 패키지, 규칙에 대한 가이드 작성하기.

9. 버전 관리 시스템 규칙 설정

  • 브랜치 전략 : 각 패키지별 독립적인 개발을 진행 할 수 있도록 브랜치 전략 수립

  • PR 워크플로우 설정 : 특정 패키지의 PR이 다른 패키지에 영향을 미치지 않도록 설정 (labeling, pr지정)

10. 모니터링 및 로깅 설정

  • 개별적인 로깅설정과 에러에 대한 로깅을 중앙에서 관리할 수 있도록 설정

정리

모노레포의 도입을 위해 모노레포와 멀티레포의 개념과 모노레포 도입의 장점과 단점을 비교하고 모노레포 도입을 위해 필요한 준비작업 사항들을 정리해 볼 수 있었습니다.

0개의 댓글