Next.js์ ๊ฐ๋ ์ ๋ํด ์์๋ณด๋ ๊ธ
์ต๊ทผ์ ์๊ฒ ๋ ์ ๋ณด๋ค์ ์ ๋ฆฌํ๋ ๋๋์ผ๋ก ์์ฑํด๋ณด๋ ค ํ๋ค
Next.js๋ vercel ํ์์ ๋ง๋ React Framework์ด๋ค.
์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ํจ์ผ๋ก ์ป๋ ์ด๋ ?
CSR์ ๋จ์
- CSR์ ๊ฒฝ์ฐ ๋ชจ๋ JS ํ์ผ์ ๋ก๋ํ ์ดํ์ ์ฌ์ฉ์๊ฐ ์น์ ๋ณด๊ฒ ๋๋ค → ์ฆ JS ํ์ผ์ ๋ก๋ํ๊ธฐ ์ ๊น์ง ์ฌ์ฉ์๋ ๋ง์ ์๊ฐ์ ๋๊ธฐํด์ผ ํ๋ค
๐ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง ์ฆ ์๋ฒ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ๋ก๋ฉํ๊ณ ์ ์ ๊ฐ ๋ณผ ์ ์๋ html (๋ฏธ๋ฆฌ ๋ฐ์ดํฐ๊ฐ ๋ ๋๋ง๋ ํ์ด์ง)์ ๋ณผ ์ ์๊ธฐ ๋๋ฌธ์ ์ ์ ๊ฐ ํ์ด์ง๋ฅผ ํ์ธํ๋ ์๊ฐ์ ๋จ์ถ ์ํฌ ์ ์๋ค.
CSR์ ๋จ์
- SEO - CSR์ ๊ฒฝ์ฐ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ก๋ ๋์ง ์์ ๊ฒฝ์ฐ ์นํ์ด์ง๋ฅผ ๋ณผ ์ ์๋ค -> ๋น์ด์๋ (index.html)
- ๊ตฌ๊ธ ๊ฒ์์์ง์ ๊ฒฝ์ฐ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ก๋๋์ง ์์ ํ์ด์ง๋ฅผ ๊ฒ์์์ง์ผ๋ก ์ค์บํ์ฌ ๊ฒ์ ์์ง์ ํ์ด์ง๊ฐ ๊ฑธ๋ฆฌ์ง ์๋๋ค.
๐ ์๋ฒ์ฌ์ด๋ ๋ ๋๋ง์ ํจ์ผ๋ก์จ ๊ฒ์์์ง์ด html์ ์ฝ์ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฒ์์์ง์ ํ์ด์ง๊ฐ ๊ฑธ๋ฆฐ๋ค. ( meta ํ๊ทธ๋ฅผ ์ถ๊ฐํ์ฌ seo๋ฅผ ์ฉ์ดํ๊ฒ ํ ์ ์๋ค. )
๋ค๋ง SSR์ ์๋ฒ์ ๋ถํ๊ฐ ์์ ์ ์๊ณ ํ์ด์ง ์ด๋ ์ ๊น๋ฐ์ด๋ ๋จ์ ์ด ์๋ค.
์ค์น
npx create-next-app@latest --ts
# or
yarn create next-app --typescript
# or
pnpm create next-app --ts
Next.js ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ
ํ์ด์ง ๊ธฐ๋ฐ ๋ผ์ฐํ ์์คํ
next.js๋ pre-rendering ๋ฟ ์๋๋ผ ํ์ด์ง ๊ธฐ๋ฐ ๋ผ์ฐํ ์์คํ ๋ ์ ๊ณตํ๋ค. ํ๋ก์ ํธ์ /pages ํด๋์์ ๋ผ์ฐํ ํ๋ ค๋ ์ปดํฌ๋ํธ๋ฅผ exportํ๋ฉด ํด๋๋ช ์์ฒด๊ฐ ํ์ด์ง route๊ฐ ๋๋ค.
→ ๋ฃจํธ ํ์ด์ง์ธ index.tsx์ธ notice, about ํด๋ ๋ฑ์ด Route๊ฐ ๋๋ค ex) /about , /notice
์ ์ ๋ผ์ฐํ
์ ์ ๋ผ์ฐํ ์ ์ง์ ๋ URL๋ก ์ด๋ํ๋ ๋ฐฉ๋ฒ์ด๋ค
react-router-dom๊ณผ ๊ฐ์ด Next ์์๋ Link๋ฅผ ์ฌ์ฉํ์ฌ ๋ผ์ฐํธ ์ด๋์ ํ ์ ์๋ค.
import Link from 'next/link';
const Home = () => {
return (
<div>
<Link href="/notice">
<a>notice ํ์ด์ง๋ก ์ด๋</a>
</Link>
</div>
);
};
export default Home;
Link๋ a ํ๊ทธ์ ๋ง์ฐฌ๊ฐ์ง๋ก href ์์ฑ์ผ๋ก ์ด๋ ํ ์ ์๋ค.
Link๋ก ๊ฐ์ผ ์๋ฆฌ๋จผํธ๋ฅผ ํด๋ฆญํ๊ฒ ๋๋ฉด ์ง์ ํ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ค
- ๋ ๋งํฌ๋ ๋ธ๋ผ์ฐ์ ์ History API๋ฅผ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ค๋ก๊ฐ๊ธฐ๋ฅผ ํด๋ฆญํ๋ฉด ์ด์ ์ ๋ ๋๋งํ ํ์ด์ง๋ก ์ด๋ํ๊ฒ ๋๋ค
๋์ ๋ผ์ฐํ
๋ฏธ๋ฆฌ ์ง์ ํด๋์ ๋ผ์ฐํ ์ธ์ ๋์ ์ผ๋ก ๋ผ์ฐํ ํ๋ ๋ฐฉ๋ฒ๋ ์กด์ฌํ๋ค
์๋์ ๊ฐ์ด [ ]์ ๊ฐ์ ์ง์ ํ๋ฉด ํด๋น ๊ฐ์ด query๊ฐ ๋๊ณ ํด๋น query๋ก ๋ผ์ฐํ ์ด ๊ฐ๋ฅํด์ง๋ค
Notice๋ผ๋ ํด๋ ํ์์ index.tsx์ [id].tsx ๋๊ฐ์ ํ์ผ์ ์์ฑํ๋ค index.tsx๋ Notice์ Home์ด ๋ ๊ฒ์ด๊ณ [id].tsx๋ ์ฟผ๋ฆฌ๋ก ์ ๊ทผํ๋ ํ์ด์ง๊ฐ ๋ ๊ฒ ์ด๋ค.
// [id].tsx
import { useRouter } from 'next/router';
const Notice = () => {
const router = useRouter();
return (
<div>
<h1>Notice {router.query.id}</h1>
</div>
);
};
export default Notice;
localhost:3000/Notice/100 ์ผ๋ก ์ ๊ทผํ์ ๊ฒฝ์ฐ ์๋์ ๊ฐ์ ํ์ด์ง๊ฐ ๋ณด์ฌ์ง๋ค.
๋ผ์ฐํฐ ๊ฐ์ฒด
์ด๋ฒ์๋ ํ์ด์ง์ ๊ฒฝ๋ก ์ ๋ณด๋ฅผ ๊ฐ์ง๋ ๋ผ์ฐํฐ ๊ฐ์ฒด useRouter๋ฅผ ์์๋ณด์.
import { useRouter } from 'next/router';
const Home = () => {
const router = useRouter();
const onMoveToAboutPage = () => {
router.push('/About');
};
return <div onClick={onMoveToAboutPage}>AboutPage๋ก ์ด๋</div>;
};
export default Home;
์ ์ฒ๋ผ ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ํตํด ๋ผ์ฐํ ์ ํ๊ณ ์ ํ๋ค๋ฉด useRouter ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํ๋ฉด ๋๊ฒ ๋ค
์์ฃผ ์ฌ์ฉ๋๋ ๋ฉ์๋
- router.push - ์ด๋ํ๊ณ ์ ํ๋ url์ด ์คํ์ ์์ฌ ์ด๋ํ๊ฒ ๋๋ค
- router.replace - ์ด๋ํ๊ณ ์ ํ๋ url์ด ์คํ์ ์์ด์ง ์๊ณ ์ด๋ํ๊ฒ ๋๋ค
- router.pathname - ํ์ฌ ์ด๋ ค์๋ ํ์ด์ง์ pathname
- router.query - ํ์ฌ ์ด๋ ค์๋ ํ์ด์ง์ query
Next.js, SSR์ ๊ฐ๋ ๊ณผ ๋ผ์ฐํธ์ ๋ํด ๊ฐ๋จํ๊ฒ ์์ ๋ดค๋ค ์ฃผ์ํ ๊ฐ๋ ๋ค์ด ๋ง์ด ์๊ธฐ ๋๋ฌธ์ ๋ค์๊ธ์์ ์ฒ์ฒํ ๋ ์์๋ณด๋ ค ํ๋ค.
'Next' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Next.js Image ์์๋ณด๊ธฐ (0) | 2022.09.18 |
---|---|
Next.js์ Pre-rendering (1) | 2022.09.11 |
Next.js์ _app๊ณผ _document ์์๋ณด๊ธฐ (0) | 2022.09.05 |