인턴

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 원리를 이해하게 됨