안동민 개발노트

안동민 개발노트

App Router 구조페이지 생성레이아웃 컴포넌트페이지 간 링크 생성
본문 시작
  1. 홈
  2. 문서
  3. Next.js
  4. 3장 : App Router 기초
  5. 페이지 생성
  1. Next.js
  2. 페이지 생성

페이지 생성

app 폴더에 page.tsx를 배치해 About과 대시보드 페이지를 만들고 중첩 경로와 Link 이동을 확인합니다.

이제 App Router의 기본 구조를 이해했으니, 실제로 페이지를 생성하고 브라우저에서 확인하는 실습을 진행해 볼 시간입니다.

이 절에서는 새 폴더와 page.tsx가 URL을 만드는 규칙, 중첩 라우트(Nested Routes), 그리고 <Link> 이동을 단계별로 안내합니다.


첫 번째 새 페이지 만들기: about 페이지

가장 기본적인 형태의 페이지인 About 페이지를 만들어 보겠습니다.

src/app 디렉터리로 이동: 프로젝트의 루트 디렉터리에 있는 src/app 폴더로 이동합니다.

이곳이 모든 라우트와 페이지가 시작되는 지점입니다.

새로운 폴더 생성: src/app 디렉터리 안에 about이라는 이름의 새로운 폴더를 생성합니다.

layout.tsx
page.tsx

page.tsx 파일 생성: 방금 생성한 about 폴더 안에 page.tsx라는 이름의 파일을 생성합니다.

page.tsx
layout.tsx
page.tsx

page.tsx 파일 내용 작성: src/app/about/page.tsx 파일을 열고 다음 코드를 작성합니다.

src/app/about/page.tsx
export default function AboutPage() {
  return (
    <div>
      <h1>About Us</h1>
      <p>
        이 페이지는 '나 혼자 Next.js' 교재의 예시 프로젝트입니다.
      </p>
      <p>Next.js 16와 함께 웹 개발을 학습하고 있습니다.</p>
    </div>
  );
}

이 파일은 기본적인 React 컴포넌트이며, 특별한 지시어가 없으므로 기본적으로 서버 컴포넌트로 동작합니다.

개발 서버 확인: 개발 서버가 실행 중이지 않다면, 프로젝트 루트 디렉터리에서 npm run dev (또는 yarn dev) 명령어를 실행합니다.

브라우저를 열고 http://localhost:3000/about 주소로 접속해 보세요.

방금 만든 About Us 페이지가 성공적으로 렌더링되는 것을 확인할 수 있습니다.

핵심: App Router에서는 폴더 이름이 URL 경로가 되고, 그 폴더 안의 page.tsx 파일이 해당 경로의 실제 UI를 담당합니다.


중첩 라우트(Nested Routes) 만들기

이제 좀 더 복잡한 페이지 구조를 만들어 보겠습니다.

예를 들어, 대시보드(Dashboard) 안에 설정(Settings) 페이지가 있는 형태입니다.

dashboard 폴더 생성: src/app 디렉터리 안에 dashboard라는 새 폴더를 만듭니다.

layout.tsx
page.tsx

dashboard/page.tsx 파일 생성: dashboard 폴더 안에 page.tsx 파일을 생성하고 다음 내용을 작성합니다.

이 파일은 /dashboard 경로의 페이지가 됩니다.

src/app/dashboard/page.tsx
export default function DashboardHomePage() {
  return (
    <div>
      <h1>Welcome to Dashboard!</h1>
      <p>여기는 대시보드의 홈 페이지입니다.</p>
    </div>
  );
}

http://localhost:3000/dashboard로 접속하여 확인해 보세요.

dashboard/settings 폴더 생성: dashboard 폴더 안에 다시 settings라는 새 폴더를 만듭니다.

page.tsx
layout.tsx
page.tsx

dashboard/settings/page.tsx 파일 생성: settings 폴더 안에 page.tsx 파일을 생성하고 다음 내용을 작성합니다.

이 파일은 /dashboard/settings 경로의 페이지가 됩니다.

src/app/dashboard/settings/page.tsx
export default function DashboardSettingsPage() {
  return (
    <div>
      <h2>Dashboard Settings</h2>
      <p>대시보드 설정을 관리하는 페이지입니다.</p>
    </div>
  );
}

개발 서버 확인: http://localhost:3000/dashboard/settings 주소로 접속하여 방금 만든 중첩 페이지가 잘 렌더링되는지 확인합니다.

핵심: 폴더 안에 폴더를 생성하고 그 안에 page.tsx를 두는 방식으로 URL 경로가 계속 중첩됩니다.

이는 파일 시스템 구조와 URL 경로가 일치하는 매우 직관적인 방식입니다.


페이지 간 이동: <Link> 컴포넌트 사용하기

웹 애플리케이션에서는 페이지 간에 이동하는 기능이 필수적입니다.

