59 lines
3.0 KiB
Markdown
59 lines
3.0 KiB
Markdown
# VD-03: React Router Data Mode와 서버 상태 소유권
|
|
|
|
- 상태: Accepted
|
|
- 결정일: 2026-07-26
|
|
- 적용 브랜치: `feature-frontend-routing-release-recovery-runtime`
|
|
|
|
## 배경
|
|
|
|
기존 라우터는 `BrowserRouter`와 수동 JSX route 목록을 사용했다. 직렬화 가능한
|
|
route registry에 params/search schema, loading/error surface, access, title,
|
|
navigation과 chunk ID가 있었지만 실행 route tree와 독립적이어서 선언과 행동이
|
|
어긋날 수 있었다.
|
|
|
|
이 저장소는 client-only SPA이며 서버 상태는 application input과 TanStack Query가
|
|
소유한다. Framework Mode의 loader/action 중심 데이터 소유권이나 SSR을 도입하지
|
|
않으면서 route object, 오류 경계와 navigation lifecycle은 중앙에서 조립할
|
|
필요가 있다.
|
|
|
|
## 결정
|
|
|
|
1. 고정된 React Router `7.18.1`의 `createBrowserRouter`와 `RouterProvider`를
|
|
사용하는 Data Mode를 기본값으로 채택한다.
|
|
2. 직렬화 가능한 route contract와 React component/codec runtime map을 분리한다.
|
|
3. 모든 executable route object와 navigation은 registry에서 생성한다. JSX에서
|
|
route 목록을 다시 열거하지 않는다.
|
|
4. params/search는 route 경계의 Zod codec으로 parse하고 같은 codec으로 canonical
|
|
URL을 생성한다.
|
|
5. loader/action은 같은 서버 데이터를 직접 다시 요청하지 않는다. 필요하면
|
|
application input 또는 query adapter 한 경로를 호출한다.
|
|
6. 서버 상태, retry, cache와 mutation lifecycle은 application input과 TanStack
|
|
Query가 계속 소유한다.
|
|
7. lazy chunk rejection만 release recovery input으로 보내며 일반 render error는
|
|
route/feature boundary가 소유한다.
|
|
8. Framework Mode, SSR, static generation과 router version upgrade는 별도
|
|
dependency/architecture 브랜치에서 결정한다.
|
|
|
|
## 검증
|
|
|
|
- route contract/runtime map의 누락과 orphan은 TypeScript negative fixture와
|
|
registry gate가 모두 거절한다.
|
|
- duplicate ID/path, unknown codec/surface/chunk와 참조 불일치를 negative registry
|
|
fixture로 검증한다.
|
|
- params/search parse/build round-trip, canonical redirect, 최대 redirect hop,
|
|
access rejection, title/focus와 boundary reset을 unit/component test로 검증한다.
|
|
- Vite dynamic entry와 release route chunk map, runtime config JSON Schema를
|
|
build/release 검증기가 확인한다.
|
|
- chunk failure는 no-store manifest refetch 후 build/release 쌍마다 한 번만
|
|
reload하며 offline, malformed manifest와 storage 실패는 fail-closed한다.
|
|
|
|
## 결과와 rollback
|
|
|
|
Data Router는 navigation lifecycle의 조립 경계이며 서버 데이터 계층이 아니다.
|
|
이 구분을 지키면 React Router를 교체해도 application input과 output port는
|
|
유지된다.
|
|
|
|
rollback은 RP-04 merge를 되돌려 이전 수동 router와 generic route failure
|
|
surface로 복구한다. URL shape와 application API는 유지하고, 이미 배포된 asset
|
|
cache의 purge는 저장소 rollback 범위에 포함하지 않는다.
|