스카라브 진단 스위트 현장 테스트 #012: Next.js 소스맵 출처 경계

발행: (2026년 6월 7일 AM 12:54 GMT+9)
8 분 소요
원문: Dev.to

Source: Dev.to

이 필드 테스트는 Next.js를 대상으로 진행되었습니다.
문제는 Next.js #94450 이슈였습니다:
https://github.com/vercel/next.js/issues/94450

보고된 문제는 React Compiler와 Turbopack이 사용될 때 프로덕션 브라우저 소스맵이 발생하는 것이었습니다.
가시적인 증상은 최종 브라우저 소스맵이 원본 클라이언트 소스 내용을 보존하지 않고 변환된 컴파일러 출력물을 노출한다는 것이었습니다.

이는 소스맵이 단순히 디버깅용 부가 자료가 아니라 출처(프로베넌스) 아티팩트이기 때문에 중요합니다. 소스맵은 브라우저 출력이 어떤 소스에서 왔는지를 개발자에게 알려줍니다.
소스맵이 어떤 파일을 나타낸다고 주장하면서 sourcesContent에 원본 파일 내용이 아닌 컴파일러가 변환한 출력을 담고 있다면, 디버깅 아티팩트는 보존해야 할 원본 진실(source truth)에서 벗어나게 됩니다.

유용한 진단 경계는 다음과 같습니다.
original client source → transform source map → Turbopack source‑map composition → final browser chunk map

중요한 증거는 Babel/React Compiler 변환 자체가 원본 클라이언트 파일을 그대로 나타내는 sourcesContent를 가진 소스맵을 생성할 수 있다는 점이었습니다.
따라서 손실이 단순히

React Compiler가 코드를 바꿨다
는 것이 아니라는 것입니다.

더 날카로운 문제는

브라우저 소스맵 합성 경로가 최종 아티팩트까지 원본 소스 권한을 보존하지 못한다
는 점이었습니다. 이 때문에 해결 범위가 훨씬 좁아졌습니다.

로컬 수정 후보는 두 부분으로 구성됩니다.

  1. Babel 로더 변환 맵에서 원본 로더 입력 소스를 보존한다.
  2. 들어오는 변환 맵이 sourcesContent를 누락했을 때, 원본 경로에서 소스맵 파일 출처를 채워 넣어 Turbopack이 합성 과정에서 변환 맵을 생성된 중간 파일에 매핑할 충분한 식별 정보를 갖도록 한다.

목표는 소스맵 동작을 전반적으로 재작성하는 것이 아니라, 최종 브라우저 맵을 사후에 패치하는 것이 아니라, 변환 맵이 브라우저 아티팩트에 합성되는 시점에서 소스 권한을 보존하는 것입니다.

React Compiler 클라이언트 컴포넌트에 원본 소스 마커를 넣은 회귀 테스트 픽스처가 추가되었습니다.
테스트는 프로덕션 브라우저 소스맵이 원본 클라이언트 소스 내용을 유지하고, React Compiler 런타임 출력과 같은 변환 마커를 노출하지 않는지를 검증합니다.

로컬 검증은 다음을 통과했습니다.

  • 집중된 브라우저 소스맵 증명
  • 관련 Turbopack 소스맵 유틸리티 테스트
  • 수정된 파일에 대한 Rust 포맷팅
  • diff 정리

아직 공개적으로 이슈를 제기하지 않았습니다.

  • 프로젝트: Next.js
  • 이슈 유형: 프로덕션 브라우저 소스맵 출처(provenance)
  • 경계: 변환 소스맵 권한 ↔ 최종 브라우저 아티팩트 합성
  • 결과: 좁은 로컬 수정 후보와 회귀 픽스처
  • 상태: 로컬 증명 준비 완료; 아직 공개 PR이나 코멘트는 없음

이 필드 테스트에서 중요한 점은 버그를 “소스맵이 잘못됐다”는 모호한 문제로 취급하지 않았다는 것입니다. 그것은 너무 포괄적이기 때문입니다.

유용한 질문은 “원본 소스 진실이 어디서부터 보존되지 않게 되었는가?” 였습니다.
답은 첫 번째 변환 단계가 아니라는 것이었습니다. 변환 단계에서는 여전히 원본 소스 내용을 가진 맵을 만들 수 있었고, 문제가 발생한 것은 브라우저 아티팩트가 합성되는 시점이었습니다.

이것이 Scarab이 표면화하도록 설계된 구분입니다.
광범위한 패치는 소스맵 처리를 전면 재작성하거나, fallback 콘텐츠를 비활성화하거나, 최종 출력을 사후에 조정하려 할 수 있습니다.
하지만 더 나은 수리는 출처가 손실되는 정확한 경계를 찾아내는 것입니다.

이번 경우, 소스맵이 합성 과정에서 원본 파일 권한을 전달할 충분한 식별 정보를 가져야 했습니다. 그래서 이 필드 테스트가 의미가 있습니다.

이는 주요 프레임워크 시스템에서 발생하는 소프트웨어 진실 드리프트의 또 다른 사례이며, AI 드리프트가 아니라, 단순 런타임 크래시나 UI 실패가 아니라 아티팩트 진실에 관한 문제였습니다.

  • 원본 파일은 하나의 진실을 가지고 있었고, 변환 맵은 이를 보존했지만, 최종 브라우저 소스맵은 그 진실에서 벗어났습니다.
  • Scarab의 역할은 수정이 시작되기 전에 이런 경계를 식별하는 것입니다. 경계가 명확해지면, 실제 수리는 증상이 암시하는 것보다 훨씬 작게 구현될 수 있습니다.
0 조회
Back to Blog

관련 글

더 보기 »

모바일 한여름 열풍

!Cover image for Mobile Midsommer Madnesshttps://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-uploa...