Skip to content

yarn Workspace에서 공통 패키지 수정 시 HMR이 동작하지 않는 문제 디버깅


진단하기

yarn workspace를 사용하여 서비스들과 공통 코드를 나누어 관리하는 모노레포 환경에서 문제가 발생했어요.

문제 상황:

  • 공통 코드 워크스페이스 패키지들을 수정한 후, dev server를 껐다 켜줘야만 반영되는 현상
  • 개발 중 HMR(Hot Module Replacement)이 동작하지 않아 생산성이 크게 저하됨
  • 작업 중간에 yarn이 패키지를 resolve하는 과정에서 peer dependency를 찾지 못하는 에러가 발생

이 문제로 인해 공통 패키지를 수정할 때마다 개발 서버를 재시작해야 했고, 이는 개발 속도를 크게 느리게 만들었어요.

재현하기

재현 조건

  1. yarn workspace 기반 모노레포 환경
  2. 여러 서비스가 공통 패키지를 의존하는 구조
  3. 공통 패키지 코드 수정
  4. dev server 실행

발생하는 문제

  • 공통 패키지 수정 사항이 실시간으로 반영되지 않음
  • yarn의 패키지 resolution 과정에서 peer dependency 탐색 실패
  • HMR이 트리거되지 않아 수동으로 서버 재시작 필요

수정하기

yarn PnP(Plug'n'Play) API로 전환

기존 node_modules 방식에서 yarn PnP API를 사용하도록 변경했어요. yarn PnP는 node_modules 폴더를 생성하지 않고, .pnp.cjs 파일을 통해 패키지 의존성을 관리하는 방식이에요.

jsx
// .yarnrc.yml
nodeLinker: pnp; // node-modules에서 pnp로 변경

주요 변경 사항:

  1. 패키지 해상도 최적화: PnP는 패키지를 설치할 때 디스크에 복사하는 대신, .pnp.cjs 파일에 매핑 정보만 저장해요
  2. 의존성 그래프 명확화: peer dependency 해상도가 더 명확하고 빠르게 동작해요
  3. HMR 지원: 워크스페이스 패키지 변경 시 즉시 감지되어 HMR이 정상 동작해요

이렇게 yarn PnP로 전환한 결과, 공통 패키지를 수정해도 dev server를 재시작할 필요 없이 즉시 반영되게 되었어요!

재발방지하기

모노레포 환경에서 yarn PnP 활용

yarn workspace를 사용하는 모노레포 환경에서는 node_modules 방식보다 yarn PnP가 더 효율적일 수 있어요. 특히 여러 패키지가 서로를 참조하는 구조에서는 PnP의 명확한 의존성 해상도가 많은 문제를 예방할 수 있어요.

개발 생산성을 위한 HMR 최적화

공통 패키지를 수정할 때마다 서버를 재시작해야 한다면 개발 속도가 극도로 느려져요. 모노레포를 구성할 때는 처음부터 HMR이 잘 동작하는지 확인하고, 동작하지 않는다면 빠르게 해결해야 해요. yarn PnP, PNPM, Turborepo 같은 최신 도구들은 이런 문제를 더 잘 해결해요.

Peer Dependency 문제 조기 발견

yarn이 peer dependency를 찾지 못하는 에러는 패키지 구조나 설정에 문제가 있다는 신호예요. 이런 경고를 무시하지 말고, 근본 원인을 해결하는 것이 중요해요. yarn PnP는 이런 문제를 더 명확하게 드러내고 해결하기 쉽게 만들어줘요.

새로운 도구에 대한 열린 자세

node_modules 방식이 익숙하다고 해서 계속 고집할 필요는 없어요. yarn PnP처럼 새로운 접근 방식이 문제를 더 잘 해결한다면, 적극적으로 도입을 검토해야 해요. 초기에는 러닝 커브가 있을 수 있지만, 장기적으로는 개발 경험을 크게 개선할 수 있어요.