ํด๋น ๋ธ๋ก๊ทธ ์๋ฆฌ์ฆ๋ ์ ์งํ๊ฒ ๋ฐฐ์๋ณด๋ Next js ์๋ฆฌ์ฆ๋ก์จ ์ด 8๋ถ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
Next.js๊ณต์ ํํ์ด์ง์์ ์ด์ผ๊ธฐํ๋ ๋ด์ฉ์ ์ต๋ํ ์ดํดํ๊ธฐ ์ฝ๊ณ ์ง๊ด์ ์ด๊ฒ ๊ตฌ์ฑํ์์ต๋๋ค.
0. ๋ชฉ์ฐจ
1. create-next-app์ผ๋ก next ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ํ๊ธฐ
2. create-next-app์์ ๋ง๋ ์ฒซ ๋ฒ์งธ ํต์ฌ pages. ๊ทธ๋ฆฌ๊ณ ๋์ ๋ผ์ฐํ
3. ํ์ด์ง๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํ Link-Component ๊ทธ๋ฆฌ๊ณ Pre-Fetch
Dynamic Routing๊ณผ Link๋ฅผ ์ด์ฉํด ๊ฐ๋จํ ๊ฒ์ํ์ ๋ง๋ค์ด๋ณด์.
4. Next.js์์ head ํ๊ทธ๋ฅผ ์กฐ์ํ๋ ๋ฉ์ง ๋ฐฉ๋ฒ
๋ฒ์ธ & ์ค์ต) ์ด๋ฏธ์ง์ ๋์์์ ์ ์ฅํ๊ณ ์ฌ์ฉํด๋ณด์.
5. ์น์ ๋ฐ์ ๊ณผ์ ์ผ๋ก ๋ณด๋ SSG์ SSR
6. next์ ๋ ๋ฒ์งธ ํต์ฌ Pre-Rendering
7. SSG๋ก ๊ฒ์ ์์ง ์ต์ ํ ๋ ธ๋ฆฌ๊ธฐ
8. ์ ์งํ๊ฒ ๋ฐฐ์๋ณด๋ Next.js ์๋ฆฌ์ฆ๋ฅผ ๋ง์น๋ฉฐ..
์ฐ๋ฆฌ๊ฐ ํ์ด์ง๋ผ๋ฆฌ ์ฐ๊ฒฐํ ๋ ์ด๋ค ํ๊ทธ๋ฅผ ์ผ๋์ง ์๊ฐํด๋ณด์.
์ฌ๊ธฐ์ ๋งํ๋ ์ฐ๊ฒฐ์ด๋? ๋ค๋ฅธ ํ์ด์ง๋ก ์ด๋ํ๊ฑฐ๋ ๊ฒ์ํ์์ ๊ธ์ ํด๋ฆญํ๊ฑฐ๋ ํ๋ ํ๋์ ํ์ ์์ ์ฐ๋ฆฌ๊ฐ ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๊ฒ๋๋ view๋ฅผ ๋ฐ๊ฟ๋ณด์๋ ์ด์ผ๊ธฐ๋ค.
์ฐ๋ฆฐ html์ <a></a>
๋ฅผ ์ด์ฉํด์ ํ์ด์ง๋ฅผ ์ด๋ํ๋ค.
๊ทผ๋ฐ ์ด <a></a>
ํ๊ทธ๋ฅผ ์ด์ฉํ ๊ฒฝ์ฐ ๋ธ๋ผ์ฐ์ ๋ ํด๋น ํ์ด์ง๋ก ์ด๋ํ๊ธฐ ์ํด์ viewport ์ ์ฒด๋ฅผ ์๋กญ๊ฒ Renderingํ๊ธฐ ๋๋ฌธ์ ํ๋ฉด์ด ๊น๋นก๊ฑฐ๋ฆฌ๋ฉฐ ํ์ํ๋ค๋ฉด ๋คํธ์ํฌ๋ฅผ ์ด์ฉํ๊ฒ ๋๋ค.
ํ์ง๋ง ์ด๋ฐ ๊ณผ์ ์์ฒด๋ฅผ Next JS ์์๋ Client Side Routing ์ผ๋ก ํ์ด์ง๋ฅผ ์ฐ๊ฒฐํ์ฌ Single Page Application ์ฒ๋ผ ๋ง๋ค์ด ๋คํธ์ํฌ ๊ฐ์ ์ ์์ค๋ค.
์๋ ์ ๊น ๋ญ๊ฐ ์ด์ํ๋ค. ์ฐ๋ฆฌ๋ SSR์ ๋ฐฐ์ฐ๋ฌ ์๋๋ฐ ์ CSR์ ํด?
๋๋ฅผ ํฌํจํ ์ฌ๋๋ค์ด ์คํดํ๊ณ ์์ ์ ์๋ ๋ถ๋ถ์ด ์๋ค.
๋๋ SPA์ CSR์ ํ๊ณ๋ฅผ ๊ทน๋ณตํ๊ณ ์ SSR์ ์ํ Next JS๋ก ์ค๊ฒ ๋์๋ค.
๋์ ๋น์ทํ๊ฒ react์์ next๋ก ์ ์
๋ ์ฌ๋๋ค์ด์ง๋ง ์ด๊ฒ ํ๋๋ ํ์คํ ํด์ผํ๋ค.
์ฐ๋ฆฌ๋ next.js๋ฅผ Server Side Rendering ์ ํ๋ ค๊ณ ๋ง ์ฐ๋๊ฒ ์๋๋ผ.
Server Side Rendering์ ์ฅ์ ๊ณผ Client Side Rendering ์ ์ฅ์ ์ ์ ์ ํ ์์ ์ข์ ์ฑ๋ฅ์ ์ฑ์ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉํ๋ค๋ ๊ฒ์ ์ผ๋ํด์ผ ํ๋ค.
์ด๋ป๊ฒ Next js๊ฐ Client Side Rendering์ ์ข์ ์ฑ๋ฅ์ผ๋ก ์ ๊ณตํ๋ ์ง๋ ๋ค์์ ์์ Pre-Rendering์์ ์์๋ณผ ๊ฒ์ด๊ณ , ์ค๋์ ๊ฐ๋ณ๊ฒ Link์ Pre-Fetch ์ ๋ํด์๋ง ์์๊ฐ๋ ์ถฉ๋ถํ๋ค.
Link
์ฐ๋ฆฌ๋ ์ง๋ ์๊ฐ ๋์ ๋ผ์ฐํ ์ผ๋ก url ํ๋ผ๋ฏธํฐ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ปดํฌ๋ํธ๋ฅผ ๋ง๋ค์๋๋ฐ, ์ค๋์ ์๋ก์ด ํ์ด์ง๋ฅผ ๋ง๋ค๊ณ ๋ค๋ฅธ ํ์ด์ง๋ก ์ฐ๊ฒฐํ๋ ๊ฒ์ ํด๋ณผ ๊ฒ์ด๋ค.
next/link
, <Link />
๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ Pre-Fetch๋ฅผ ํตํด ํ์ด์ง๋ฅผ ์๋ก ๊ณ ์น์ง ์๊ณ ์ด๋ ํ ์ ์๋ค.
import Link from "next/Link";
๋ฅผ ์ด์ฉํด์ Link ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ค์.
๊ทธ๋ฆฌ๊ณ index.jsx
๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ๋ฐ๊ฟ๋ณด์.
import Link from 'next/link'
function Home() {
return (
<ul>
<li>
<Link href="/">
<a>Home</a>
</Link>
</li>
<li>
<Link href="/about">
<a>About Us</a>
</Link>
</li>
</ul>
)
}
export default Home
๊ทธ๋ฐ ๋ค์ pages ๋๋ ํ ๋ฆฌ์ about.jsx
๋ฅผ ๋ง๋ค๊ณ export ํด๋ณด์.
import React from "react";
const About = () => {
return <div>์ ๋ ์ค๋ nextjs ๋ฅผ ์ฒ์ ๋ฐฐ์์</div>;
};
export default About;
๊ทธ๋ผ ๋ค์๊ณผ ๊ฐ์ด index.jsx์ about.jsx๊ฐ ์ฐ๊ฒฐ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
๋์ ๋ผ์ฐํ ๊ณผ ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ
๋์ ๋ผ์ฐํ ๊ณผ ์ฐ๊ฒฐํ๋ค๊ณ ํด๋ ํฌ๊ฒ ์ด๋ ค์ธ ๊ฒ์ด ์๋ค.
์ฐ์ ๋ค์๊ณผ ๊ฐ์ ํ์ผ๊ณผ ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค์ด์ค๋ค.
๊ทธ๋ฆฌ๊ณ pages ๋๋ ํ ๋ฆฌ ์์ index.jsx ํ์ผ์ ์๋์ ๊ฐ์ด ์์ ํด์ฃผ์.
import Link from "next/link";
const users = [
{ id: 1, name: "James" },
{ id: 2, name: "Martin" },
{ id: 3, name: "Danial" },
];
function Home() {
return (
<ul>
<li>
<Link href="/">
<a>Home</a>
</Link>
</li>
<li>
{users.map((user) => (
<ul key={user.id}>
<Link href={`/user/${encodeURIComponent(user.id)}`}>
<a>{user.name}</a>
</Link>
</ul>
))}
</li>
</ul>
);
}
export default Home;
์ฌ๊ธฐ์ encodedURIComponent()
๊ฐ ์ฐ์๋๋ฐ, ํน์ ๋ฌธ์์ด๋ก url์ด ๋ค์ด๊ฐ๋ค๋ฉด utf-8 ํ์์ ์ง์ผ์ฃผ๊ธฐ ์ํด์ ์ฌ์ฉ๋์๋ค.
๋จ์
์ซ์ ํํ์ url path๋ผ๋ฉด ์๋ตํด๋ ๋ฌด๋ฐฉํ๋ค.
๊ทธ๋ฆฌ๊ณ pages ๋๋ ํ ๋ฆฌ ์์ user ๋๋ ํ ๋ฆฌ๋ฅผ ์์ฑํ๊ณ [id].jsx
ํ์ผ์ ๋ง๋ ๋ค, ๋ค์๊ณผ ๊ฐ์ด ์์ฑํ์.
import React from "react";
import { useRouter } from "next/router";
const User = () => {
const router = useRouter();
const { id } = router.query;
return <div>{id} ๋ฒ user์ ํ์ด์ง ์
๋๋ค.</div>;
};
export default User;
๊ทธ๋ผ ์๋์ ๊ฐ์ด ์ ์คํ๋๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
Link ์ปดํฌ๋ํธ์ Props
Link
์ปดํฌ๋ํธ๋ ํน์ ์์ฑ๋ง์ ๋ฐ๋ HOC์ด๊ธฐ ๋๋ฌธ์ ์ง์ ๋ ์์ฑ์ด ์๋๋ฉด ์ค๋ฅ๋ฅผ ๋ฟ์ด๋ธ๋ค.
๊ทธ๋์ ์ง์ ๋ Attribute๋ง props๋ก ๋ฐ์ ์ ์๋๋ฐ, ์๋๋ ๊ณต์ ํํ์ด์ง์ ๋์ค๋ ์ง์ ๋ Props ๋ค์ด๋ค.
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ React-router-dom
์ Link
๋ก ์ฐฉ๊ฐํ๊ณ className
์์ฑ์ ์ค๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
Warning: Failed prop type: Link: unknown props found: title
์ด๋ฐ ์ค๋ฅ๋ฅผ ๋ฑ์ด๋ธ๋ค.
๊ทธ๋์ ๋ง์ฝ link์ ๋ค๋ฅธ ์์ฑ์ (props)๋ฅผ ๋ฐ๊ณ ์ถ๋ค๋ฉด Link
๋ง ์ธ๊ฒ ์๋๋ผ Link
์์ a
ํ๊ทธ๋ฅผ ๋ฃ๊ณ ํด๋น ํ๊ทธ์ attribute๋ฅผ ์ถ๊ฐํด์ผ๋๋ค.
Code Splitting ๊ณผ Prefetching
Next๊ฐ Code Splitting ์ ์ด์ฉํด์...
์ต์ด ํ์ด์ง ์์ฒญ์ด ์๋ค๋ฉด ๋ชจ๋ ์ฝ๋๋ฅผ ํธ์ถํ๋ Single Page Application๊ณผ๋ ๋ค๋ฅด๊ฒ Next js ์์๋ ์ฝ๋๋ฅผ ์๋์ผ๋ก ๋ถํ ํด์ ํด๋น ํ์ด์ง์ ํ์ํ ๊ฒ๋ง ๋ก๋ํ๋ค.
์ฆ, ํํ์ด์ง๊ฐ ๋ ๋๋ง ๋ ๋ ๋ค๋ฅธ ํ์ด์ง์ ์ฝ๋๋ ํธ์ถ๋์ง ์๊ธฐ ๋๋ฌธ์ Code Splitting์ด ์๋ค๋ฉด ์๋ฐฑ๊ฐ์ ํ์ด์ง๊ฐ ์๋๋ผ๋ ํ์ด์ง๋ ๋น ๋ฅด๊ฒ ๋ก๋๋ ์ ์๋ค.
Next๊ฐ Pre-Fetcing ์ ์ด์ฉํ๋๊น...
๊ทธ๋ฆฌ๊ณ Next js๋ build ์์ ์ Link
์ปดํฌ๋ํธ๊ฐ ๋ธ๋ผ์ฐ์ ์ ํ์๋ ๋๋ง๋ค ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋งํฌ๋ ํ์ด์ง์ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์ค์ ํ๋ค.
๊ทธ๋์ ํ์ด์ง์ ์ ํ์ด SPA์ ๋น์ทํ๊ฒ ์ฆ์ ์ด๋ฃจ์ด์ง๋ ๊ฒ ์ฒ๋ผ ๋๋ ์ ์๋ค.
๋๊ธ