๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ“˜TypeScript

[Next.js] #1 TypeScript๋กœ ์‹œ์ž‘ํ•˜๊ธฐ

by Tamii 2021. 7. 22.
๋ฐ˜์‘ํ˜•

โœ”๏ธ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—

React์˜ ์ž‘๋™ ๋ฐฉ์‹

react build -> ํ•˜๋‚˜์˜ JSํŒŒ์ผ ์ƒ์„ฑ -> bundle.js๊ฐ€ cilent๋‹จ์—์„œ DOM์„ ๊ทธ๋ฆผ

 

์ด๋Ÿฌํ•œ ๋ฐฉ์‹์˜ ๋‹จ์ ์€ CSR์˜ ๋‹จ์ ์ด๋ผ๊ณ ๋„ ํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ

1. bundle.js ํŒŒ์ผ์˜ ์‚ฌ์ด์ฆˆ๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ์ปค์งˆ ์ˆ˜ ์žˆ๋‹ค.

2. ์‚ฌ์šฉ์ž๊ฐ€ ํ™”๋ฉด์„ ๋ณด๊ธฐ๊นŒ์ง€ ์ง€์—ฐ์‹œ๊ฐ„์ด ๊ธธ์–ด์ง„๋‹ค. 

3. SEO(Search Engine Optimization) ๊ฒ€์ƒ‰์—”์ง„์— ๋ถˆ๋ฆฌํ•˜๋‹ค. 

ํŠนํžˆ React๋Š” ๋Œ€ํ‘œ์ ์ธ CSR(Client Side Rendefing)๋ฐฉ์‹์œผ๋กœ ๋ Œ๋”๋งํ•˜์—ฌ,  ์ดˆ๊ธฐ html์ด ๋น„์–ด์žˆ๊ธฐ ๋•Œ๋ฌธ์— SEO์— ์ข‹์ง€ ์•Š๋‹ค.

 

์œ„ ์ƒํ™ฉ๋“ค์„ ๊ฐ„ํŽธํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด์„œ Next.js ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๐Ÿค” ์—ฌ๊ธฐ์„œ ์ž ๊น  ์šฉ์–ด ์ •๋ฆฌ๋ฅผ ํ•˜๊ณ  ๋„˜์–ด๊ฐ€์ž๋ฉด,

SEO

 ์„œ๋ฒ„์— ์ž‡๋Š” ์›น์‚ฌ์ดํŠธ์˜ html ํŒŒ์ผ๋“ค์„ ๋ถ„์„ํ•ด  ๋น ๋ฅด๊ฒŒ ๊ฒ€์ƒ‰๋˜์–ด ์ง€๊ฒŒ ๋งŒ๋“œ๋Š”๊ฒƒ 

SSR

์„œ๋ฒ„์—์„œ html ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ๋™์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ํŒŒ์ผ๊ณผ ํ•จ๊ป˜ ํด๋ผ์ด์–ธํŠธ๋กœ ์ „์†กํ•˜๋Š” ๋ Œ๋”๋ง ๋ฐฉ์‹ 

 ์ฒซ ํ™”๋ฉด ๋กœ๋”ฉ์ด ๋น ๋ฅด๊ณ   ํšจ์œจ์ ์ธ SEO๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ์žฅ์ ์ด ์ž‡๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ํด๋ฆญ ์‹œ ์ „์ฒด์ ์ธ ์›น์‚ฌ์ดํŠธ๋ฅผ ์„œ๋ฒ„์—์„œ ๋‹ค์‹œ ๋ฐ›์•„์™€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊นœ๋ฐ•์ž„ ํ˜„์ƒ์ด ์žˆ๊ณ  ์„œ๋ฒ„์— ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

CSR 

๋ธŒ๋ผ์šฐ์ €์—์„œ JS๋ฅผ ํ™œ์šฉํ•ด ๋ Œ๋”๋ง ํ•˜๋Š” ๋ฐฉ์‹

