Next.js ํŠœํ† ๋ฆฌ์–ผ

date:
2025-09-23

https://nextjs.org/learn/dashboard-app ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ์„ ํ•œ๋ฒˆ ์ฝ์–ด๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.

1. Getting Started

/app : ํŽ˜์ด์ง€, ์ปดํฌ๋„ŒํŠธ, ๋กœ์ง ๋“ฑ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ•„์š”ํ•œ ๋ชจ๋“ ๊ฒƒ์ด ๋“ค์–ด์žˆ๋Š” ๊ฒฝ๋กœ /app/lib : ์žฌ์‚ฌ์šฉํ•  ํ•จ์ˆ˜๋“ค์ด ๋“ค์–ด์žˆ๋Š” ๊ฒฝ๋กœ. (๋ฐ์ดํ„ฐ ํŒจ์นญ ๋“ฑ) /app/ui : UI ์ปดํฌ๋„ŒํŠธ๋“ค /public : ์ •์  ํŒŒ์ผ๋“ค

2. CSS Styling

Next.js๋Š” ํ…Œ์ผ์œˆ๋“œ ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•œ๋‹ค.

CSS๋ชจ๋“ˆ์ด๋ผ๋Š” ๊ฒƒ๋„ ์žˆ๋Š”๋ฐ,

/*home.module.css*/
.shape {
  height: 0;
  width: 0;
  border-bottom: 30px solid black;
  border-left: 20px solid transparent;
  border-right: 20px solid transparent;
}

์ด๋ ‡๊ฒŒ ์ž‘์„ฑ๋˜์–ด์žˆ๋Š” ์ผ๋ฐ˜ cssํŒŒ์ผ์„

import styles from "@/app/ui/home.module.css";

export default function Page(){
	return(
		<main className="flex min-h-screen flex-col p-6">
	      <div className={styles.shape}>
	        <AcmeLogo />
	      </div>
		...      
	)
}

์ด๋ ‡๊ฒŒ ๋ถˆ๋Ÿฌ์™€์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ€ด์ฆˆ : CSS๋ชจ๋“ˆ์˜ ์žฅ์ ์€? ์ •๋‹ต : Provide a way to make CSS classes locally scoped to components by default, reducing the risk of styling conflicts. CSS๋ชจ๋“ˆ์€ ๊ฐ ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ํด๋ž˜์Šค ๋„ค์ž„์„ ์ƒ์„ฑํ•ด ์Šคํƒ€์ผ๋ง ์ถฉ๋Œ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

clsx ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋„ ์žˆ๋‹ค.๊นƒํ—™ ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์กฐ๊ฑด์— ๋”ฐ๋ผ ์Šคํƒ€์ผ์„ ์ฃผ๊ณ ์‹ถ์„๋•Œ(์ฆ‰ ํด๋ž˜์Šค๋„ค์ž„์„ ์ฃผ๊ณ ์‹ถ์„๋•Œ) ์‚ฌ์šฉํ•œ๋‹ค.

3. Optimizing Fonts and Images

4. Creating Layouts and Pages

5. Navigating Between Pages

Next.js๋Š” ๊ธฐ์กด์˜ <a> ํƒœ๊ทธ ๋Œ€์‹  <Link>์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๊ถŒ์žฅํ•œ๋‹ค.

<Link>์ปดํฌ๋„ŒํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋„ค๋น„๊ฒŒ์ด์…˜์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋Š”๋ฐ, ์ด๊ฒƒ์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ํŽ˜์ด์ง€ ์ด๋™์‹œ๋งˆ๋‹ค ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ƒํƒœ๊ฐ€ ์ง€์›Œ์ง€์ง€์ง€๋„, ์Šคํฌ๋กค ์œ„์น˜๊ฐ€ ์ดˆ๊ธฐํ™” ๋˜์ง€๋„ ์•Š๋Š”๋‹ค.

Automatic Code-splitting and prefetching

๊ธฐ์กด์˜ ๋ฆฌ์•กํŠธ SPA๋Š” ์ฒ˜์Œ์— ์ ‘์†ํ• ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์›น์•ฑ์˜ ๋ชจ๋“  ์ฝ”๋“œ๋“ค์„ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐ˜๋ฉด, Next.js์—์„œ๋Š” ์ž๋™์œผ๋กœ ๋ฃจํŠธ๋ณ„๋กœ ์ฝ”๋“œ๋“ค์„ ๋ถ„๋ฆฌํ•ด(code-splitting) ํ•„์š”ํ•  ๋•Œ ๋งˆ๋‹ค ์ฝ”๋“œ๋“ค์„ ๋ถˆ๋Ÿฌ์˜จ๋‹ค(prefetching).

์ด๊ฑธ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š”๊ฒŒ <Link> ์ปดํฌ๋„ŒํŠธ์ธ๋ฐ, ๋ธŒ๋ผ์šฐ์ €์˜ ๋ทฐํฌํŠธ์— ๋งํฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋‚˜ํƒ€๋‚˜๋ฉด Next.js๋Š” ์ž๋™์œผ๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ํ•ด๋‹น ๋งํฌ๊ฐ€ ์—ฐ๊ฒฐํ•˜๋Š” ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋“ค์„ prefetchํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋Š” ์ˆœ๊ฐ„์— ํ•ด๋‹น ํŽ˜์ด์ง€๋Š” ์ด๋ฏธ ์ฝ”๋“œ๋ฅผ ๋ถˆ๋Ÿฌ์˜จ ์ƒํƒœ์ด๋‹ˆ ์‹ ์†ํ•œ ํŽ˜์ด์ง€ ์ด๋™์„ ๊ฒฝํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ •๋ฆฌํ•˜์ž๋ฉด,