Next.js는 페이지 간의 클라이언트 사이드 탐색을 위해 <Link> 컴포넌트를 제공합니다.

이는 일반적인 HTML의 <a> 태그보다 여러 이점을 제공합니다.

  • 클라이언트 사이드 탐색: <Link>는 페이지 전체를 새로 고치지 않고, JavaScript를 사용하여 페이지 간의 부드러운 전환을 제공합니다.
  • 사전 로딩 (Preloading): production에서는 뷰포트에 들어온 <Link>의 대상을 정책에 따라 미리 가져올 수 있습니다. 자동 프리페치는 개발 서버에서 실행되지 않으므로, 이 절의 npm run dev 실습은 클릭 이동과 URL 대응을 확인합니다.

이제 src/app/page.tsx (루트 페이지)에 다른 페이지로 이동하는 링크를 추가해 보겠습니다.

src/app/page.tsx 수정: src/app/page.tsx 파일을 열고 다음과 같이 수정합니다.

src/app/page.tsx
import Link from 'next/link'; // Link 컴포넌트 임포트

export default function HomePage() {
  return (
    <div>
      <h1>Welcome to '나 혼자 Next.js'!</h1>
      <p>Next.js 16 App Router와 함께 웹 개발을 시작합니다.</p>

      <nav style={{ marginTop: '20px' }}>
        <ul>
          <li>
            <Link href="/about">
              About 페이지로 이동
            </Link>
          </li>
          <li>
            <Link href="/dashboard">
              Dashboard 홈으로 이동
            </Link>
          </li>
          <li>
            <Link href="/dashboard/settings">
              Dashboard 설정 페이지로 이동
            </Link>
          </li>
        </ul>
      </nav>
    </div>
  );
}

주의: Next.js 13부터 <Link>가 자체적으로 <a> 요소를 렌더링합니다.

따라서 <Link><a>...</a></Link>처럼 <a>를 중첩하면 안 됩니다.

텍스트나 React 요소를 바로 자식으로 전달하고, 스타일 클래스와 링크 속성은 <Link>에 지정합니다.

개발 서버 확인: http://localhost:3000으로 접속하여 링크들이 잘 표시되는지 확인하고, 각 링크를 클릭하여 페이지가 부드럽게 전환되는지 테스트해 보세요.

브라우저의 새로고침 없이 내용만 바뀌는 것을 보실 수 있을 겁니다.


동적 라우트 개념 잡기 (예고편)

지금까지는 정적인 경로를 가진 페이지만 만들었습니다.

하지만 게시물 상세 페이지(/posts/1), 사용자 프로필 페이지(/users/john-doe)와 같이 URL의 일부가 동적으로 변하는 페이지는 어떻게 만들까요?

Next.js App Router는 대괄호([])를 사용해 동적 라우트 세그먼트를 정의합니다.

예를 들어 src/app/blog/[slug]/page.tsx 파일을 만들면 /blog/my-first-post, /blog/nextjs-basics 같은 경로를 처리할 수 있습니다.

[slug] 값은 페이지 컴포넌트의 params prop으로 전달됩니다. Next.js 16의 params는 Promise이므로 서버 컴포넌트에서는 await로 값을 읽습니다.

동적 라우트의 매개변수를 읽는 코드는 뒤의 라우팅 장에서 자세히 다룹니다.

예제의 페이지 파일과 URL

예제의 페이지 파일과 URL의 비교 기준입니다.

예제의 페이지 파일과 URL
페이지src/app 아래 파일이동할 URL
소개about/page.tsx/about
대시보드 홈dashboard/page.tsx/dashboard
대시보드 설정dashboard/settings/page.tsx/dashboard/settings
게시물 상세 예고blog/[slug]/page.tsx/blog/my-first-post 등 실제 slug를 넣은 경로
소개
src/app 아래 파일: about/page.tsx
이동할 URL: /about
대시보드 홈
src/app 아래 파일: dashboard/page.tsx
이동할 URL: /dashboard
대시보드 설정
src/app 아래 파일: dashboard/settings/page.tsx
이동할 URL: /dashboard/settings
게시물 상세 예고
src/app 아래 파일: blog/[slug]/page.tsx
이동할 URL: /blog/my-first-post 등 실제 slug를 넣은 경로

앞 세 행은 이 절에서 작성한 파일입니다. 마지막 행은 동적 경로의 예고이며, 링크만 추가해도 없는 page.tsx가 생성되는 것은 아닙니다.

App Router 구조

이전 페이지

레이아웃 컴포넌트

다음 페이지

이 페이지의 목차

첫 번째 새 페이지 만들기: about 페이지중첩 라우트(Nested Routes) 만들기페이지 간 이동: <Link> 컴포넌트 사용하기동적 라우트 개념 잡기 (예고편)