์‚ฌ์šฉ์ž ๋ฐ˜์‘์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ถ€๋ถ„์ ์œผ๋กœ ์„œ๋ฒ„์— ์š”์ฒญํ•ด ๋ Œ๋”๋งํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฅธ ์ธํ„ฐ๋ ‰์…˜์ด ๊ฐ€๋Šฅํ•œ ์žฅ์ ์ด ์žˆ๋‹ค.

์ฒซ ํ™”๋ฉด ๋กœ๋”ฉ์ด ๋Š๋ฆฌ๊ณ  SEO๊ฐ€ ์–ด๋ ต๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

์ฐธ๊ณ  : https://www.youtube.com/watch?v=iZ9csAfU5Os 


Next.js

๋ฆฌ์•กํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜์—ฌ SPA์„ ๋น ๋ฅด๊ณ  ๊ฐ„ํŽธํ•˜๊ฒŒ ๋นŒ๋“œ ํ•  ์ˆ˜ ์žˆ๋Š” Reactํ”„๋ ˆ์ž„์›Œํฌ

React๋กœ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋• ์•„๋ž˜์™€ ๊ฐ™์€ ์‚ฌํ•ญ๋“ค์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

- webpack, babel๊ณผ ๊ฐ™์€ ๋ฒˆ๋“ค๋Ÿฌ์™€ ๋ณ€ํ™˜

- ๋ Œ๋”๋ง ์ตœ์ ํ™”

- SEO ๊ณ ๋ ค

 

Next.js ๊ฐ€ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ

- ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜์˜ ๋ผ์šฐํŒ… ์‹œ์Šคํ…œ

- SSR ์ด ํŽ˜์ด์ง€ ๋‹จ์œ„๋กœ ์ง€์›

- ์ตœ์ ํ™” ์œ„ํ•œ ํด๋ผ์ด์–ธํŠธ ์ธก ๋ผ์šฐํŒ…

- CSS in JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›

 

โœจ ์ฒซ๋ Œ๋”๋ง์€ SSR์„ ํ•˜๊ณ  ๊ทธ ๋’ค์˜ ๋ผ์šฐํŒ… ์ฒ˜๋ฆฌ๋Š” CSR๋ฐฉ์‹์„ ์‚ฌ์šฉ

์ฒซ ๋ Œ๋”๋ง ์‹œ์˜ ๋กœ๋”ฉ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ์ดํ›„ ๋ Œ๋”๋ง ์‹œ์—๋Š” CSR์„ ํ†ตํ•ด ํ™”๋ฉด์˜ ๊นœ๋นก์ž„์„ ์—†์•จ ์ˆ˜ ์žˆ๋‹ค.

 

 

 


Next.js ๋กœ ํ”„๋กœ์ ํŠธ ์‹œ์ž‘ํ•˜๊ธฐ

 

์„ค์น˜

yarn create next-app ํ”„๋กœ์ ํŠธ์ด๋ฆ„  --typescript

package.json

scirpts ์ž๋™์œผ๋กœ ๋ช…๋ น์–ด๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ

 

next dev : ๊ฐœ๋ฐœ ์„œ๋ฒ„๋กœ ์‹คํ–‰

next build: ๋นŒ๋“œ ๋™์ž‘ 

next start: ๋นŒ๋“œํ•œ ํ”„๋กœ์ ํŠธ ์‹คํ–‰ 

 

 

Next.js ์„ค์น˜ ์‹œ ํŒŒ์ผ๊ตฌ์กฐ

 

_app.tsx

CRA์‹œ์˜ App.jsx๋ผ๊ณ  ๋ณด๋ฉด ๋˜๋Š” ์ตœ์ƒ๋‹จ ๋ ˆ๋ฒจ๋กœ

๋ชจ๋“  component๋ฅผ ๋Œ์•„๋‹ค๋‹ ๋•Œ์˜ state๋ฅผ ๋ณด์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ ์‹œ ์„œ๋ฒ„๋ฅผ ์žฌ์‹œ์ž‘ ํ•ด์•ผ ํ•œ๋‹ค.

 

 

 

 


Next.js์˜ pages

Next.js์—์„œ๋Š”  pages๋‚ด๋ถ€์— ์žˆ๋Š” ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ exportํ•˜๋Š” React Component๋“ค์ด ํŽ˜์ด์ง€ ์š”์†Œ๊ฐ€ ๋œ๋‹ค .

 

