pnpm 모노레포에서 React 19 마이그레이션하기: 숨겨진 호이스팅 레이어가 만든 타입 충돌 트러블슈팅
프론트엔드
pnpm 모노레포에서 React 19 마이그레이션하기: 숨겨진 호이스팅 레이어가 만든 타입 충돌 트러블슈팅
두줄요약
pnpm 모노레포에서 React 18과 19를 공존시키며 발생한 타입 충돌을 트러블슈팅했습니다. 호이스팅 차단과 packageExtensions 주입으로 잘못된 React 타입 참조를 해결했습니다.
문제 상황
- pnpm workspace 모노레포에서 React 18과 19를 앱별로 분리했지만, 내부 호이스팅 레이어 때문에 타입 오염 발생
- React 19의 @types/react가 React 18 앱의 서드파티 패키지까지 섞이며 TS2322, TS2786 등 다수의 타입 충돌 발생
원인 분석
- pnpm의 Layer 3 호이스팅 레이어에 동일 패키지의 단일 버전만 올라가는 구조
- TypeScript가 서드파티 패키지 내부에서 상위 경로의 잘못된 React 타입을 참조하는 해석 순서
- 호이스팅 차단 후에는 @sentry/react처럼 peerDependencies에 타입을 명시하지 않은 패키지의 의존성 누락 노출
해결 방법
- .npmrc에서 @types/react, @types/react-dom 호이스팅 제외로 잘못된 타입 참조 차단
- packageExtensions로 @sentry/react에 @types/react peerDependencies를 가상 주입
- 주입된 타입이 virtual store에 배치되도록 해 앱별 React 버전과 타입 컨텍스트 정렬
