Search
Duplicate

MonoRepo와 NPM 그리고 lerna

Created time
2024/01/15 07:50
Last edited time
2024/01/28 04:16
Status
Done
tag

들어가기에 앞서

참고한 자료를 바탕으로 비전문가가 정리한 글이므로 오류가 있을 수 있습니다.
오류에 대한 지적 사항은 언제든지 환영합니다. 부디 댓글로 알려주시길 바랍니다. 감사합니다.

MonoRepo의 개념과 구축 이유

Monorepo를 한마디로 정의하면, '한 레포지토리 내에 독립된 여러 프로젝트를 넣어서 관리하는 것'을 말합니다.
이로 인해 여러 패키지(프로젝트) 사이의 참조 관계나, 관리의 용이성을 살림으로써 코드 재사용이 용이해지고 중복 코드 가능성이 낮아지게 되는 효과를 얻을 수 있습니다.
즉, MonoRepo는 모듈화가 핵심 개념이라고 할 수 있습니다. 물론, 모듈화 자체는 기존의 저장 방식인 MultiRepo(PolyRepo)로도 잘 구축할 수 있지만, MonoRepo의 각 패키지 작업에 대한 제한 사항이 없고 서로 참조하기가 쉽다는 특징 때문에 MonoRepo로 구축하였습니다.

Workspace

MonoRepo에 대해 보다 자세히 이해하려면 workspace에 대한 개념을 알아야 합니다. workspace에 대한 예시로 위 이미지의 facebook/react-native 레포지토리를 들 수 있는데, 이 레포지토리는 독립된 많은 프로젝트를 packages 폴더 내에 각 패키지로 배치시켜 이용하고 있다고 볼 수 있습니다.
 workspace는 MonoRepo를 쉽게 구성할 수 있도록 해주는 기능을 의미하며, 최상위 패키지 내에서 여러 패키지(프로젝트)를 관리합니다. 또한, workspace 내에 있는 패키지들은 서로 참조하는 연관관계를 맺을 수 있습니다.
결과적으로 개발자는 workspace를 사용함으로써 최상위 패키지에서 하위 패키지들에게 한번에 package.json의 종속성을 설치할 수 있으며, 각 패키지들은 자동으로 심볼릭 링크가 적용됩니다.

NPM

현재 workspace기능은 npm과 yarn에서 제공하고 있습니다.
packages, shared 폴더를 workspaces로 지정한 모습
packages 폴더를 workspace로 지정하는 경우, packages 폴더 안에 들어있는 각 프로젝트는 각자의 package.json을 가지고 있어야 합니다. workspace는 해당 package.json을 인식하여 처리하기 때문입니다. 각 패키지의 package.json에는 아래와 같이 필요한 dependency를 추가하여 작성합니다.
{ "name": "obp-host", "version": "1.0.0", "private": true, "dependencies": { "@shared/errorboundary": "^1.0.0", "@shared/hello": "^1.0.1", "@testing-library/jest-dom": "^5.17.0", "@testing-library/react": "^13.4.0", "@testing-library/user-event": "^13.5.0", "@types/jest": "^27.5.2", "@types/node": "^16.18.68", "@types/react": "^18.2.43", "@types/react-dom": "^18.2.17", "react": "^18.2.0", "react-dom": "^18.2.0", "react-scripts": "5.0.1", "web-vitals": "^2.1.4" },
JSON
복사
각 패키지에 맞게 package.json를 설정해주고, 루트에서 npm install 을 실행하면 디펜던시의 호이스팅, symlink 설정 등이 알아서 진행되며, 아래의 이미지처럼 설정이 완료된 것을 확인할 수 있습니다.

lerna

Lerna는 JavaScript 및 Node.js 프로젝트를 효과적으로 관리하기 위한 도구 중 하나입니다. 특히, 다수의 패키지로 구성된 대규모 프로젝트나 모놀리틱 프로젝트를 효율적으로 관리할 수 있도록 도와줍니다. Lerna가 monorepo에서 수행하는 몇 가지 주요 역할은 다음과 같습니다.

패키지 관리:

Lerna는 여러 개의 패키지를 하나의 레포지토리에서 관리할 수 있게 해줍니다. 이는 모든 패키지를 하나의 대규모 프로젝트로 구성할 수 있어서 통합 및 관리가 용이해집니다.

의존성 해결:

모든 패키지의 의존성을 효율적으로 관리할 수 있도록 도와줍니다. 각 패키지가 자체적으로 관리되지만, 필요한 경우 공통 의존성을 상위 수준에서 관리할 수 있습니다.

버전 관리:

각 패키지의 버전을 일괄적으로 관리하고, 필요한 경우 특정 패키지만 업데이트할 수 있도록 해줍니다. 이는 개발 및 배포 단계에서 편의성을 제공합니다.
정리하자면 npm은 MonoRepo 자체를 구성하는 역할을, Lerna는 여러 패키지를 한 번에 쉽게 관리할 수 있게 도와주는 역할을 한다고 볼 수 있습니다.

참고