필드 테스트 #020b — Next.js 루트 소유권 개선 (Root Ownership Refinement)
요약
Next.js의 루트 소유권 추론 방식을 개선하여 모노레포 환경에서의 문제를 해결합니다. 단순히 가장 가까운 락파일을 찾는 대신, 워크스페이스 권한(workspace authority)을 기준으로 루트를 식별하여 잘못된 디렉토리 트리를 방지합니다.
핵심 포인트
- 워크스페이스 권한 중심의 루트 추론 방식 도입
- 잘못된 부모 락파일로 인한 모듈 해석 오류 해결
- 유효한 모노레포 구조 및 워크스페이스 설정 보존
- pnpm-workspace.yaml 및 package.json 기반의 명시적 신호 활용
패치의 첫 번째 버전은 이 문제를 가장 가까운 루트(nearest-root) 문제로 다루었습니다.
그것은 너무 광범위했습니다.
#92978에서의 실패는 길을 잃은 부모 락파일(lockfile)이 Next.js로 하여금 앱의 실제 프로젝트 경계보다 훨씬 더 넓은 루트를 추론하게 만든 것과 관련이 있었습니다. Turbopack의 경우, 이는 모듈 해석(module resolution)과 파일 와칭(file watching)을 잘못된 디렉토리 트리로 라우팅할 수 있습니다.
하지만 유효한 모노레포(monorepo) 사례도 존재합니다:
/monorepo/pnpm-lock.yaml
/monorepo/apps/docs/pnpm-lock.yaml
그러한 레이아웃에서는 상위 락파일이 올바른 루트가 될 수 있습니다.
따라서 더 나은 규칙은 다음과 같은 것이 아닙니다:
가장 가까운 락파일이 승리한다 (nearest lockfile wins)
또는:
가장 높은 락파일이 승리한다 (highest lockfile wins)
더 나은 규칙은 다음과 같습니다:
워크스페이스 권한이 승리한다 (workspace authority wins)
업데이트된 패치는 이제 실제로 워크스페이스를 소유하는 루트 마커(root markers)와 단순히 우연히 탐지된 부모 마커(parent markers)를 분리합니다.
현재 수정된 형태:
명시적인 pnpm-workspace.yaml 루트는 여전히 승리합니다.
워크스페이스를 선언한 부모 package.json 루트도 여전히 승리합니다.
워크스페이스 권한이 없는 일반 부모 락파일은 무시됩니다.
워크스페이스가 없는 부모 패키지 루트는 무시됩니다.
더 높은 워크스페이스 권한이 존재하지 않을 때 중첩된 앱 락파일은 유효하게 유지됩니다.
이를 통해 길을 잃은 부모 락파일(stray-parent-lockfile) 실패 문제를 해결하면서 의도된 모노레포 동작을 유지합니다.
변경 사항
이제 PR은 단순히 락파일 거리에 의존하는 대신 워크스페이스 권한(workspace authority)을 중심으로 루트 추론을 좁힙니다.
중요한 차이점은 다음과 같습니다:
발견된 마커가 자동으로 루트 소유권을 갖는 것은 아니다 (discovered marker is not automatically root ownership)
부모 락파일이 루트 탐지에 의해 발견될 수는 있지만, 앱의 추론된 루트를 장악하도록 허용되지는 않습니다.
패치는 다음과 같이 명시적인 워크스페이스 신호를 제공할 때만 상위 루트를 유지합니다:
pnpm-workspace.yaml
또는 워크스페이스를 포함한 부모 package.json
그 외의 모든 것은 루트 소유권이 아닌 진단 컨텍스트(diagnostic context)로 남습니다.
테스트 커버리지
업데이트된 테스트는 경계의 양측을 모두 다룹니다:
길을 잃은 부모 락파일이 루트 추론을 가로채지 않음
워크스페이스가 없는 부모 패키지 루트가 루트 추론을 가로채지 않음
워크스페이스를 가진 상위 패키지 루트는 여전히 승리함
더 높은 pnpm-workspace.yaml 루트가 여전히 승리함
이것이 첫 번째 패치와의 핵심적인 차이점입니다.
첫 번째 패치는 보고된 실패 경로를 수정했습니다.
업데이트된 패치는 유효한 모노레포 (monorepo) 경로 또한 보존합니다.
현재 PR
PR: vercel/next.js#94597
제목: 워크스페이스 루트를 추론할 때 길을 잃은 부모 락파일 (lockfiles) 무시하기
필드 테스트 결과
이번 필드 테스트는 단순한 루트 거리 수정에서 루트 소유권 (root-ownership) 수정으로 강화되었습니다.
이제 경계가 더 명확해졌습니다:
부모 마커는 워크스페이스 권한을 가지고 있지 않는 한 앱 루트를 소유해서는 안 됩니다.
이것이 보고된 실패를 수정하는 것과 더 큰 모노레포 불변성 (invariant)을 보존하는 것 사이의 차이점입니다.
결과적으로 도출된 패치는 더욱 정밀합니다:
길을 잃은 부모 락파일 (lockfiles)이 필터링됨
워크스페이스 루트가 보존됨
집중된 테스트가 두 경로를 모두 커버함
루트 추론이 더 이상 발견된 모든 부모 마커를 소유자로 취급하지 않음
공개 사항: 이 기사는 본인의 필드 테스트 노트, PR 기록, 검증 로그 및 수정 요약본을 바탕으로 AI의 도움을 받아 작성되었습니다. 기술적 작업, 이슈 분석, 패치 검토 및 최종 주장은 발행 전 본인에 의해 검토되었습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기