Next.js/기초/Lesson 03
파일 컨벤션 — loading.tsx · error.tsx · not-found.tsx
30분·theory
이 챕터
3/3
TypeScript
파일 컨벤션 — loading.tsx · error.tsx · not-found.tsx
💡 왜 배워야 할까요? — '파일 이름이 곧 동작' 컨벤션
🎯
Pages Router 시절: ` ` 컴포넌트 손수 만들고, 페이지마다 import 해서 조건부 렌더링.
💼
App Router: 같은 폴더에 `loading.tsx` 파일만 두면 끝. Next.js 가 자동으로 ` }>` 으로 감쌈.
⚡
에러 처리도 마찬가지 — `error.tsx` 만 두면 그 폴더 하위에서 발생한 에러를 자동으로 잡아 fallback UI 표시.
🔗
이걸 모르면 '왜 로딩이 자동으로 뜨지?', '에러가 어디서 잡히는지 모르겠다' 같은 디버깅 함정에 빠집니다.
📈
중첩 라우트에서는 가장 가까운 파일이 적용 — 폴더 트리가 곧 UI 트리.
🏢 실무에서는
Server Component 가 await 으로 데이터를 fetch 하는 동안 사용자는 빈 화면을 봅니다. 같은 폴더에 `loading.tsx` 하나 두면 그 동안 스켈레톤 UI 가 자동 노출. 만약 fetch 가 throw 하면 `error.tsx` 가 자동 잡아서 "다시 시도" 버튼 보여줌. 이게 코드 0줄 추가로 가능합니다.
5가지 특수 파일 — 이름이 곧 컨벤션
1. 5가지 파일과 역할
2. loading.tsx — Suspense 자동 래핑
3. error.tsx — 자동 Error Boundary
- ▸
reset()을 호출하면 Error Boundary 를 리셋하고 페이지를 다시 렌더 시도. - ▸
error.digest는 서버 측 에러를 식별하는 ID (로깅용). - ▸
error.tsx는 같은 폴더의 layout.tsx 에서 발생한 에러는 잡지 못함 — 한 단계 위 폴더에 두어야.
4. not-found.tsx — 404 UI
5. 중첩 시 가장 가까운 파일이 적용
가장 가까운 파일이 우선. 같은 폴더에 파일 없으면 부모 폴더로 거슬러 올라가서 찾음.
💡 💡 파일 컨벤션 실전 5
1. error.tsx 는 항상 'use client'
React Error Boundary 가 클라이언트 전용이라 컨벤션상 강제. 빼먹으면 빌드 에러.
2. error.tsx 는 같은 폴더의 layout.tsx 에러를 못 잡는다
layout 에서 throw 가 일어나면 한 단계 위 폴더의 error.tsx 가 잡음. 루트 레이아웃 에러는 global-error.tsx (Client 전용) 가 잡음.
3. loading.tsx 는 page.tsx 의 첫 await 동안만 표시
페이지가 한 번 렌더링 끝나면 사라짐. 이후 client-side 네비게이션 시에는 다시 표시.
4. notFound() 는 throw 와 비슷 — 그 아래 코드는 실행 안 됨
TS 가 narrowing 까지 해줘서 post 가 non-null 로 좁혀짐.
5. 같은 폴더에 모든 컨벤션 파일 두기
폴더가 곧 UI 상태머신. 한눈에 페이지의 모든 상태가 보임.
⚡ 직접 실행해보기 — 파일 컨벤션 매핑
URL 별로 어떤 컨벤션 파일이 어떤 순서로 적용되는지 시뮬레이션합니다.
✏️ JS 코드
📟 콘솔 출력
▶ 실행 버튼을 눌러보세요
⚠️ 브라우저 샌드박스에서 실행 — console.log()만 지원, alert/fetch 불가
확인 퀴즈
App Router 의 `error.tsx` 가 반드시 `'use client'` 여야 하는 이유는?
먼저 읽으면 좋은 개념: Client vs Server 경계