๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Next

Next.js ์•Œ์•„๋ณด๊ธฐ

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