Next.js/라우팅/Lesson 10
Layout vs Template — 상태 유지 vs 매번 새로 마운트
25분·theory
이 챕터
2/3
TypeScript
Layout vs Template — 상태 유지 vs 매번 새로 마운트
💡 왜 배워야 할까요? — 상태가 살아남느냐 죽느냐
🎯
App Router 에서 라우트 이동 시 layout.tsx 는 다시 마운트되지 않습니다 — 즉 그 안의 useState·useRef·스크롤 위치·재생 중인 비디오가 그대로 유지.
💼
이게 좋을 때도 있고 (사이드바·헤더), 나쁠 때도 있습니다 (페이지마다 입장 애니메이션을 다시 보여주고 싶을 때).
⚡
template.tsx 는 layout.tsx 와 모양은 같지만 **매 이동마다 새로 마운트** — useEffect 가 다시 실행됨.
🔗
보통 90% 는 layout 으로 충분. template 은 특수 케이스 (입장 애니메이션·페이지별 추적·강제 리셋) 에서만.
🏢 실무에서는
codemaster40 의 사이드바는 카테고리 사이를 이동해도 같은 사이드바를 유지합니다 — layout.tsx 의 효과. 만약 카테고리 이동마다 사이드바의 펼침/접힘 상태가 리셋된다면, 그건 template.tsx 로 잘못 짠 경우. 반대로 페이지마다 새 fade-in 애니메이션을 보여주고 싶다면 template.tsx 가 적합.
Layout · Template · 상태 유지 모델
1. layout.tsx — 자식 사이 이동 시 마운트 유지
- ▸
/dashboard/posts→/dashboard/users이동 시: layout 은 그대로, children 만 새 페이지로 교체. - ▸layout 안의 Client Component 가
useState를 갖고 있다면 그 state 는 유지됨.
2. template.tsx — 매번 새로 마운트
- ▸
/dashboard/posts→/dashboard/users이동 시: template 이 새로 마운트 → fade-in 애니메이션 다시 실행. - ▸페이지별 입장 애니메이션·페이지뷰 추적(useEffect 가 매번 실행돼야 함) 에 적합.
3. 둘이 함께 있을 수도 있음
렌더 순서: layout > template > page. 이동 시 layout 은 살아남고, template 과 page 가 매번 새로.
4. 시각화 — 상태 유지 모델
5. 언제 무엇을?
template 은 정말 필요할 때만. 무지성 template = 매번 마운트 비용 + 깜빡임.
💡 💡 Layout vs Template 결정 가이드
1. 기본은 항상 layout. template 은 '왜 필요한가' 답할 수 있을 때만
무지성 template 사용 = 매번 마운트 비용 + state 리셋으로 인한 사용자 짜증.
2. 'state 가 페이지 이동에도 살아남으면 좋은가?'
- ▸예 → layout (사이드바·전역 셸·재생 중인 비디오 플레이어)
- ▸아니오 → template (페이지마다 깨끗하게 시작)
3. template 이 필요한 명확한 신호 3가지
- ▸페이지 전환 애니메이션 (fade-in·slide-in)
- ▸페이지뷰 분석 — useEffect 가 매 페이지 진입마다 실행되어야 함
- ▸폼 자동 초기화 — 페이지 떠났다 와도 빈 상태
4. layout.tsx 도 'use client' 면 그 안의 state 가 유지
layout 이 Server 든 Client 든 인스턴스가 유지된다는 사실은 같음. Client layout 의 useState 는 정상 유지.
5. 둘 다 children 만 받는다 — 페이지 props 직접 못 받음
layout·template 모두 params 를 받을 수 있지만 (동적 라우트), 페이지의 데이터 props 를 받을 수는 없음. 데이터는 페이지가 직접 fetch.
⚡ 직접 실행해보기 — layout vs template 인스턴스 추적
라우트 이동마다 layout 과 template 이 어떻게 다르게 동작하는지 시뮬레이션합니다.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
사이드바의 '메뉴 열림/접힘' 상태가 카테고리 이동 시에도 그대로 유지되어야 한다면, 그 사이드바는 어디에 두어야 하나요?
먼저 읽으면 좋은 개념: 동적 라우팅 — [slug] · [...slug] · generateStaticParams
다음 추천: Middleware — 인증·리다이렉트·헤더