iBetter Books
수정

라이브러리와 프레임워크의 차이

React는 라이브러리입니다. UI를 만드는 도구를 제공하지만, 라우팅, 데이터 페칭, 빌드 설정은 여러분이 직접 선택해서 조합해야 합니다.

Next.js는 프레임워크입니다. React를 기반으로 하되, 라우팅, 서버 렌더링, 빌드 최적화 등 웹 앱을 만드는 데 필요한 것들을 이미 갖추고 있습니다.

쉽게 말하면, React는 재료이고 Next.js는 레시피가 포함된 요리 키트입니다.

같은 것을 다르게 만들기

간단한 블로그 글 목록 페이지를 React와 Next.js로 각각 만들어봅니다.

React로 만들기

React에서는 보통 이렇게 작성합니다.

// React (CRA 또는 Vite)
import { useState, useEffect } from "react";

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

  useEffect(() => {
    fetch("/api/posts")
      .then((res) => res.json())
      .then((data) => {
        setPosts(data);
        setLoading(false);
      });
  }, []);

  if (loading) return <div>로딩 중...</div>;

  return (
    <ul>
      {posts.map((post) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
}
```text

이 코드는 브라우저에서 실행됩니다. 페이지가 열리면 빈 화면이 보이다가, API 요청이 끝나면 목록이 나타납니다.

### Next.js로 만들기

Next.js에서는 이렇게 작성합니다.

```tsx
// Next.js (App Router)
async function PostList() {
  const posts = await fetch("https://api.example.com/posts").then((res) =>
    res.json()
  );

  return (
    <ul>
      {posts.map((post: { id: number; title: string }) => (
        <li key={post.id}>{post.title}</li>
      ))}
    </ul>
  );
}
```text

`useEffect`가 없습니다. `useState`도 없습니다. 그냥 `async` 함수입니다. 이 컴포넌트는 **서버에서 실행**되고, 데이터가 채워진 완성된 HTML이 브라우저로 전달됩니다.

## 라우팅의 차이

React에서 라우팅을 하려면 `react-router-dom` 같은 별도 라이브러리를 설치하고 설정해야 합니다.

```jsx
// React + react-router-dom
import { BrowserRouter, Routes, Route } from "react-router-dom";

function App() {
  return (
    <BrowserRouter>
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/posts/:id" element={<PostDetail />} />
      </Routes>
    </BrowserRouter>
  );
}
```text

Next.js에서는 파일을 만드는 것으로 라우팅이 끝납니다.

app/ ├── page.tsx → / ├── about/ │ └── page.tsx → /about └── posts/ └── [id]/ └── page.tsx → /posts/123, /posts/456, ...

`app/posts/[id]/page.tsx` 파일을 만들면 `/posts/1`, `/posts/hello` 같은 동적 주소가 자동으로 처리됩니다. 설정 파일을 건드릴 필요가 없습니다.## 핵심 차이 비교| 항목 | React | Next.js ||------|-------|---------|| 종류 | UI 라이브러리 | 풀스택 프레임워크 || 렌더링 | CSR (기본) | SSR, SSG, ISR, CSR 모두 || 라우팅 | 별도 라이브러리 필요 | 파일 기반 내장 || API | 별도 백엔드 필요 | Route Handlers 내장 || 이미지 최적화 | 직접 처리 | `next/image` 자동 최적화 || SEO | 직접 설정 | `metadata` API 내장 || 배포 | 정적 파일 배포 | Vercel, Docker 등 다양 |## Next.js는 React를 포함합니다중요한 사실이 있습니다. Next.js는 React를 대체하는 것이 아닙니다. Next.js 안에서 여러분이 알던 React 코드를 그대로 씁니다.```tsx// Next.js 안에서도 React 훅을 씁니다"use client";  // 이 선언이 있으면 React 코드처럼 동작합니다import { useState } from "react";function Counter() {  const [count, setCount] = useState(0);  return (    <button onClick={() => setCount(count + 1)}>      클릭 횟수: {count}    </button>  );}

React를 배웠다면 Next.js에서도 그 지식이 그대로 쓰입니다. Next.js는 React 위에 더 많은 능력을 얹어준 것입니다.

다음 챕터에서는 Next.js를 둘러싼 생태계를 한눈에 살펴보겠습니다.