Next.js는 React를 기반으로 한 프레임워크로, Page Router라는 라우팅 방식을 제공한다. 이는 React Router처럼 페이지 간 이동을 관리하지만, 파일 구조를 기반으로 라우팅을 자동으로 처리해주는 기능을 내장하고 있어 개발자에게 많은 편의를 제공한다.
Next.js의 Page Router는 "pages" 폴더 안의 파일 및 폴더 구조에 따라 자동으로 라우팅을 설정해주는 라우터이다. React에서 사용하는 React Router처럼 페이지 간 이동을 처리하지만, 파일명과 폴더 구조에 맞춰 페이지 경로가 자동으로 결정된다는 점에서 차이가 있다.
Next.js 프로젝트의 pages 폴더에 파일을 추가하는 것만으로 페이지를 생성할 수 있다. 예를 들어, pages/about.js 파일을 생성하면 /about 경로로 라우팅이 자동으로 설정된다.
pages/index.js
는 /
경로로, pages/about.js
는 /about
경로로 매핑된다.search
폴더를 생성하고 그 안에 index.js
파일을 넣으면 해당 폴더 이름이 경로로 사용된다. 예를 들어, pages/search/index.js
는 /search
경로로 라우팅된다.Next.js는 동적 경로 설정도 매우 간단하다. 동적 경로는 URL에 어떠한 변할 수 있는 가변적인 값을 포함하고 있는 경로를 말한다(ex: /country/1, ~/country/2 ..., ~/country/100). 블로그의 게시글 페이지나 상품의 상세 페이지 같은 곳에서 자주 사용된다.
동적 경로를 설정하려면, 대괄호를 사용하여 파일을 생성하면 된다.
ex: pages/country/[code].js
. 이 파일은 /country/1, /country/2 등 변동 가능한 숫자나 문자열을 포함한 경로에 대응하는 페이지를 생성한다. 그래서 이 동적 경로에 있는 가변적인 값이 대괄호 속에 있는 code에 하나씩 mapping되는식으로 페이지 라우팅이 설정된다.
이처럼 Next.js의 Page Router는 파일명과 폴더 구조만으로 손쉽게 라우팅을 설정할 수 있어, 기존의 React Router에 비해 훨씬 편리하다.
Next.js 프로젝트는 npx(Node Package Executor) 명령어를 사용해 간편하게 생성할 수 있다. npx는 최신 버전의 Node 패키지를 다운로드 없이 실행할 수 있는 도구로, 아래 명령어를 통해 Next.js 프로젝트를 생성할 수 있다.
npx create-next-app@버전 or latest 프로젝트이름
Next.js 앱을 실행하려면 두 가지 모드를 사용할 수 있다 (개발 모드 & 프로덕션 모드)
npm run dev (개발 모드로 Next App 실행)
npm run start
따라서, Next.js는 개발 중에는 빠른 피드백과 수정 작업을 위해 npm run dev
로 앱을 실행하며, 배포 시에는 최적화된 상태로 실행하는 npm run start
를 사용하게 된다.
Next.js 프로젝트를 생성하고 나면, 다양한 파일과 폴더가 포함된 기본 구조를 볼 수 있다.
Next.js도 결국 react를 기반으로 만들어진 react확장판 개념의 프레임워크이기 때문에 public
폴더가 존재한다거나, src
폴더가 존재하는등 기존의 react앱과 매우 유사한 폴더 구조를 가지고 있는데 각 폴더를 살펴보자면,
public
폴더는 웹 애플리케이션에서 정적 파일을 보관하는 곳이다. 이 폴더 아래에는, 로고 이미지나 favicon 같은 파일들처럼 페이지 내부에서 사용할 이미지 파일들 같은 정적인 파일들이 보관되어 있으며, 별도의 설정 없이 /logo.png
와 같은 경로로 접근할 수 있다. src
폴더 아래에는, pages
폴더가 있는데, page의 역할을 할 컴포넌트들을 보관할 파일들을 경로에 맞게 보관할 수 있도록 되어있다.index.tsx
파일은 Next.js 앱의 메인 페이지를 담당하는 파일이며, 그 안에 작성된 컴포넌트가 홈페이지에 표시되는 콘텐츠를 구성한다.이 파일들은 pages폴더 밑에 있긴 하지만, page의 역할을 하는 파일들은 아니다. _app.tsx
와 _document.tsx
파일은 모든 페이지에 공통적으로 적용되는 로직이나 공통적으로 적용될 레이아웃을 처리하는 파일이다.
Next.js의 App 컴포넌트는 React의 App 컴포넌트와 유사하게 모든 페이지의 부모 컴포넌트 역할을 한다. 이 컴포넌트는 Next.js 애플리케이션의 최상위(root) 컴포넌트로, 모든 페이지 역할들을 하는 컴포넌트들을 감싸는 부모 컴포넌트가 되어, 공통적으로 적용되는 레이아웃이나 로직을 처리할 수 있다.
import "@/styles/globals.css";
import type {AppProps} from "next/app";
export default function App({ Component, pageProps }:AppProps) {
return <Component {...pageProps} />
}
App 컴포넌트의 주요 props
Component
와 pageProps
라는 두개의 props를 받고있다.
Component
: 현재 렌더링될 페이지 컴포넌트를 나타낸다. 즉, 특정 경로로 이동할 때 렌더링되어야 하는 페이지가 Component로 전달된다.
pageProps
: Component에게 전달될 page의 props들을 모두 객체로 보관해둔 props로, 페이지에 필요한 데이터를 담고 있다.
App
컴포넌트는 이 두 가지 props를 받아, return
문에서 현재 페이지 Component
를 렌더링하고, 동시에 pageProps
를 해당 페이지에 구조 분해 할당을 통해 전달하는 구조로 동작한다. (ex: <Component {...pageProps} />
)
결론적으로 Next에서는 어떤 page를 rendering하던간에 App컴포넌트 밑에 page역할을 하는 컴포넌트가 렌더링 되는 구조로 렌더링 된다.
공통 요소 추가
App
컴포넌트의 return
문 안에 추가할 수 있다. 이렇게 하면 모든 페이지에 공통된 레이아웃이나 전역적인 스타일을 적용할 수 있다.return (
<>
<Header />
<Component {...pageProps} />
<Footer />
</>
)
Next.js의
App
컴포넌트는 모든 페이지의 부모 컴포넌트 역할을 하며, 페이지 전역에 적용되는레이아웃
이나비즈니스 로직
을 처리할 수 있는 중요한 공간이다. 이를 통해 애플리케이션의 일관된 구조를 유지하고, 공통 로직을 손쉽게 관리할 수 있다.
_document.tsx
파일은 Next.js 애플리케이션에서 HTML 문서의 최상위 구조를 정의하는 역할을 한다. 이 파일은 Next.js의 모든 페이지에 공통적으로 적용되는 HTML 태그와 설정을 처리하며, React의 index.html
과 유사한 역할을 한다고 볼 수 있다.
import { Html, Head, Main, NextScript } from "next/document";
import Link from "next/link";
export default function Document() {
return (
<Html lang="en">
<Head>
<Link type="image" rel="icon" href="/favicon.ico" />
</Head>
<body>
<Main />
<NextScript />
</body>
</Html>
);
}
전역적인 HTML 구조 설정: 모든 페이지에서 공통적으로 사용될 HTML 구조를 정의한다.
메타태그 설정, 폰트 불러오기, charset설정, thirdparty script를 추가하기,... 페이지 전체에 적용되는 html태그를 관리하기 위해 사용하면 된다.
_document.tsx
는 모든 페이지에 공통적으로 적용될 HTML 문서의 구조를 설정하는 파일로, 메타 태그 설정, 외부 리소스 로딩, 글로벌 스크립트 등을 처리한다. 이를 통해 각 페이지마다 중복된 설정을 하지 않고, 중앙에서 전체적인 HTML 구성을 관리할 수 있다.
next.config.js 파일은 Next.js 애플리케이션의 전반적인 설정을 관리하는 파일이다. 예를 들어, reactStrictMode가 기본적으로 true로 설정되어 있는데, 이는 애플리케이션에서 잠재적인 문제를 탐지하기 위해 개발 모드에서 컴포넌트를 두 번 렌더링하는 기능이다. 디버깅 시 불편할 수 있으므로 실습 중에는 false로 변경해도 무방하다.
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
};
export default nextConfig;
Next.js의 Page Router는 파일 및 폴더 기반으로 자동으로 라우팅을 설정해 주는 매우 편리한 기능이다. 이를 통해 개발자는 별도의 설정 없이 라우팅을 구성할 수 있으며, 특히 동적 경로 설정도 간단하게 처리할 수 있다. 또한, Next.js는 개발 모드에서 핫 리로딩과 같은 개발 편의 기능을 제공하고, 배포 시 프로덕션 모드로 최적화된 애플리케이션을 구동할 수 있어 React보다 더 강력한 개발 경험을 제공함.