Next.js
[Next.js] Next.js에서 Suspense 사용
IT 정복가
2025. 9. 29. 08:29
728x90
1. Suspense란 무엇인가?

React의 Suspense는 데이터가 준비될 때가지 기다리지 않고, 로딩 UI를 먼저 보여주는 기능
- 전통적인 방식: 데이터가 다 준비될 때까지 화면이 “텅 빈 상태” → UX에 나쁨
- Suspense: 화면의 뼈대(레이아웃)는 먼저 보여주고, 데이터가 준비되면 그 부분만 채워 넣음 → UX 좋아짐
즉, 로딩을 제어하는 React의 도구이다.
Next.js와 Suspense의 관계
Next.js는 기본적으로 서버 컴포넌트(Server Components) 기반이다.
- 데이터 패칭은 서버에서 처리
- React의 Suspense와 결합 → 스트리밍 렌더링(Streaming Rendering) 가능
※ 사용자는 페이지가 완전히 준비되기 전에 부분적으로라도 화면을 볼 수 있다!
기본 사용 예시
// app/posts/page.js
import { Suspense } from "react";
async function PostsList() {
const res = await fetch("https://jsonplaceholder.typicode.com/posts");
const posts = await res.json();
return (
<ul>
{posts.slice(0, 5).map(post => (
<li key={post.id}>{post.title}</li>
))}
</ul>
);
}
export default function PostsPage() {
return (
<div>
<h2>게시글</h2>
<Suspense fallback={<p>🌀 게시글 불러오는 중...</p>}>
<PostsList />
</Suspense>
</div>
);
}
✅ 동작 과정
- PostsPage가 렌더링될 때, PostsList 데이터는 아직 준비되지 않음
- 대신 fallback={<p>🌀 게시글 불러오는 중...</p>} UI가 먼저 출력
- 데이터가 준비되면 실제 게시글 목록이 화면에 채워짐
병렬 로딩 (Parallel Suspense)
대시보드처럼 여러 데이터 블록이 있을 때, 각 블록이 준비되는 순서대로 보여줄 수 있다.
import { Suspense } from "react";
async function Stats() {
await new Promise(r => setTimeout(r, 2000));
return <div>📊 통계 데이터</div>;
}
async function News() {
await new Promise(r => setTimeout(r, 4000));
return <div>📰 최신 뉴스</div>;
}
export default function DashboardPage() {
return (
<div>
<h2>대시보드</h2>
<Suspense fallback={<p>통계 불러오는 중...</p>}>
<Stats />
</Suspense>
<Suspense fallback={<p>뉴스 불러오는 중...</p>}>
<News />
</Suspense>
</div>
);
}
✅ 결과:
- 2초 후 → 통계 먼저 표시
- 4초 후 → 뉴스 표시
- 전체가 한 번에 뜨는 게 아니라, 준비된 것부터 점진적으로 스트리밍
loading.js와의 차이
- loading.js: 라우트 전체 로딩 상태 제어 (자동 Suspense fallback 역할)
- <Suspense fallback>: 특정 컴포넌트 단위 로딩 상태 제어
즉, 페이지 진입 시 초기 로딩은 loading.js, 페이지 안에서 부분별 로딩은 Suspense로 나눠 쓰는게 일반적이다.
실무 활용 포인트
- 사용자 경험(UX) 개선
- → 긴 로딩을 기다리는 대신, 준비된 부분부터 보여줄 수 있음.
- 대시보드, 피드, 게시판 같은 UI에 최적
- → 여러 컴포넌트가 서로 다른 속도로 데이터를 불러올 때 유용.
- SEO에도 유리
- → 서버에서 스트리밍으로 HTML을 내려주므로 검색 엔진도 일부라도 콘텐츠를 빠르게 인덱싱 가능.
✅ 정리
- Suspense = 데이터 준비 전 fallback UI 보여주는 React 기능
- Next.js(App Router)에서 서버 컴포넌트와 결합 → 스트리밍 렌더링 지원
- loading.js는 라우트 단위, Suspense는 컴포넌트 단위
- 실무에서는 둘을 함께 활용해서 UX를 개선
728x90