Next.js

3강 — 데이터와 캐싱

슬라이드 보는 법

→ / Space다음으로
이전으로
↓ / ↑같은 주제 안에서 단계 이동
O전체 슬라이드 한눈에 보기
F전체화면

아래쪽 화살표가 보이면 그 주제는 단계별로 이어집니다

2강 복습

기본값서버 컴포넌트
'use client'훅 · 이벤트가 필요할 때만
원칙잎사귀에만 붙인다

오늘은 서버 컴포넌트로 데이터를 가져옵니다

오늘 끝나면 할 수 있는 것

  • 컴포넌트에서 바로 데이터를 가져온다
  • 기다리는 동안 다른 부분을 먼저 보여준다
  • 실패했을 때 화면을 만든다
  • 얼마나 자주 새로 받아올지 정한다

오늘 배울 것

  • 12. 서버에서 데이터 가져오기
  • 13. loading.js
  • 14. error.js
  • 15. 캐싱과 revalidate
  • 16. 동적 렌더링

12. 서버에서 데이터 가져오기

화면에 자료를 올리려면

12. 데이터 가져오기 React

            
              'use client';

              function Page() {
                const [posts, setPosts] = useState([]);
                const [loading, setLoading] = useState(true);

                useEffect(() => {
                  fetch('/api/posts')
                    .then(r => r.json())
                    .then(d => { setPosts(d); setLoading(false); });
                }, []);
              }
            
          
React 3강에서 하던 방식
상태 두 개에 effect 하나

Next에서는 몇 줄이면 될까요?

12. 데이터 가져오기 Next

            
              export default async function Page() {
                const res = await fetch(
                  'https://api.example.com/posts'
                );
                const posts = await res.json();

                return <PostList posts={posts} />;
              }
            
          
  • 첫 번째 글
  • 두 번째 글

12. 정리

  • 컴포넌트에 async 를 붙인다
  • await 로 기다렸다가 바로 쓴다
  • 데이터가 준비된 HTML이 브라우저로 간다

13. loading.js

기다리는 동안 보여주려면

13. loading.js

            app/blog/loading.js
            
              export default function Loading() {
                return <p>불러오는 중…</p>;
              }
            
          

불러오는 중…

13. loading.js 스트리밍

app/blog/ ├─ loading.js 데이터 기다리는 동안 └─ page.js 준비되면 이걸로 교체

layout은 그대로 있고 page 자리만 바뀐다

13. 정리

  • React 3강에서 loading state를 직접 만들던 것
  • Next에서는 파일 하나로 끝난다

14. error.js

실패했을 때 보여주려면

14. error.js

            app/blog/error.js
            
              'use client';

              export default function Error({ error, reset }) {
                return (
                  <>
                    <p>문제가 생겼습니다</p>
                    <button onClick={reset}>다시 시도</button>
                  </>
                );
              }
            
          

문제가 생겼습니다

14. 정리

  • error.js 는 항상 'use client'
  • reset() 을 부르면 다시 시도한다
  • 같은 폴더의 layout.js 에서 난 에러는 못 잡는다

15. 캐싱과 revalidate

얼마나 자주 새로 받을지 정하려면

15. 캐싱 기본 동작

            
              const res = await fetch(
                'https://api.example.com/posts'
              );
            
          
한 번 받은 뒤로는
저장해둔 것을 계속 쓴다

글을 새로 써도 목록이 그대로면?

15. 캐싱 고르기

            
              // 60초마다 새로 받는다
              fetch(url, { next: { revalidate: 60 } });

              // 매번 새로 받는다
              fetch(url, { cache: 'no-store' });
            
          
기본계속 저장
revalidate: 6060초마다
cache: 'no-store'매번

15. 캐싱 어떻게 정하나

블로그 글revalidate: 3600
상품 목록revalidate: 60
장바구니no-store
실시간 채팅클라이언트에서 처리

16. 동적 렌더링

요청마다 달라야 한다면

16. 동적 렌더링 searchParams

            
              export default function Page({ searchParams }) {
                const q = searchParams.q;
                return <p>{q} 검색 결과</p>;
              }
            
          

고양이 검색 결과

16. 동적 렌더링

정적

빌드할 때 한 번

모두에게 같은 화면
동적

요청할 때마다

사람마다 다른 화면

정리

오늘 배운 것

한눈에

async 컴포넌트await 로 바로 가져온다
loading.js기다리는 동안
error.js실패했을 때. 'use client'
revalidate몇 초마다 새로 받을지
no-store매번 새로
searchParams쓰면 동적 렌더링

실습

직접 만들어봅시다

실습 과제

  1. 공개 API에서 글 목록 받아 /blog 에 그리기
  2. loading.jserror.js 만들기
  3. /blog/[id] 에서 글 하나만 받아오기
  4. revalidate 를 10초로 두고 바뀌는지 확인

API는 jsonplaceholder.typicode.com 을 씁니다

더 볼 것

4강에서는 데이터를 보냅니다