모노레포(Monorepo)는 여러 프로젝트를 하나의 저장소에서 관리할 수 있는 개발 방식으로, 많은 개발자들이 여러 패키지를 보다 효율적으로 관리할 수 있습니다. 오늘은 이러한 모노레포 구성을 위해 `pnpm`을 사용하는 방법에 대해 살펴보겠습니다. 모노레포는 다양한 모듈을 하나의 저장소에서 쉽게 공유할 수 있고, 의존성 관리 측면에서도 유리합니다. 그럼 어떻게 `pnpm`을 활용하여 모노레포 환경을 설정하고 운영할 수 있을지 구체적으로 알아보겠습니다.
1. 프로젝트 초기화: 시작을 알리는 첫 단계
모든 모노레포 구성의 첫 단계는 프로젝트를 초기화하는 것입니다. `pnpm`을 사용하기 위해, 먼저 전역적으로 `pnpm`을 설치해야 합니다. 아래 명령어를 실행하여 설치를 시작하세요:
npm install -g pnpm
`pnpm` 설치가 완료되면, 프로젝트 루트에서 다음 명령어를 통해 새로운 프로젝트를 초기화할 수 있습니다.
pnpm init
이 명령어는 프로젝트의 `package.json` 파일을 생성해 줍니다. 이로써 모노레포 환경을 구축할 준비가 됩니다.
2. pnpm 워크스페이스 구성
모노레포 환경에서는 여러 패키지를 한 곳에서 관리하기 때문에, `pnpm`의 워크스페이스 기능을 적극 활용할 수 있습니다. 워크스페이스는 패키지 간 의존성을 쉽게 관리할 수 있는 강력한 도구입니다. 이를 위해 프로젝트 루트에 `pnpm-workspace.yaml` 파일을 생성하고, 해당 파일에 포함될 패키지들을 정의해야 합니다:
# pnpm-workspace.yaml
packages:
- 'packages/*'
이제 `packages` 디렉토리 하위에 포함된 모든 패키지들이 자동으로 워크스페이스에 포함되며, 이러한 구성은 여러 패키지를 손쉽게 관리할 수 있는 기초가 됩니다.
3. 패키지 구조: 프로젝트의 체계적인 구성
모노레포에서 관리할 패키지를 만들기 위해 `packages` 디렉토리를 생성하고, 그 하위에 각각의 패키지를 초기화합니다. 예를 들어, `ui`와 `api`라는 두 패키지를 구성한다고 가정해보겠습니다.
mkdir -p packages/ui
mkdir -p packages/api
각 패키지 디렉토리에서 `pnpm init` 명령어를 통해 각각의 `package.json` 파일을 생성합니다:
cd packages/ui
pnpm init
cd ../api
pnpm init
이제 `ui`와 `api`라는 두 패키지가 모노레포에 추가되었습니다.
4. 의존성 설치 및 공유: 효율적인 코드 재사용
모노레포의 가장 큰 장점 중 하나는 각 패키지가 다른 패키지의 코드를 쉽게 공유할 수 있다는 점입니다. 예를 들어, `ui` 패키지가 `api` 패키지를 의존성으로 사용할 경우, 다음과 같이 의존성을 설치할 수 있습니다:
cd packages/ui
pnpm add ../api
이 명령어를 실행하면, `ui` 패키지가 `api` 패키지를 의존성으로 포함하게 됩니다. 이를 통해 패키지 간의 코드 재사용이 훨씬 수월해집니다.
5. 공통 의존성 관리
모노레포 프로젝트에서는 각 패키지에서 사용하는 공통 의존성을 프로젝트의 최상위 루트에서 관리할 수 있습니다. 예를 들어, `typescript` 같은 공통 의존성을 설치하려면 다음 명령어를 사용할 수 있습니다:
pnpm add -D typescript
이 명령어는 루트에 `node_modules`를 생성하며, pnpm의 캐시 메커니즘을 통해 중복된 의존성 설치를 방지할 수 있습니다. 이 방식은 의존성 설치 시간을 단축시킬 뿐만 아니라, 저장소 공간도 절약할 수 있는 효율적인 방법입니다.
6. 스크립트 실행: 여러 패키지에서 한 번에 작업하기
모노레포 환경에서는 각각의 패키지에서 스크립트를 실행하거나, 여러 패키지에서 동시에 스크립트를 실행할 수 있습니다. 예를 들어, 모든 패키지에서 `build` 스크립트를 실행하고 싶다면 아래 명령어를 사용할 수 있습니다:
pnpm -r run build
이 명령어는 모노레포에 포함된 모든 패키지에서 `build` 스크립트를 실행하게 됩니다. 만약 특정 패키지에서만 스크립트를 실행하고 싶다면 다음 명령어를 사용할 수 있습니다:
pnpm --filter ui run build
이 명령어는 `ui` 패키지에서만 스크립트를 실행하게 됩니다.
7. 효율적인 캐시 관리
`pnpm`은 모노레포에서 각 패키지의 의존성을 중앙 캐시를 사용하여 관리합니다. 이를 통해 여러 패키지가 같은 의존성을 사용할 때, 한 번만 다운로드된 후 다른 패키지에서도 동일하게 사용할 수 있게 됩니다. 이는 디스크 공간을 절약하고, 전체적인 의존성 설치 속도를 크게 향상시킵니다.
결론
지금까지 `pnpm`을 사용해 모노레포 환경을 구성하는 방법에 대해 알아보았습니다. 모노레포는 여러 프로젝트를 한곳에서 효율적으로 관리할 수 있어 점점 더 많은 개발자들에게 사랑받고 있습니다. 특히 `pnpm`은 빠르고 효율적인 의존성 관리를 제공하므로, 프로젝트의 확장성과 유지보수성을 크게 높여줍니다.
모노레포를 처음 시도하시는 분들이라면 오늘 소개한 방법들을 바탕으로 작은 프로젝트부터 시작해보세요. 그리고 더 나은 코드 재사용과 관리의 편리함을 느끼실 수 있을 것입니다. 더 궁금한 내용이 있으면 언제든지 질문해 주세요. 성공적인 모노레포 구성을 응원합니다!