

์์์ ๋ง๋ค์ด ๋ ํฌ์ผ๋ชฌ๋ํ ์ผ ์ปดํฌ๋ํธ๋ฅผ ์ฌ๊ธฐ๋ก ๋ถ๋ฌ์ค๊ธฐ๋ง ํ๋ฉด ๋๋ค.

๋ฌธ์ ์์ด ์ ๋ค์ด๊ฐ์ง๋ ๊ฑธ ๋ณผ ์ ์์๋ค.
์ด์ ๋ด๊ฒ ๋จ์ ๊ฑด ๋ํ ์ผ์ ์ถ๊ฐํ๋ ๊ฒ


ํฌ์ผ๋ชฌ๋ํ ์ผ ์ปดํฌ๋ํธ์ ๋ค์ํ ํฌ์ผ๋ชฌ์ ์์ธ ์ ๋ณด๋ค์ ๋ด์์ฃผ๊ณ pokemondetail/[id]/page.tsx์์ ๋ถ๋ฌ์์

์ ์๋ํ๋ ๊ฑธ ๋ณผ ์ ์์
CSS๋ฅผ ์ข ๋ ๊ฐ๊ณตํ๊ณ ์ถ์ง๋ง.. ๊ณผ์ ํ์ ๊ตฌํ ์ฌํญ์ ๋ค ๋ง์กฑํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ธ ๊ณต๋ถ์ ์ข ๋ ์๊ฐ์ ์ฐ๋ ค๊ณ ํ๋ค
(1) ์ฃผ์ ์ฐจ์ด์
Next.js๋ฅผ ํ ๋, ๊ฐ์ฅ ์ค์ํ๊ฒ ๋ณด๋ ๊ฐ๋
= ๋ ๋๋ง ๋ฐฉ์
CSR, SSR, ISR, SSG
Next.js ๋ฒ์ 12๊น์ง๋ ์ด๋ฌํ ๋ ๋๋ง ๋ฐฉ์์ 'ํ์ด์ง ๋จ์'๋ก ๊ท์ ํ์ ์๋ฅผ ๋ค์ด
๊ณผ ๊ฐ์ด ๋ง์ด๋ค. ๊ทธ๋ฌ๋, Next.js 13 ๋ฒ์ ์์๋ React 18 ๋ฒ์ ์์ ์ ์ํ
์ ํ์
์ด ๋ ๋๋ง ๋ฐฉ์์ด ์ปดํฌ๋ํธ ๋จ์๋ก ๋ฒฝ๋
๋จ. ์ด์ ๋ ํ ํ์ด์ง ์์์ ์ฌ๋ฌ ๋ ๋๋ง ๋ฐฉ์์ด ๊ณต์กดํ ์ ์์


(1) ์์ง ๋ง์์ผ ํ ๊ฒ
๊ธฐ๋ณธ์ ์ผ๋ก app ํด๋ ํ์ ์ปดํฌ๋ํธ๋ ๋ชจ๋ ์๋ฒ ์ปดํฌ๋ํธ
๋งค์ฐ ์ค์ํจ
(2) ์๋ฒ ์ปดํฌ๋ํธ
// src>app>page.tsx
export default function Home() {
console.log("์ฌ๊ธฐ๋ ์ด๋์ผ๊น์?");
return (
<div className="p-8">
์๋
ํ์ธ์! ๋ด๋ฐฐ์บ ๋ฆฌ์กํธ.. ์๋์๋ ๋ฅ์คํธ์
๋๋ค!
</div>
);
}
์ด๋ฐ ์ฝ๋๊ฐ ์๋ค๊ณ ํ๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์๋๋ผ terminal์ console.log๊ฐ ์ถ๋ ฅ์ด ๋จ.
์ฐ๋ฆฌ๊ฐ ์๋ฒ๋ฅผ ๋๋ฆฌ๊ณ ์๋ localhost ์ฆ, ๋ด ์ปดํจํฐ์ node ํ๊ฒฝ์์ console.log๊ฐ ์ถ๋ ฅ๋๊ณ ์์
๋ง์ผ ํ๋ก์ ํธ๊ฐ aws ๊ฐ์ ํด๋ผ์ฐ๋ ์ปดํจํ ์์ ๋์๊ฐ๊ณ ์๋ค๋ฉด, ๋ธ๋ผ์ฐ์ ๊ฐ ์๋๋ผ ํด๋น ์๋ฒ์ ๋ก๊ทธ์ console.log๊ฐ ์ถ๋ ฅ๋ ๊ฒ์
alert ๋ช
๋ น์ด๋ ์๋ฒ ์ปดํฌ๋ํธ(Node.js ๋ฐํ์ ํ๊ฒฝ)์์ ์ฌ์ฉํ ์ ์๊ณ os.hostname ๋ช
๋ น์ด๋ ์ฌ์ฉ์ด ๊ฐ๋ฅ
(3) ํด๋ผ์ด์ธํธ ์ปดํฌ๋ํธ
์๋ฒ ์ปดํฌ๋ํธ์์๋ alert, confirm ์ฒ๋ผ ์ ์ ์์ ์ํธ์์ฉ์ด ํ์ํ ๋ฉ์๋, ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์์. ๋ง์ฐฌ๊ฐ์ง๋ก useEffect, useState ์ฒ๋ผ CSR์ ์ํด ์ฌ์ฉ๋ ๊ธฐ์ ๋ ์ฌ์ฉํ ์ ์์ผ๋
์ด๋ฐ ๊ฒฝ์ฐ์ ์ปดํฌ๋ํธ ์ต์๋จ์ "use client"๋ง ๋ถ์ฌ์ฃผ๋ฉด ๋จ
(4) ์ธ์ , ์ด๋ป๊ฒ SC/CC๋ฅผ ์ฐ๋์ง?
์ ์ ์์ ์ํธ์์ฉ์ด ์๋ ๊ฒฝ์ฐ CC, ๊ทธ ์ธ์ ๊ฒฝ์ฐ๋ SC๋ฅผ ๊ถ์ฅ

