ํด๋น ๋ธ๋ก๊ทธ ์๋ฆฌ์ฆ๋ ์ ์งํ๊ฒ ๋ฐฐ์๋ณด๋ Next js ์๋ฆฌ์ฆ๋ก์จ ์ด 10๋ถ์์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
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 ์๋ฆฌ์ฆ๋ฅผ ๋ง์น๋ฉฐ..
create-react-app
์์์ ๋ผ์ฐํ
์ฐ๋ฆฌ๊ฐ ์๋ react app ์์ ๋ผ์ฐํ ์ ํ๋ ค๋ฉด ์ด๋ป๊ฒ ํด์ผํ๋์ง ์๊ฐํด๋ณด์.
์๋ง ๋๋ถ๋ถ ๋ค์๊ณผ ๊ฐ์ ๊ณผ์ ์ ๊ฑฐ์ณค์๋ค.
- npm ๋ชจ๋๋ก
react-router-dom
์ค์น BrowserRouter
์ App ์ปดํฌ๋ํธ์ ๊ฐ์ธ๊ธฐLink
ํน์NavLink
๋ก url ๋งคํRoute
์ผ๋ก url์ ๋ฐ๋ผ ๋ค๋ฅธ ์ปดํฌ๋ํธ ๋ ๋๋ง
์ด๋ฐ ๊ณผ์ ์ด ์์ฃผ ๋ณต์กํ์ง๋ง ํฐ ํน์ง์ ๋ฐ๋ก Single Page Application์ ํน์ฑ์ ์ ํํ ๋ณด์ฌ์ฃผ๊ณ ์๋ค๋ ๊ฒ์ด๋ค.
์ฐ๋ฆฌ๊ฐ next js๋ฅผ ๋ฐฐ์ฐ๋ ค ํ๋ ์ด์ ๋ ๋๋ถ๋ถ ์ข ๋ ์ฝ๊ณ ๊ฐ๋จํ ssr์ ์ํด์์ผ ๊ฒ์ด๋ค.
๊ทธ๋ผ ๊ฐ๋จํ ๋ผ์ฐํ ์ ๋ช ํ next์์๋ ์ด๋ป๊ฒ ํ ๊น?
create-next-app
์์์ ๋ผ์ฐํ
next์์๋ pages
๋ผ๋ ํด๋๊ฐ ๋ผ์ฐํฐ ๊ธฐ๋ฅ์ ์ํํ๋ค.
์ด๋ Next js๋ file-system based ๋ก ๋ผ์ฐํ
์ ํ๊ธฐ ๋๋ฌธ์ธ๋ฐ, ์ ํํ ๋งํ๋ฉด pages
๋ผ๋ ๋๋ ํ ๋ฆฌ ์์ ์๋ js
, jsx
, ts
tsx
ํ์ผ๋ค์ ์ด๋ฆ์ ๋ฐ๋ผ์ ๋ผ์ฐํ
์ ํ๋ค๋ ๊ฒ์ด๋ค.
์ด์ ์ฐ๋ฆฌ๋ ์์์ ๋ดค๋ ๊ทธ ๊ท์ฐฎ์ ๊ณผ์ ๋ค์์ ํด๋ฐฉ๋ ์ ์๋ ๊ฒ์ด๋ค.
๋ง์ฝ ์ฐ๋ฆฌ๊ฐ pages/about.js
๋ฅผ ์์ฑํ๊ณ exportํ๋ค๋ฉด, ์ฆ
function About() {
return <div>์ค ๋ฅ์คํธ ์ฐธ ์ ๊ธฐํ๋ค์</div>
}
export default About
์ด๋ ๊ฒ ๋๋ค๋ฉด ์ฐ๋ฆฌ๋ localhost:3000/about
์ ์ ๊ทผํ๋ฉด ์ค ๋ฅ์คํธ ์ฐธ ์ ๊ธฐํ๋ค์
๋ผ๋ ๋ฌธ๊ตฌ๋ฅผ ๋ง๋ ์ ์๊ฒ ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ผ ๋ ๋๊ฐ์ ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ์ ๋ฐ๋ผ์ ๋ค๋ฅธ url path๋ฅผ ์ค๊ณํ ์ ์์ ๊ฒ ๊ฐ๋ค.
Directory ๊ตฌ์กฐ์ ๋ฐ๋ฅธ url path
pages
๋๋ ํ ๋ฆฌ ์์์๋ export
ํ ์ปดํฌ๋ํธ๋ฅผ ๋ผ์ฐํ
ํ๊ฒ ๋๋๋ฐ, ๋๋ ํ ๋ฆฌ์์ index.js
๋ฅผ ๋ผ์ฐํ
ํ๋ค๋ฉด ํด๋น ๋๋ ํ ๋ฆฌ ๋ช
์ด ๋ฐ๋ก ์ฃผ์ ๋ช
์ด ๋๋ค.
์๋ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๋๋ ํ ๋ฆฌ ๊ตฌ์กฐ๊ฐ ์๋ค๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
๋ค์๊ณผ ๊ฐ์ด ๋ ๊ฒ์ด๋ค.
-
pages/index.jsx
http://my-server.com/ -
pages/join/index.jsx
http://my-server.com/join -
pages/login/index.jsx
http://my-server.com/login -
pages/user/user1.jsx
http://my-server.com/user/user1 -
pages/user/user2.jsx
http://my-server.com/user/user2 -
pages/user/user3.jsx
http://my-server.com/user/user3
์ด ๋๋ ๊ฒ์ด๋ค.
๊ทผ๋ฐ ์ฌ๊ธฐ์ ์กฐ๊ธ ์์ํ ์ ์ด ์๋ค.
์์์ user1 user2 user3๊ณผ ๊ฐ์ด ๋์ ์ผ๋ก ๋์ด๋๋ ํ์ด์ง (๊ฒ์๊ธ ์)๋ ์ด๋ป๊ฒ ํด์ผํ ๊น?
์์ ์์ ์ฒ๋ผ ์ผ์ผ์ด ๋ง๋ค์ด์ผํ๋?
๊ทธ๋ด๋ฆฌ๊ฐ ์๋ค.
์ด๋ฐ ์ํฉ์ ์ํด์ Next์์๋ Dynamic Routing์ ์ ๊ณตํ๋ค.
Next์ Dynamic Routing
์ผ๋ฐ์ ์ธ ์น ํ์ด์ง์์๋ ์์ ์์ ์ฒ๋ผ ๋ฏธ๋ฆฌ ์ ์๋ ๊ฒฝ๋ก๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ถฉ๋ถํ์ง ์๊ณ ์์ฃผ ์๋ชป๋ ์ ๊ทผ์ด๋ค.
์๋ฅผ ๋ค์ด ๊ฒ์ํ๊ณผ ๊ฐ์ ๊ฒฝ์ฐ์๋ ์ฌ์ฉ์๊ฐ ๊ธ์ ์ธ๋ ๋ง๋ค url์ด ์ฆ๊ฐํ๊ฒ ๋๋ค.
์ด๋ฐ ์ํฉ์ ์ํด์ Next.js ์์๋ ํ์ด์ง ํ๋ฆฌ๋ฏธํฐ์ ๋๊ดํธ๋ฅผ ์ถ๊ฐํด์ url์ ๋์ ์ผ๋ก ๋ง๋ค ์ ์๋ค.
์ฆ ์ด๋ ๊ฒ ํ๋ฉด ๋๋ค๋ ์๋ฆฌ๋ค.
pages/user/[param].jsx
๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์์์ ๋ดค๋ ๋ฌธ์ ์ ์ ์ฉํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
์ฌ๊ธฐ์ ์ผ์นํ๋ ๊ฒฝ๋ก์ parameter ๊ฐ query parameter ๋ก ํ์ด์ง์ ์ ์ก๋๊ณ ๋ค๋ฅธ query parameter๊ณผ ํฉ์ณ์ง๊ฒ ๋๋ค.
์ด์ ์ฝ๋๋ฅผ ๊ตฌํํด๋ณด์.
[user].jsx
import { useRouter } from "next/router"; // query parameter ์ ์ฌ์ฉํ๊ธฐ ์ํด next์ router ํจํค์ง์ useRouter๋ฅผ ๊ฐ์ ธ์จ๋ค.
const User = () => {
const router = useRouter();
// router์ url ์ฟผ๋ฆฌ์ ์กด์ฌํ๋ user ์ ๊ฐ์ ๊ฐ์ ธ์จ๋ค. ์ด๋ [user].jsx์ user์ ๋์๋๋ค.
const { user } = router.query;
return <h3>์ฌ์ฉ์ ์ด๋ฆ: {user}</h3>;
};
export default User;
๊ทธ๋ฆฌ๊ณ ๊ฐ๊ฐ ๋ค๋ฅธ query param์ ์ฃผ๊ฒ ๋๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ๊ธฐ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ๋์ ์ผ๋ก ์์ฑ๋๋ค.
์ฌ๊ธฐ์ ์ผ์นํ๋ ๊ฒฝ๋ก์ parameter ๊ฐ query parameter ๋ก ํ์ด์ง์ ์ ์ก๋๊ณ ๋ค๋ฅธ query parameter๊ณผ ํฉ์ณ์ง๊ฒ ๋๋ค.
Path variable ๊ณผ Query Parameter ์ ๊ฐ์ ๋ฐ๋ก ๊ฐ์ ธ์ฌ ์ ์๋๋ฐ, router.query
์ ๊ฐ์ฒด ๊ฐ์ ๋ณด๋ฉด ์ ์ ์๋ค.
/post/abc
๋{"pid": "abc"}
/post/abc?foo=bar
๋{ "foo": "bar", "pid": "abc" }
๊ทธ๋ฆฌ๊ณ ๋ฌผ๋ก ๋์ ์ธ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ pages/post/[pid]/[comment].js
๊ณผ ๊ฐ์ ํ์์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
๋๊ธ