์ „ํ†ต์ ์ธ ์„œ๋ฒ„ ๋ Œ๋”๋ง

  • ์žฅ์  : SEO
  • ๋‹จ์  : ์ƒํƒœ ์œ ์ง€ ๋ถˆ๊ฐ€(์ „์ฒด ํŽ˜์ด์ง€ ๋กœ๋“œ) ์œ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•œ SPA
  • ์žฅ์  : ์ƒํƒœ ์œ ์ง€, ๋น ๋ฅธ ํŽ˜์ด์ง€ ์ด๋™
  • ๋‹จ์  : ์ดˆ๊ธฐ ๋กœ๋”ฉ, SEO๋ถˆ๋ฆฌ

์ด ๋‘˜์˜ ์žฅ์ ๋งŒ์„ ๋ชจ์€ ๋ฐฉ๋ฒ•์ด๋‹ค.

  • prefetching : ๋น ๋ฅธ ํŽ˜์ด์ง€ ์ด๋™
  • code-splitting : ๋น ๋ฅธ ์ดˆ๊ธฐ ๋กœ๋”ฉ
    • Next.js์˜ ๊ณ ์œ  ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ๊ณ  ๋ฆฌ์•กํŠธ์™€ ๋ฒˆ๋“ค๋Ÿฌ(Webpack, Turbopack)์˜ ๊ธฐ๋Šฅ์ด๋ผ๊ณ .
  • ์„œ๋ฒ„ ๋ Œ๋”๋ง : SEO์— ์œ ๋ฆฌ
  • ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ์—์„œ์˜ ์ด๋™ : ์ƒํƒœ ์œ ์ง€

์ŠคํŠธ๋ฆฌ๋ฐ streaming ์ด๋ผ๋Š” ๊ธฐ๋Šฅ๋„ Next.js์˜ ๋„ค๋น„๊ฒŒ์ด์…˜ ๊ฒฝํ—˜ ํ–ฅ์ƒ์— ๊ธฐ์—ฌ๋ฅผ ํ•˜๋Š” ์ค‘์š”ํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ ์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ๋Š” ๋‚˜์ค‘์— ๋ฐ์ดํ„ฐ ํŒจ์นญ ๋ถ€๋ฌธ์—์„œ ๋‹ค๋ฃฌ๋‹ค.

6. Setting Up Your Database

7. Fetching Data

๋ฐ์ดํ„ฐ ํŒจ์นญ, ์ฆ‰ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ์—๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ณ ๋ ค ์‚ฌํ•ญ๋“ค์ด ์žˆ๋‹ค.

  1. API ๋ ˆ์ด์–ด (route handler) ๋งํฌ
  2. Database ์ฟผ๋ฆฌ
  3. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ
  4. SQL

API ๋ ˆ์ด์–ด

ํด๋ผ์ด์–ธํŠธ ์ธก์—์„œ ๋ฐ”๋กœ DB์— ์ ‘๊ทผํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š”๊ฑด ๋ณด์•ˆ์ƒ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

  • DB ์—ฐ๊ฒฐ ์ •๋ณด (api key, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ) ๋…ธ์ถœ
  • SQL injection ๊ณต๊ฒฉ์— ์ทจ์•ฝ

๊ทธ๋ž˜์„œ ์ „ํ†ต์ ์œผ๋กœ ์ค‘๊ฐ„์— ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๊ฐ€ ํด์•„์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ๊ฒ€์ฆํ•˜๊ณ  ์š”์ฒญํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ค€๋‹ค. Next.js๋Š” ํ’€์Šคํ… ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค. Node.js ๋Ÿฐํƒ€์ž„์—์„œ ์‹คํ–‰๋˜๋Š” ์„œ๋ฒ„์—์„œ ์ด ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค. fetch("/dir1/dir2",{...})๋ผ๊ณ  ํด๋ผ์ด์–ธํŠธ์—์„œ ์š”์ฒญํ•œ๋‹ค๋ฉด app/dir1/dir2/route.tsํŒŒ์ผ์„ ์ž‘์„ฑํ•ด๋‘”๋‹ค. spring boot์—์„œ ์ปจํŠธ๋กค๋Ÿฌ๋ผ๊ณ  ๋ถˆ๋ €๋˜ ์ด ๋ชจ๋“ˆ์„ Next.js์—์„œ๋Š” route handler๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

spring boot๋Š” MVC ํŒจํ„ด์„ ๋”ฐ๋ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•˜๋„๋ก ๋˜์–ด์žˆ์ง€๋งŒ, Next.js๋Š” ๋ฐ˜๋“œ์‹œ ๊ทธ๋Ÿด ํ•„์š”๋Š” ์—†๋‹ค.