(5) ๋ ๋์๊ฐ๊ธฐ(์ปดํฌ๋ํธ ๋ถ๋ฆฌ)
// src>app>page.tsx
export default function Home() {
return (
<div className="p-8">
์๋
ํ์ธ์!
<section>
<h1>์ ๋ชฉ</h1>
<button onClick={() => {
alert("์๋
ํ์ธ์!");
}}
>ํด๋ฆญ</button>
</section>
</div>
);
}
์ด ์ฝ๋๋ "use client"๊ฐ ์ต์๋จ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฒ ์ปดํฌ๋ํธ์
useEffect, useState, onClick ๋ฑ์ CC์์๋ง ๊ฐ๋ฅํ ๊ธฐ์ ์ธ๋ฐ SC์ธ ์ปดํฌ๋ํธ์์ ์ฌ์ฉ์ ํ๊ณ ์ถ์ด์ ์์ "use client"๋ฅผ ์จ๋ฒ๋ฆฌ๊ฒ ๋๋ฉด CC๋ก ๋์ด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์ด๋ด ๊ฒฝ์ฐ์ ์ด๋ ๊ฒ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฆฌํ ์ ์์
// src>app>page.tsx
import Button from "@/components/Button";
export default function Home() {
return (
<div className="p-8">
์๋
ํ์ธ์!
<section>
<h1>์ ๋ชฉ</h1>
<Button />
</section>
</div>
);
}
// src>components>Button.tsx
"use client";
import React from "react";
const Button = () => {
return (
<button
onClick={() => {
alert("์๋
ํ์ธ์!");
}}
>
ํด๋ฆญ
</button>
);
};
export default Button;
(1) SSG(Static Site Generation)
fetchํ ๋ฐ์ดํฐ๋ ์์ํ ๋ณ์น ์์ = ๊ณ์ ์ปดํฌ๋ํธ๋ฅผ ๊ฐฑ์ ํ ํ์ X
SSG๋ ๋น๋ํ์๋๋ง ์ปดํฌ๋ํธ๋ฅผ ์์ฑํ๊ณ , ์ดํ๋ ๋ณํ์ง ์๋ ํ์ด์ง๋ก ๊ฐ์ ํ์ฌ static ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๋งํจ.
๊ทธ๋ฆฌ๊ณ Next.js๋ ์๋ฌด๊ฒ๋ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก SSG๋ก ๋์
(2) ISR(Incremental Site Regeneration)
fetchํ ๋ฐ์ดํฐ๋ ๊ฐ๋ ๋ณํจ = ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ์ปดํฌ๋ํธ๋ฅผ ๊ฐฑ์
ISR์ ๋น๋ํ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ด๊ธฐ ์์ฑํ๊ณ , ์ดํ๋ ์ผ์ ์ฃผ๊ธฐ๋ง๋ค ๋ณํ๋ฅผ ์ ์ฉํ์ฌ ์ปดํฌ๋ํธ๋ฅผ ์ ๊ณตํจ
(3) SSR(Server Side Rendering)
fetchํ ๋ฐ์ดํฐ๋ ์ค์๊ฐ์ผ๋ก ๊ณ์ ๋ฐ๋ = ์ปดํฌ๋ํธ ์์ฒญ์ด ์์ ๋ ๋ง๋ค ๋ฐ์ดํฐ๋ฅผ ๊ฐฑ์ ํด์ ์ต์ ๋ฐ์ดํฐ๋ง ์ ๊ณตํด์ผ ํจ
SSR์ ๋น๋ํ์๋ ์ปดํฌ๋ํธ๋ฅผ ์ด๊ธฐ ์์ํ๊ณ , ์ดํ ์ปดํฌ๋ํธ ์์ฒญ์ด ์์ ๋ ๋ง๋ค ๋ณํ๋ฅผ ์ ์ฉํ์ฌ ๊ฐ์ฅ ์ต์ ์ ๋ฐ์ดํฐ๋ฅผ user์๊ฒ ์ ๊ณต
(4) CSR(Client Side Rendering)
CSR์ ๋น๋ํ์์ ์ปดํฌ๋ํธ๋ฅผ ์ด๊ธฐ ์์ฑํ์ง ์์.
JavaScript๋ก ์ด๋ฃจ์ด์ง ๋ฆฌ์กํธ ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ๊ณ ๊ทธ์ ์์ผ ํ๋ฉด์ด ๊ทธ๋ ค์ง๊ฒ ๋จ
use client ๋ค์ด๊ฐ๋ฉด CSR์
๋ํ ์ผํ ๋ถ๋ถ๊น์ง ์ธ์ธํ๊ฒ ์ ๋ฆฌํ์ จ๋ค์ ๋๋ฐ
ui๋ ๋๋ฌด ๊น๋ํ๋ค์ฉ