Next.js 16.3, SPA처럼 즉각적인 네비게이션 경험 제공!

by DD
1일 전
조회수 0

Next.js 16.3 Preview 버전이 출시되어 즉각적인 네비게이션(Instant Navigations) 기능 테스트 가능

서버 중심 모델(Server-Driven Model)의 장점을 유지하면서 SPA와 같은 빠른 네비게이션 경험 제공 목표

`cacheComponents: true` 및 `partialPrefetching: true` 플래그를 통해 즉각적인 라우팅(Instant Routing)재사용 가능한 쉘(Reusable Shell) 프리페칭 기능 활성화

개발 및 테스트를 위한 Instant InsightsPlaywright 테스트 헬퍼 제공으로 회귀 방지 강화

즉각적인 네비게이션(Instant Navigations)의 작동 원리

Next.js 16.3의 즉각적인 네비게이션(Instant Navigations)은 서버 중심 모델의 장점을 유지하면서 SPA와 같은 빠른 네비게이션 경험을 제공하는 것을 목표로 함.

Stream 및 Cache 컴포넌트: `cacheComponents: true` 플래그 활성화 시, 비동기 데이터 로딩 시 로딩 상태(Loading State)를 즉시 표시하거나 이전 UI 캐싱(Cached UI)을 활용하여 사용자에게 즉각적인 반응성을 제공함.

Block 옵션: 특정 라우트의 경우 `export const instant = false;`를 통해 서버 응답을 기다리도록 제어 가능하며, 이는 콘텐츠 중심 웹사이트(Content-Driven Websites)에 유용함.

재사용 가능한 쉘(Reusable Shell) 프리페칭: `partialPrefetching: true` 플래그는 라우트별로 단일 로딩 쉘(Loading Shell)을 프리페치하여 클라이언트에 캐싱하고, 이를 여러 링크에서 재사용함으로써 네트워크 왕복(Network Roundtrip) 횟수 감소 및 초기 로딩 속도 향상에 기여함.

성능 개선: 스트림, 캐시, 블록 전략

Next.js 16.3은 네이티브 Node.js 스트림(Native Node.js Streams)을 활용하여 렌더링 성능을 개선하고, 캐싱 전략(Caching Strategy)을 통해 네비게이션 속도를 향상시킴.

스트리밍 SSR(Streaming SSR): 서버에서 UI를 점진적으로 렌더링하여 클라이언트에 전송함으로써, 전체 페이지가 준비되기 전에도 사용자에게 부분적인 UI를 즉시 표시할 수 있음.

컴포넌트 캐싱(Component Caching): `use cache` 훅을 통해 동일한 데이터 요청에 대해 이전 응답을 재사용하여 서버 부하를 줄이고 응답 시간을 단축함.

블로킹 네비게이션(Blocking Navigation): 특정 라우트에서 의도적으로 서버 응답을 기다리게 하여, 데이터 로딩 상태를 숨기고 최종 결과만 보여주는 방식을 선택할 수 있음.

이러한 옵션들은 개발자가 애플리케이션의 특성에 맞춰 최적의 사용자 경험과 성능 사이의 균형을 맞출 수 있도록 지원함.

도입 고려사항: 캐싱 및 프리페칭 전략

Next.js 16.3의 새로운 기능들을 도입하기 위해서는 `cacheComponents: true` 및 `partialPrefetching: true` 플래그를 `next.config.ts`에 설정해야 함.

점진적 채택: 기존 애플리케이션에 새로운 기능을 적용할 때, 에이전트 스킬(Agent Skill)을 활용하여 단계별 도입 과정을 안내받을 수 있음.

테스트 용이성: Playwright 테스트 헬퍼(`instant()`)를 통해 즉각적으로 표시되어야 하는 UI 요소들을 검증하고, 네비게이션 회귀(Regression)를 방지할 수 있음.

개발 도구 지원: 내비게이션 인스펙터(Navigation Inspector)를 통해 개발 중 각 라우트의 쉘 로딩 상태를 시각적으로 확인하고, 네트워크 지연 없이 즉시 표시되는 부분과 네트워크 요청 후 표시되는 부분을 구분할 수 있음.

이러한 기능들은 개발 생산성 향상과 함께 안정적인 배포를 지원함.

프리페칭 방식의 변화와 영향

이전 버전의 Next.js는 뷰포트 내 모든 링크에 대해 개별 프리페치 요청을 보냈으나, 16.3 버전부터는 라우트별 재사용 가능한 쉘(Reusable Shell per Route)을 프리페치하는 방식으로 변경됨.

효율성 증대: 동일 라우트 내 여러 링크에 대해 단 한 번의 프리페치만 수행하여 불필요한 네트워크 요청을 줄임.

코드 스플리팅(Code Splitting) 유사 방식: 각 라우트에 필요한 코드를 미리 다운로드하여 클라이언트 측에 캐싱함으로써, SPA의 코드 스플리팅과 유사한 효과를 얻음.

오프라인 네비게이션 가능성: 프리페치된 라우트 쉘은 향후 오프라인 상태에서도 네비게이션을 지원하는 기반이 될 수 있음.

선택적 프리페칭: `prefetch: 'allow-runtime'` 옵션을 통해 런타임 시 캐시된 콘텐츠까지 프리페치 범위를 확장할 수 있으며, 이는 점진적인 로딩 경험을 제공함.

Next.js 16.3: Instant Navigations