App Router 레이아웃

Next layout 공유 UI

layout.tsx는 단순한 wrapper가 아니다. App Router의 route tree에서 어느 UI가 유지되고 어느 segment가 교체되는지, 어떤 데이터가 부모에서 캐시되고 자식 이동 때 remount되지 않는지 결정하는 경계다.

01

공유 UI 찾기

사이드바, 탭, 헤더처럼 하위 페이지 이동에도 유지될 영역을 layout에 둔다.

공유하지 않는 UI는 page에 둔다
02

Route tree 읽기

app 폴더의 segment 구조가 어떤 부모와 자식 layout을 만드는지 확인한다.

폴더 하나가 수명 주기 경계를 만든다
03

데이터 위치 결정

여러 자식이 공유하는 fetch는 부모 layout에서, 페이지 전용 데이터는 page에서 가져온다.

캐시와 revalidate 정책을 함께 본다
04

Provider 위치 선택

client provider가 필요한 경우 전체 앱이 아니라 필요한 layout 아래로 내린다.

너무 높은 use client 경계는 번들을 키운다
05

Remount 조건 확인

layout은 유지되고 template은 이동 때 새로 마운트되는 차이를 활용한다.

애니메이션과 초기화 요구에 따라 다르다
layout.tsx
공유 수명 주기 하위 route 전환에서도 유지되는 UI와 데이터를 둔다.
state가 남는다는 점을 고려한다
page.tsx
segment 화면 해당 URL에서 실제로 교체되는 본문과 페이지 전용 데이터를 둔다.
params와 searchParams를 확인한다
template.tsx
전환마다 remount 페이지 이동 때 초기화나 애니메이션이 필요하면 사용한다.
layout과 의도적으로 구분한다
provider
클라이언트 상태 범위 상호작용 상태가 필요한 subtree만 감싸 번들 영향과 rerender를 줄인다.
서버 컴포넌트 경계를 지킨다

레이아웃 확인

전환 유지 하위 페이지 이동 시 사이드바 상태와 공통 데이터가 유지되는지 확인한다.
새로고침 깊은 URL을 직접 열어 같은 layout hierarchy가 구성되는지 본다.
번들 영향 provider 위치 때문에 큰 서버 전용 코드가 클라이언트로 넘어가지 않는지 확인한다.