인턴
pnpm Workspace 기반 모노레포에서 의존성 미인식 문제 해결
jjangsh
2025. 6. 13. 14:12
문제상황
프로젝트는 apps/web, apps/mobile, packages로 구성된 pnpm workspace 기반 모노레포 구조
web 프로젝트에서 정상적으로 사용 중인 lodash를 mobile 프로젝트에서 동일하게 사용하려 하자, 런타임에서 다음과 같은 오류 발생:
Module not found: Can't resolve 'lodash'
처음에는 루트에 패키지가 설치되어 있으니 모든 하위 앱에서 자동으로 사용할 수 있을 거라 생각했지만, 실제로는 mobile 프로젝트에서 lodash를 인식하지 못함
원인 분석
pnpm-workspace.yaml에는 다음과 같이 설정되어 있어, 프로젝트는 각각 workspace로 독립 관리되고 있음:
packages:
- "apps/*"
- "packages/*"
pnpm은 각 workspace에서 사용하는 의존성을 명시적으로 선언해야 하며, apps/web에만 설치된 의존성은 apps/mobile에 자동 공유되지 않음
또한, pnpm은 의존성 hoisting 시에도 각 workspace의 package.json에 해당 패키지가 정의되어 있어야 모듈을 노출함
결과적으로, mobile의 package.json에 lodash가 명시되지 않아 호이스팅된 패키지에도 접근할 수 없던 상황
해결과정
apps/mobile/package.json의 dependencies에 lodash가 누락되어 있음을 확인
다음 명령어를 통해 lodash를 workspace 범위로 명확히 지정하여 설치:
pnpm add lodash --filter ./apps/mobile
mobile 프로젝트 내에서 lodash import 및 빌드 정상 동작 확인
결과
- 모노레포에서는 각 앱/패키지의 의존성은 별도 명시 필요
- 루트의 node_modules에 있더라도, 하위 앱의 package.json에 없다면 접근 불가
- pnpm workspace 구조와 의존성 hoisting 원리를 이해하게 됨