정지용
기술스택 목록
도구

Lerna

프로젝트 4에서 사용했습니다. 각 프로젝트에서 어떤 역할로 썼는지 아래에 정리했습니다.

이 기술은 무엇인가요?

여러 개의 npm 패키지를 하나의 저장소(모노레포)에서 관리하는 빌드·배포 도구

Lerna는 여러 개의 관련 패키지를 하나의 저장소(monorepo)에서 함께 관리할 수 있게 해주는 도구다. 원래는 각 패키지를 개별 저장소로 쪼개 관리할 때 발생하는 버전 동기화, 의존성 중복 설치, 크로스 패키지 변경 반영의 번거로움을 해결하기 위해 만들어졌다. 여러 패키지에 걸친 의존성 설치, 버전 업데이트, 변경된 패키지만 골라 빌드·테스트·배포하는 작업을 한 번의 명령으로 처리할 수 있다.

이럴 때 사용합니다

  • 여러 패키지가 서로 의존하며 자주 함께 변경되는 프로젝트를 하나의 저장소로 묶고 싶을 때
  • 패키지마다 버전을 올리고 배포하는 작업을 수동으로 반복하기 번거로울 때
  • 변경된 패키지만 골라서 빌드·테스트·배포하는 자동화가 필요할 때
  • 여러 저장소에 흩어진 공통 유틸리티나 타입 정의를 한 곳에서 공유하고 싶을 때

핵심 개념

Monorepo
여러 개의 독립적인 패키지를 하나의 Git 저장소 안에서 함께 관리하는 구조로, Lerna가 다루는 대상이다.
packages/
모노레포 내에서 개별 패키지들이 각자의 package.json을 가지고 위치하는 관례적인 디렉터리다.
lerna.json
패키지 버전 관리 방식, 대상 패키지 경로 등 모노레포 전체 설정을 담는 구성 파일이다.
Bootstrap / Link
여러 패키지 간의 의존성을 설치하고, 로컬 패키지끼리는 심볼릭 링크로 연결해 별도 배포 없이 참조할 수 있게 하는 과정이다.
Versioning 전략
모든 패키지의 버전을 하나로 맞추는 Fixed 방식과, 패키지마다 독립적으로 버전을 매기는 Independent 방식 중 선택할 수 있다.
Affected 패키지 실행
마지막 배포 이후 실제로 변경된 패키지만 골라 빌드, 테스트, 배포 명령을 실행하는 기능이다.

기본 Lerna 모노레포 설정

packages/ 하위의 모든 패키지를 모노레포 대상으로 등록하고, 각 패키지가 독립적으로 버전을 갖도록 설정한 예시다.

JSON
// lerna.json
{
  "$schema": "node_modules/lerna/schemas/lerna-schema.json",
  "version": "independent",
  "npmClient": "npm",
  "packages": [
    "packages/*"
  ]
}

처음 쓸 때 흔한 함정

  • bootstrap 이후 워크스페이스 도구(npm/yarn/pnpm workspaces)와 역할이 겹쳐 설정 충돌이 생길 수 있다
  • Fixed와 Independent 버전 전략을 프로젝트 중간에 바꾸면 버전 이력이 꼬이기 쉽다
  • affected 범위 판단이 Git 히스토리 기반이라 히스토리를 얕게 clone하면 오작동할 수 있다

위 개요는 기술 학습을 돕기 위해 자동 생성된 일반 설명입니다. 정확한 사양과 최신 정보는 공식 문서를 확인하세요.

프로젝트별 활용 방식

위 개념이 실제 프로젝트에서 어떻게 쓰였는지 보여줍니다.

함께 사용한 기술

위 프로젝트들에서 같이 쓰인 다른 기술입니다.