Skip to content

데이터 페칭 - App Router ​

Next.js의 패러다임이 App Router로 넘어가면서 가장 큰 변화를 겪은 부분 중 하나가 바로 데이터 페칭 방식이다.

Page Router 방식 ​

Page Router에서는 데이터 페칭이 페이지 단위에서 이루어졌다.
대표적인 방식은 다음 세 가지였다.

tsx
// 1. SSR (Server Side Rendering)
export async function getServerSideProps() {
  return { props: { data: ... } };
}

// 2. SSG (Static Site Generation)
export async function getStaticProps() {
  return { props: { data: ... } };
}

// 3. Dynamic SSG (동적 경로 생성)
export async function getStaticPaths(){
  return {paths:[...], fallback:...}
}

모든 컴포넌트가 클라이언트 컴포넌트로 동작했기 때문에, 서버에서 데이터를 미리 가져오려면 위와 같은 약속된 함수를 통해서만 가능했다.

  • 데이터는 반드시 페이지 레벨에서 가져와야 했고
  • 가져온 데이터를 props로 하위 컴포넌트에 전달해야 했다.

즉, 페이지 → props → 컴포넌트라는 흐름이 강제되었다.

왜 이런 구조였을까?

Page Router에서는 모든 컴포넌트가 기본적으로 클라이언트 컴포넌트처럼 동작했기 때문이다.
페이지 컴포넌트 역시 브라우저에서 한 번 더 실행되었고, 컴포넌트 내부에 직접 데이터 페칭 로직을 작성하면 실행 환경 문제가 발생할 수 있었다.
결국 Next.js는 안전한 실행 모델을 위해 데이터 페칭을 getServerSideProps, getStaticProps 같은 별도 함수로 분리했다.


App Router 방식 ​

App Router의 핵심 철학은 데이터는 필요한 곳에서 직접 불러와라(Fetching data where it's needed)이다.

이제 컴포넌트 자체가 서버 컴포넌트(Server Components)가 될 수 있으므로, 복잡한 설정 함수 없이 일반 비동기 함수(async/await)처럼 코드를 작성할 수 있다.

tsx
// 서버 컴포넌트는 그 자체로 비동기 함수(async)가 될 수 있다.
export async function Page(props) {
  // 컴포넌트 내부에서 직접 await로 데이터를 페칭한다.
  const response = await fetch('https://api.example.com/data');
  const data = await response.json();

  return <div>... </div>;
}

이제 서버 컴포넌트는 그 자체로 비동기 함수가 될 수 있으며, 컴포넌트 내부에서 직접 async / await를 사용할 수 있다.


주요 변경 포인트 ​

  • 컴포넌트 레벨 데이터 페칭: 서버 컴포넌트는 브라우저에서 실행되지 않는다.

    • 따라서 async / await 자유롭게 사용 가능
    • 컴포넌트 내부 fetch 자연스럽게 작성 가능
      이제 컴포넌트 자체가 데이터 페칭 단위가 된다.
  • 예약 함수 제거: 더 이상 다음 함수들을 사용할 필요가 없다.

    • getServerSideProps
    • getStaticProps
    • getStaticPaths
      데이터 페칭 로직이 API가 아닌 일반 JavaScript 비동기 코드로 통합되었다.
  • fetch 확장 & 자동 최적화 : App Router에서의 fetch는 단순한 Web API가 아니다. Next.js가 fetch를 확장하여 Request Memoization, 자동으로 데이터 캐싱(Caching) 및 재검증(Revalidation)을 자동으로 처리한다.
    즉, 여러 컴포넌트에서 fetch를 호출하더라도 불필요한 중복 요청이 발생하지 않도록 최적화된다.


요약

구분Page RouterApp Router
데이터 페칭 방식getServerSideProps / getStaticProps컴포넌트 내 async/await
데이터 위치페이지 레벨 중심필요한 컴포넌트 어디서든
실행 모델서버 + 클라이언트서버 컴포넌트 기본
코드 구조데이터 로직 분리 필요UI와 함께 배치 가능

App Router는 데이터 페칭을 페이지 개념에서 컴포넌트 개념으로 이동시켰다.