์˜ˆ์‹œ๋กœ 

pages / posts/ first-page.tsx  ๋ฅผ ๋งŒ๋“ค์–ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด component๋ฅผ ๋งŒ๋“ค๋ฉด

export default function FirstPost(): JSX.Element {

  return <h1>First Post</h1>;
}

์•„๋ž˜์™€๊ฐ™์ด ํ™ˆ/ ํด๋”/ ํŒŒ์ผ  ์˜ url ํŽ˜์ด์ง€๊ฐ€ ๋งŒ๋“ค์–ด์ง„๋‹ค. 

http://localhost:3000/posts/first-post


Next.js๋Š” ํšจ์œจ์ ์ธ SSR์„ ์œ„ํ•ด์„œ ๊ธฐ์กด์˜ html tag๋“ค์„ component๋กœ ๋งŒ๋“ค์–ด ๋†“์•˜๋Š”๋ฐ  ๊ทธ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ค๋ช…ํ•ด ๋ณด์ž๋ฉด 

Next.js์˜ Link  next / link 

๊ธฐ์กด : <a> link

Next.js:  next/ link 

 

Next.js์˜ <Link> ๋Š” ๊ธฐ์กด html ์˜ <a>์ฒ˜๋Ÿผ ์“ธ ์ˆ˜ ์žˆ๋‹ค.

Link component๋Š” ๋‘ ํŽ˜์ด์ง€ ๊ฐ„ ์ด๋™์„ Client side navigation ์œผ๋กœ ํ•œ๋‹ค. 

์ฆ‰ ๋ธŒ๋ผ์šฐ์ €๋Š” ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ง


Next.js์˜ ์ฝ”๋“œ ๋ถ„ํ• 

Next.js๋Š” ์ž๋™์ ์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„ํ• ํ•˜๋Š”๋ฐ,

ํ™ˆํŽ˜์ด์ง€ ๋กœ๋“œ์‹œ ์š”์ฒญํ•œ ํŽ˜์ด์ง€๋งŒ ๋ Œ๋”๋ง ๋˜๊ณ  ๋‹ค๋ฅธ ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋Š” ์ฒ˜์Œ์— ์ œ๊ณตํ•จ์œผ๋กœ์จ ํ™ˆํŽ˜์ด์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ๋ Œ๋”๋งํ•œ๋‹ค.

์š”์ฒญํ•œ ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๋ฅผ ๋กœ๋“œํ•˜๋ฉฐ ๊ฒฉ๋ฆฌ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ํŠน์ • ํŽ˜์ด์ง€์—์„œ ๋‚œ ์˜ค๋ฅ˜๋Š” ํ•ด๋‹น ํŽ˜์ด์ง€์—์„œ๋งŒ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

build ๋œ Next.js ํ”„๋กœ์ ํŠธ์—์„œ๋Š”  ๋ธŒ๋ผ์šฐ์ €์— Link coponent๊ฐ€ ๋“ฑ์žฅํ• ๋•Œ๋งˆ๋‹ค  Next.js๋Š”  background์—์„œ ๋ฏธ๋ฆฌ ํŽ˜์ด์ง€๋ฅผ ์—ฐ๊ฒฐํ•ด๋†“ ๋ง๋กœ๋”ฉํ•ด๋†“๊ธฐ ๋•Œ๋ฌธ์— ํฌ ํด๋ฆญ ์‹œ์— ํ•ด๋‹น ํŽ˜์ด์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ์—ฐ๊ฒฐ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

 

 

Next.js์—์„œ์˜ CSS

Next.js์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์ด ์žˆ๋‹ค.

CSS Modules, Sass , styled-jsx 

Next.js์—์„œ CSS๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž๋™์œผ๋กœ ๊ณ ์œ ์˜ className์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ , ์ฝ”๋“œ๋ถ„ํ• ์„ ํ†ตํ•ด ๊ฐํŽ˜์ด์ง€์—์„œ ์ตœ์†Œํ•œ์˜ CSS๋กœ๋”ฉ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

๋Œ“๊ธ€