์ด ๊ธ์ udemy์ Next.js & React - ์๋ฒฝ ์ ๋ณต ๊ฐ์ด๋ (incl. Two Paths) ๊ฐ์ข๋ฅผ ๋ฐํ์ผ๋ก ์ ๋ฆฌํ ๋ด์ฉ์ ๋๋ค.
52. ๋ชจ๋ ๊ฐ์
ํ์ผ ๊ธฐ๋ฐ์ routing, ์ ์ ๋ฐ ๋์ routes, ํ์ด์ง๊ฐ์ ๋ค๋น๊ฒ์ดํ ์ ๋ํด ๋ฐฐ์ธ ์์ ์ ๋๋ค.
53. ์์ ์ค์ Setup
์ฌ์ดํธ ์์ค ์ฝ๋ ์ฐธ๊ณ
54. ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ ์ด๋ ๋ฌด์์ผ๊น?
React.js๋ react-router-dom์ ์ฌ์ฉํ์ฌ, ๋ผ์ฐํธ๋ฅผ ์งํํฉ๋๋ค. ํ์ง๋ง Next.js๋ ๋ผ์ฐํฐ๋ฅผ ์ค์นํ์ง ์๊ณ , ๋ผ์ฐํธ์ ํ์ด์ง ๊ตฌ์กฐ๋ฅผ ์ ์ํ๋ ๋ฐ JSX์ JS ์ฝ๋๋ฅผ ์ฌ์ฉํ์ง ์์ต๋๋ค.
Next.js์์๋ React ์ปดํฌ๋ํธ ํ์ผ์ ์์ฑํฉ๋๋ค. ํน๋ณํ ํด๋์ ์ผ๋ฐ์ ์ธ React ์ปดํฌ๋ํธ ํ์ผ์ ์์ฑํฉ๋๋ค. ์ดํ Next.js๊ฐ ์ค์ ๋ ํด๋ ๊ตฌ์กฐ๋ก๋ถํฐ ํ๋ก์ ํธ์ ๋ผ์ฐํธ๋ฅผ ๋์ถํด ๋ด๋๋ก ๋ง๋ญ๋๋ค. special/pages ํด๋๋ฅผ ์ฌ์ฉํ๋ฉด, Next.js๊ฐ ๋ผ์ฐํธ ๊ตฌ์กฐ๋ฅผ ๋์ถํ๊ธฐ ์ํด ์ด ํด๋๋ฅผ ์๋์ผ๋ก ํ์ธํ๊ฒ ๋ฉ๋๋ค. index.js๋ ํ์ฌ ์ํ ํด๋๋ฅผ ์ํ ๋ผ์ฐํธ ๊ฒฝ๋ก๋ก ๊ฐ์ ํ๊ฒ ๋ ํน๋ณํ ํ์ผ์ ์ฌ์ฉํ์ฌ ์ ์ํด์ฃผ๋ฉด ๋ฉ๋๋ค.
55. ์ฒซ ๋ฒ์งธ ํ์ด์ง ์ถ๊ฐํ๊ธฐ
page ํด๋์ index.js ํ์ผ์ ์ถ๊ฐํด์ค๋๋ค.
export default function HomePage() {
return (
<div>
<h1>The Home Page</h1>
</div>
);
}
57. ์ค์ฒฉ(Nested) ๊ฒฝ๋ก & ๋ผ์ฐํธ ์์
์ค์ฒฉ ๊ฒฝ๋ก๋ฅผ ํ์ฉํ ์๋ ์์ต๋๋ค. ๋ฐฉ๋ฒ๋ง ๋ค๋ฅผ ๋ฟ ๊ฒฐ๊ณผ๋ ๊ฐ์ต๋๋ค. ์ ํธํ๋ ๋ฐฉ๋ฒ์ ์ ํํ๋ฉด ๋ฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก pages ํด๋ ์์ ํ์ ํด๋๋ฅผ ์์ฑํด ๊ตฌ์กฐ๋ฅผ ๋ง๋ค์ด ์ฌ๋ฌ ํ์ผ์ ๊ทธ๋ฃนํ ํ๋ ๊ฒ์ด ์ข์ ์๊ฐ์ ๋๋ค.
58. ๋์ (Dynamic) ๊ฒฝ๋ก & ๋ผ์ฐํธ ์ถ๊ฐ
portfolio/ ํด๋ ๋ฐ์ [projectid].js ํ์ผ์ ์ถ๊ฐํด์ค์๋ค. ์ด๋ ๋ฐ๋์ ๋๊ดํธ๋ ์์ด์ผ ํฉ๋๋ค. ๋๊ดํธ๋ฅผ ๋ถ์ฌ์ผ Next.js์ ์ฃผ์๋ฅผ /porfolio/projectid๋ก ์ค์ ํ์ง ์๊ณ , projectid๋ฅผ placeholder๋ก ์ธ์ํ๊ณ ์ปดํฌ๋ํธ์ ์์ธ์ค ํ์ฌ ์ฌ๋ฌ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๊ฒ ๋ฉ๋๋ค.
์ดํ ์ด๋ค ๊ฐ์ ์ ๋ ฅํ๋ ๋์ํฉ๋๋ค. ๊ทธ ์ด์ ๋ [projectid].js๋ผ๋ placeholder๊ฐ ์๊ณ , ๊ทธ ์์ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ ์ฑ์๋ฃ๊ธฐ ๋๋ฌธ์ ๋๋ค. ํ๊ฐ์ง ์ฃผ์ํ ์ ์ /list๋ฅผ ์ ๋ ฅํ๋ฉด ๋ชฉ๋ก ํ์ด์ง๋ก ์ด๋ํ๋ค๋ ๊ฒ์ ๋๋ค. placeholder์ ๋ํ ๊ณ ์ ๊ฐ์ผ๋ก ์ธ์๋๋ ๊ฐ์ ํ์ธํ๋ฉด, ๊ทธ ๊ฐ์ ํด๋นํ๋ ๊ฐ์ด ์๋์ง ํ์ธํ๋ ๊ณผ์ ์ ๊ฑฐ์นฉ๋๋ค. ์ด๋ฏธ /portfolio/list ๋ฅผ ์ ๋ ฅ ์ ํด๋์ ์ด๋ฏธ list.js ํ์ผ์ด ์๊ธฐ ๋๋ฌธ์ ๋์ ํ์ผ๋ณด๋ค ์ด ํ์ผ์ ์ฐ์ ์ ํ๊ฒ ๋ฉ๋๋ค.
์ฌ๋ฌ ์ข ๋ฅ์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์์ผ ํ๋ ํ์ด์ง ex) ์จ๋ผ์ธ ์คํ ์ด ์ํ, ๋ธ๋ก๊ทธ ๊ฒ์๊ธ ๋ฑ ์์ ์ด ํ์ด์ง ์ปดํฌ๋ํธ๋ฅผ ํ์ฉํ๋ ค๋ฉด ์ปดํฌ๋ํธ์ ์ ๋ ฅํ ์ด๋ฆ๊ณผ ์ผ์นํ๋ ๊ตฌ์ฒด์ ์ธ project id๋ฅผ ์ฌ์ฉํด์ ๋ฐ์ดํฐ ๋ฒ ์ด์ค์ ์ ๊ทผํ ์ ์๊ฒ ๋๊ณ , ๋ฐ์ดํฐ ๋ฒ ์ด์ค์์ fetch ํ ๊ณ ์ ํ ๋ฐ์ดํฐ๋ฅผ ์ด ์ปดํฌ๋ํธ์ ์ ์ฉํด์ ํ๋ฉด์ ์ถ๋ ฅํ ์ ์์ต๋๋ค.
59. ๋์ ๊ฒฝ๋ก Segment Data ์ถ์ถํ๊ธฐ
์ฌ์ฉ์๊ฐ URL์ ์ ๋ ฅํ ๊ตฌ์ฒด์ ์ธ ๊ฐ์ ์์ธ์ค ํ๋ ค๋ฉด Next.js์ ํน์ํ hook 'useRouter' ์ ์ฌ์ฉํ๋ฉด ๋ฉ๋๋ค. query๋ผ๋ ๋ผ์ฐํฐ ํ๋กํผํฐ๋ก URL์ ๋ถํธํ๋ ๊ตฌ์ฒด์ ์ธ ๋ฐ์ดํฐ์ ์์ธ์คํ ์ ์์ต๋๋ค. ์ถํ router.query.projectid ๋ผ๋ ID๋ฅผ ํตํด ๋ฐฑ์๋ ์๋ฒ์ ๋ฐ์ดํฐ ์กฐ๊ฐ์ fetcing ํ๋๋ก ์์ฒญ์ ๋ณด๋ผ ์๋ ์์ต๋๋ค.
60. ์ค์ฒฉ๋ ๋์ ๋ผ์ฐํธ & ๊ฒฝ๋ก ๊ตฌ์ถํ๊ธฐ
61. Catch-All ๋ผ์ฐํธ ์ถ๊ฐํ๊ธฐ
ํ์ ํด๋์ธ blog๊ฐ ์๋ค๊ณ ๊ฐ์ ํด๋ด ์๋ค. ๋ธ๋ก๊ทธ ๊ฒ์๋ฌผ์ ๋ถ๋ฌ์ค๋ ๋ฐฉ๋ฒ์ ๋ค์ํฉ๋๋ค. /blog/the-id-of-a-post, /blog/2022/10/11 ๋ฑ ์ง์ํด์ผ ํ๋ URL ํ์์ด ๋ค์ํฉ๋๋ค. ์ด๋ค์ Catch-all ๋ผ์ฐํธ๋ฅผ ์ด์ฉํ์ฌ ๋์ผํ ์ปดํฌ๋ํธ๋ก ํ ๋ฒ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.
JavaScript์ ์คํ๋ ๋ ์ฐ์ฐ์ ๊ฐ์ด ๋ง์นจํ ์ธ๊ฐ (...)๋ฅผ ์ ๋ ฅํ๊ณ , ์ด๋ฆ์ ํธ์๋๋ก ์ง์ผ๋ฉด ๋ฉ๋๋ค. ๋จ์ผ Segment ๊ฐ๋ง ๋์ ์ผ๋ก ์๋ํ๋ ๊ฒ ์๋๋ผ Segment์ ๊ฐฏ์๋ ๋์ ์ผ๋ก ์๋ํฉ๋๋ค.
62. "Link" ์ปดํฌ๋ํธ๋ก Navigating ํ๊ธฐ
pages/index.js ์ ์ผ๋ฐ์ ์ผ๋ก <a>๋ฅผ ์ด์ฉํด ๋งํฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค. ์๋์๋ ๋ฌธ์ ๊ฐ ์์ง๋ง ๋จ์ ์ด ์กด์ฌํฉ๋๋ค. ์ ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ์ํด ์ HTTP ์์ฒญ์ ๋ณด๋์ ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค. ์ฆ React ์ฑ์ ์คํํ ๋ ๊ฐ๋ ์ฑ ์ํ(state)๊ฐ ๋ฐ๋๋ ์ํฉ์ ์๋ฏธํฉ๋๋ค. React Context๋ Redux์์ ์ ์ฅํ๋ app-wide ์ํ๊ฐ ์ ์์ฒญ์ผ๋ก ์ธํด ์ HTML ํ์ด์ง๋ฅผ ๋ฐ์์ผ๋ก์จ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. Next.js๋ฅผ ์ฌ์ฉํ๋ ์ ํ๋ ๊ฐ์ React ์ฑ์ ๋ง๋๋ ๋ฐฉ์์ผ๋ก๋ ์ ํฉํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ next.js router๋ก๋ถํฐ link ์ปดํฌ๋ํธ๋ฅผ import ํ์ฌ ์๋์ ๊ฐ์ด ์ฌ์ฉํ์์ต๋๋ค.
import Link from "next/link";
export default function HomePage() {
return (
<div>
<h1>The Home Page</h1>
<ul>
{/* <li>
<a href="/portfolio">Portfolio</a>
</li> */}
<li>
<Link href="/portfolio">Portfolio</Link>
</li>
<li>
<Link href="/clients">Clients</Link>
</li>
</ul>
</div>
);
}
63. ๋์ ๋ผ์ฐํธ๋ก Navigating ํ๊ธฐ
<Link>์๋ ์ฌ์ฉ์์๊ฒ ๋ณด์ด๋ ํ ์คํธ๊ฐ ์๊ณ , ํด๋ผ์ด์ธํธ ์ด๋ฆ์ ์ถ๋ ฅํ๊ณ ์์ต๋๋ค. Link ๋์์ ๊ฐ์ผ๋ก ๋ฌธ์์ด์ ๋ง๋ค์ด์ ํ๋ ์ฝ๋ฉํ /clients๋ฅผ ํฌํจํ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ์์ฑํ์ต๋๋ค. ํด๋ผ์ด์ธํธ๋ง๋ค id๊ฐ ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋์ ์ธ ${client.id}๋ฅผ ์ฝ์ ํ์ต๋๋ค.
64. Link Href๋ฅผ ์ค์ ํ๋ ๋ค๋ฅธ ๋ฌธ๋ฒ
<Link>์ href ํ๋กํผํฐ์ ์ ๋ฌํ ๋์ ๊ฐ์ด ์์ต๋๋ค. ์ด๋ํ๋ ค๋ ๊ฒฝ๋ก๋ฅผ ๋ฌธ์์ด๋ก ์์ฑํ๋ ๋์ ๊ฐ์ฒด๋ก ์์ฑํ ์ ์์ต๋๋ค. {{}} ํํ๋ ํน์ ๊ตฌ๋ฌธ์ด ์๋๋ผ JavaScript ํํ์์ ์ฝ๋ ๋จ์ผ ์ค๊ดํธ์ผ ๋ฟ์ ๋๋ค. pathname๊ณผ query ํ๋กํผํฐ๋ฅผ ์ด์ฉํ์ฌ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
65. ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ผ๋ก Navigating ํ๊ธฐ
router.push๋ฅผ ์ฌ์ฉํ๋ฉด <Link> ์ปดํฌ๋ํธ๋ฅผ ํ๋ก๊ทธ๋จํ ํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค. /client/max/projecta๋ก ์ด๋ํ๋ค๊ณ ํ ๋, ์ ์ฅ ํ Maximillan์ ํด๋ฆญํ๊ณ , ํ๋ก์ ํธ A ๋ถ๋ฌ์ค๊ธฐ ๋ฒํผ์ ๋๋ฅด๋ฉด /client/max/project๋ก ์ด๋ํฉ๋๋ค.
router.push ๋์ router.replace๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ฌ ํ์ด์ง๋ฅผ ์ฝ๋์ ํ์ด์ง๋ก ๋์ฒดํฉ๋๋ค. ์ฆ ํ์ด์ง ์ด๋ ํ์๋ ๋๋์๊ฐ ์ ์์ต๋๋ค. ๋ํ ์์ ๋ฐฐ์ด ๊ฒ์ฒ๋ผ ๋งํฌ ์๋ฆฌ์ pathname์ธ ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ ์๋ ์์ต๋๋ค.
66. ์ปค์คํ 404 Page ์ถ๊ฐํ๊ธฐ
404 ํ์ด์ง๋ฅผ ์์ฒด ์ฝํ ์ธ ์ ์คํ์ผ๋ก ๊พธ๋ฐ ์ ์์ต๋๋ค. ํ์ผ ์ด๋ฆ์ผ๋ก 404๋ก ์ง์ ํด์ผ ํฉ๋๋ค. ๊ทธ๋์ผ 404 ์๋ฌ ๋ฐ์ ์ Next.js๊ฐ ์ด ํ์ผ์ด ๋ฐํํ ์ปดํฌ๋ํธ๋ฅผ ๋ถ๋ฌ์ค๊ธฐ ๋๋ฌธ์ ๋๋ค.
67. ๋ชจ๋ ์์ฝ
ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ ์ ๋ํด ๊น๊ฒ ๋ฐฐ์ฐ๊ณ , Next.js๋ฅผ ํตํ ํ์ด์ง ์ค์ ๋ฐฉ๋ฒ๊ณผ ํ์ด์ง ์ด๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ดค์ต๋๋ค.
๐กFile-based vs Code-based
File-based Routing (NextJS)
- ์ถ๊ฐ ๋ณด์ผ๋ฌ ์ฝ๋๊ฐ ํ์ํ์ง ์๋ค.
- ์ง๊ด์ ์ด๋ค
- File + folder ๊ตฌ์กฐ๊ฐ ๋ผ์ฐํ ์ ์ํฅ์ ๋ฏธ์น๋ค
- ํ์ด์ง ์ด๋ ์ <Link> ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
Code-based
- ์ถ๊ฐ ๋ณด์ผ๋ฌ ์ฝ๋๊ฐ ํ์ํ๋ค ( <Switch>, <Route> ..)
- ๋ฐฐ์์ผ ํ ์๋ก์ด ์ปดํฌ๋ํธ๋ ๊ฐ๋ ์ด ํ์ํ๋ค.
- ํ์ผ๊ณผ ํด๋ ์ค์ ์ด ์ค์ํ์ง ์๋ค.
- ํ์ด์ง ์ด๋ ์ <Link> ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋๋ค.
68. ๋ชจ๋ ๋ฆฌ์์ค
์ฌ์ดํธ ์์ค ์ฝ๋ ์ฐธ๊ณ
'Framework > Next.js' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Next.js & React] ํ์ผ ๊ธฐ๋ฐ ๋ผ์ฐํ ์์ ํ๊ธฐ (0) | 2022.11.13 |
---|---|
[Next.js] Error: Invalid Link with a child. Please remove a or use Link legacyBehavior ์ค๋ฅ (0) | 2022.11.08 |
[Next.js] Error: The default export is not a React Component in page: "/" ์ค๋ฅ (0) | 2022.11.08 |
[Next.js & React] ์์ํ๊ธฐ (0) | 2022.11.02 |
[Next.js] url ๋ก ํน์ page์ ์ง์ ์ ๊ทผ ๋ง๋ ๋ฐฉ๋ฒ (0) | 2022.10.03 |