Next.js의 App router 특징

J·2025년 2월 9일
1

웹 공부

목록 보기
16/19

App Router(Next.js 13+)의 특징

폴더 기반 라우팅

Page router에서는 파일명이 경로가 되었지만 App router에서는 폴더명이 경로를 나타냄

Page Router의 Routing

pages/
├── index.tsx       → `/`
├── about.tsx       → `/about`
├── contact.tsx     → `/contact`
├── blog/
│   ├── index.tsx   → `/blog`
│   ├── [id].tsx    → `/blog/:id` (동적 라우팅)

App Router의 Routing

app/
├── layout.tsx       → 모든 페이지에 공통 레이아웃
├── page.tsx         → `/`
├── about/
│   ├── page.tsx     → `/about`
│   ├── layout.tsx   → `/about` 전용 레이아웃
├── blog/
│   ├── page.tsx     → `/blog`
│   ├── [id]/
│   │   ├── page.tsx → `/blog/:id` (id는 동적 세그먼트)
│   │   ├── loading.tsx → 개별 블로그 로딩 화면

RSC를 default로 적용

이전에 사용하던 getStaticProps(SSG)나 getServerSideProps(SSR)을 사용하지 않아도 된다. 만약 RCC(React Client Component)를 사용하고 싶을 경우 해당 컴포넌트 파일의 상단에 "use client";를 추가해주면 된다.

"use client";

function ClientComponent(){
	return <>
    	//...
    </>
}

특정 역할을 수행하는 특수 파일 API 제공

  • page.tsx (.js or .jsx 가능)
    해당 경로의 Page 파일

  • layout.tsx
    UI 레이아웃. 경로별로 다르게 지정할 수 있다. loading 파일을 렌더링 하거나 다른 페이지를 탐색해도 레이아웃은 다시 렌더링하지 않는다.

  • loading.tsx
    page가 로딩중일때 대체할 수 있는 로딩 화면을 지정할 수 있다. layout 파일에서 Suspense를 쓰면 자동적으로 fallback에 loading.tsx가 래핑된다.

    // app/blog/layout.tsx
    export default function MainLayout({children}: {children: React.ReactNode;}) 
    {
    	return (
        <div>
        	<h1>test</h1>
        	<Suspense>{children}</Suspense>
          {/* <Suspense fallback={<MainLoading/>}>{children}</Suspense> */}
        </div>
    	);
    }

    위의 주석친 Suspense 부분처럼 fallback prop을 명시적으로 지정하지 않아도 자동으로 해당 폴더의 loaindg.tsx나 app 폴더 밑의 공통으로 적용될 loading.tsx가 래핑된다.

  • error.tsx
    런타임 발생시 loading.tsx처럼 대체 화면을 지정할 수 있다. 만약 Error Boundary가 있다면 Suspense에 loading.tsx가 자동으로 래핑된 것 처럼 Error Boundary의 fallback에 error.tsx가 자동으로 래핑된다.

  • route.ts
    해당 경로(URL)에 해당하는 api request handler를 정의할 수 있다.

    		app/
    		├── layout.tsx       → 모든 페이지에 공통 레이아웃
    		├── page.tsx         → `/`
    		├── about/
    		│   ├── page.tsx     → `/about`
    		│   ├── layout.tsx   → `/about` 전용 레이아웃
    		├── blog/
    		│   ├── page.tsx     → `/blog`
    		│   ├── route.ts     → `/blog` api request 처리
    
profile
꾸준한 노력파 개발자의 이모저모

1개의 댓글

comment-user-thumbnail
2025년 2월 10일

next.js 글 반갑네요!
그나저나 그동안 next.js가 많이 바뀐거 같네요.ㄷㄷ
App router와 RSC에 대한 내용은 전혀 모르던 내용들이여서
덕분에 구글링을 더 하며 RCC 와 RSC의 개념에 대해 공부하게 되었습니다!
(참고했던 포스팅 : https://velog.io/@2ast/React-%EC%84%9C%EB%B2%84-%EC%BB%B4%ED%8F%AC%EB%84%8C%ED%8A%B8React-Server-Component%EC%97%90-%EB%8C%80%ED%95%9C-%EA%B3%A0%EC%B0%B0)
이제는 왜 getStaticProps 함수와 getServerSideProps 함수를 사용하지 않아도
되는지 이해가 됐네요! 깊게는 들어가지 못하겠지만요 ㅎ
참고로 loaindg.tsx 라고 오타가 있는 것 같습니다! ㅋ.ㅋ

답글 달기