2024-03-28.md

๐Ÿก

DIL: ๋ชจ๋˜ ๋ฆฌ์•กํŠธ ๋”ฅ ๋‹ค์ด๋ธŒ, 4์ฃผ์ฐจ-4

์Šคํ„ฐ๋””: ์›”๊ฐ„ CS, https://github.com/monthly-cs/2024-03-modern-react-deep-dive
์˜ค๋Š˜ ์ง„ํ–‰: ๊ฐœ์ธ๊ณต๋ถ€


DIL-week4-4_2024-03-28

| DIL ์ฃผ์ฐจ | ๋ฒ”์œ„ | ๋‚ด์šฉ | ์˜ค๋Š˜์ฐจ ์ง„๋„ | | -------- | ------ | ------------------------------- | ----------- | | 4์ฃผ์ฐจ | 4, 8์žฅ | SSR๊ณผ ESlint, ํ…Œ์ŠคํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ | 314p~329p |

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
์ฝ์€ ์‹œ๊ฐ„: 9์‹œ~10์‹œ,10์‹œ๋ฐ˜~11์‹œ


Next.js ํ†บ์•„๋ณด๊ธฐ

Data Fetching

getServerSideProps ๋น„๊ต

| ํ•จ์ˆ˜ | ๊ธฐ๋Šฅ | ์ฐธ๊ณ  | ๋นŒ๋“œ ์‹œ ์ƒ์„ฑ | | ------------------ | ----------------------------------------------- | ---------------------------------------------------------- | ------------ | | getStaticPaths | ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ฐ˜ํ™˜ | ๊ทธ ์™ธ์˜ ํŽ˜์ด์ง€๋Š” 404 | html | | getStaticProps | ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ๋กœ ์š”์ฒญ์ด ์™”์„ ๋•Œ, ๋ฐ˜ํ™˜ํ•  props | params๋ฅผ ๊ธฐ์ค€์œผ๋กœ props๋กœ ์ „๋‹ฌํ•  ์š”์ฒญ/์‘๋‹ต์„ ์„œ๋ฒ„์—์„œ ์ฒ˜๋ฆฌ | json | | getServerSideProps | ์„œ๋ฒ„์—์„œ ์‹คํ–‰๋˜๋Š” ํ•จ์ˆ˜ | ํŽ˜์ด์ง€ ์ง„์ž… ์ „ ๋ฌด์กฐ๊ฑด ์‹คํ–‰ | js |

  • HTML ๋žœ๋” ๊ฒฐ๊ณผ > getServerSideProps ๋ฐ˜ํ™˜ ๊ฐ’ ๊ธฐ๋ฐ˜์œผ๋กœ ํŽ˜์ด์ง€ ๋žœ๋”๋ง
    • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง์ด getServerSideProps ์‹คํ–‰๊ณผ ํ•จ๊ป˜ ์ด๋ฃจ์–ด์ง
  • ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง
    1. ์„œ๋ฒ„์—์„œ ๋žœ๋”๋ง์—์„œ ํ•„์š”ํ•œ ์ •๋ณด ํŒจ์นญ
    2. 1์„ ๊ธฐ๋ฐ˜์œผ๋กœ HTML ์™„์„ฑ
    3. 2๋ฅผ ํด๋ผ์ด์–ธํŠธ์— ์ „๋‹ฌ
    4. 3์„ ๋ฐ”ํƒ•์œผ๋กœ hydrate (DOM์— ๋ฆฌ์•กํŠธ ๋ผ์ดํ”„ ์‚ฌ์ดํด๊ณผ ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ์ถ”๊ฐ€)
    5. 4์˜ hydrate์„ ํ†ตํ•ด ๋งŒ๋“  ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์™€, ์„œ๋ฒ„์—์„œ ๋งŒ๋“  HTML์ด ๋‹ค๋ฅด๋ฉด ๋ถˆ์ผ์น˜ ์—๋Ÿฌ
    • suppressHydrationWarning
    1. 5๋ฒˆ๋„ 1์ฒ˜๋Ÿผ ํŒจ์นญํ•ด์„œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•œ๋‹ค.

      1๊ณผ 6 ์ž‘์—… ์‚ฌ์ด ํŒจ์นญํ•œ ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ์˜ ๋ถˆ์ผ์น˜๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ -> 1๋ฒˆ ์ •๋ณด๋ฅผ HTML์— script๋กœ ๋‚ด๋ ค์คŒ (์‹œ์  ์ฐจ์ด๋กœ ์ธํ•œ ์ฐจ์ด ๋ง‰์Œ)

  • window์—๋„ ์ €์žฅํ•œ๋‹ค.
    • window.__NEXT_DATA__
  • props์˜ ๊ฒฐ๊ณผ๋ฅผ HTML์— ์ •์ ์œผ๋กœ ์ž‘์„ฑํ•ด์„œ ๋‚ด๋ ค์ฃผ๊ธฐ ๋•Œ๋ฌธ์— => JSON์œผ๋กœ serializeํ•  ์ˆ˜ ์—†๋Š” ๊ฐ’์€ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค.
  • ์„œ๋ฒ„์—์„œ๋งŒ ์‹คํ–‰
    • window, documentX: ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ์ฒด์— ์ ‘๊ทผ x
    • protocol๊ณผ ๋„๋ฉ”์ธ ํ•„์š”: ์ž์‹ ์˜ ํ˜ธ์ŠคํŠธ๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์—†๋‹ค. (์™„์ „ํ•œ ์ฃผ์†Œ ํ•„์š”)
    • ์—๋Ÿฌ ํ•ธ๋“ค๋ง: ๋ฏธ๋ฆฌ ์ •์˜ํ•ด๋‘” 500.tsx๋กœ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ
  • redirect ์˜ˆ์‹œ => getStaticPaths์— post๊ฐ€ ์—†์„ ์‹œ redirect /404
  • getInitialProps
    • ๊ณผ๊ฑฐ์— getStaticProps, getServerSideProps ๋Œ€์‹  ์‚ฌ์šฉ
    • _app.tsx, _error.tsx์—์„œ๋Š” getInitialProps ์จ์•ผํ•จ

      https://nextjs.org/docs/pages/api-reference/functions/get-initial-props Good to know: getInitialProps is a legacy API. We recommend using getStaticProps or getServerSideProps instead.

    • ํŠน์ง•๋งŒ ์•Œ์•„๋‘๊ธฐ - ๋ฃจํŠธ ํ•จ์ˆ˜์— ์ •์  ๋ฉ”์„œ๋“œ ์ถ”๊ฐ€ Todo.getInitialProps = ()=> {} - Props๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฐ”๋กœ ๊ฐ์ฒด ๋ฐ˜ํ™˜! - ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ - pathname, asPath, query, req, res

| ํŒŒ์ผ | ์‚ฌ์šฉ ์ด์œ  | | ----------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | _app.tsx | ๋ชจ๋“  ํŽ˜์ด์ง€ ์š”์ฒญ์— ๊ณตํ†ต๋˜๋Š” ๋ ˆ์ด์•„์›ƒ, ํŽ˜์ด์ง€ ์ „ํ™˜, ์ƒํƒœ ๊ด€๋ฆฌ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•จ.์„œ๋ฒ„์—์„œ ๋ฏธ๋ฆฌ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ํŽ˜์ด์ง€์— ๊ฑธ์ณ ์žˆ์„ ๊ฒฝ์šฐ, ์ค‘์•™์—์„œ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ ๋กœ์ง์„ ๊ด€๋ฆฌํ•˜๊ณ  ๊ฐ ํŽ˜์ด์ง€์— props๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Œ. | | _error.tsx | ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์˜ค๋ฅ˜๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ์ปค์Šคํ…€ ์˜ค๋ฅ˜ ํŽ˜์ด์ง€. ํŠน์ • ์˜ค๋ฅ˜ ์ƒํ™ฉ(์˜ˆ: 404, 500 ์—๋Ÿฌ)์—์„œ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋‚˜ ์ถ”์ฒœ ์ฝ˜ํ…์ธ  ๋“ฑ์„ ์„œ๋ฒ„๋กœ๋ถ€ํ„ฐ ๋ฏธ๋ฆฌ ๋กœ๋“œํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•จ. |

์Šคํƒ€์ผ

| ๊ตฌ๋ถ„ | ์ ์šฉ | ์˜ˆ์‹œ | | ------------- | -------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ | | ์ „์—ญ ์Šคํƒ€์ผ | _app.tsx์—์„œ import | ๊ฒฝ๋กœ ํ˜น์€ node_module์—์„œ ๊บผ๋‚ด๊ธฐ | | ์ปดํฌ๋„ŒํŠธ ๋ ˆ๋ฒจ | [name].module.css | Button์˜ className={style.alert}์˜ ํด๋ž˜์Šค๋Š” Button_alert__62TEJ | | SCSS, SASS | sass ์„ค์น˜ | $primary: blue; (๋ณ€์ˆ˜):export { // styels primary: $primary (๋ณ€์ˆ˜์˜ ๊ฐ’ ์‚ฌ์šฉ)} | | CSS-in-JS | styled-components, Emotion | styled-component๋ฅผ Next.js์—์„œ ์“ฐ๋ ค๋ฉด โ†’ ServerStyleSheet ํ•„์š” (getInitialProps, ์„œ๋ฒ„์—์„œ ์Šคํƒ€์ผ์„ ๋ฏธ๋ฆฌ ๋ชจ์•„์„œ ์ผ๊ด„ ์ ์šฉ/์ดˆ๊ธฐํ™”) |

[!CAUTION]
https://nextjs.org/docs/app/building-your-application/styling/css-in-js
๊ฒฝ๊ณ :ย ๋Ÿฐํƒ€์ž„ JavaScript๊ฐ€ ํ•„์š”ํ•œ CSS-in-JS ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ํ˜„์žฌ ์„œ๋ฒ„ ๊ตฌ์„ฑ ์š”์†Œ์—์„œ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ๊ณผ ๊ฐ™์€ ์ตœ์‹  React ๊ธฐ๋Šฅ๊ณผ ํ•จ๊ป˜ CSS-in-JS๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ย ๋™์‹œ ๋ Œ๋”๋ง์„ย ํฌํ•จํ•˜์—ฌ ์ตœ์‹  ๋ฒ„์ „์˜ React๋ฅผ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค..

์šฐ๋ฆฌ๋Š” ์—…์ŠคํŠธ๋ฆผ API์— ๋Œ€ํ•ด React ํŒ€๊ณผ ํ˜‘๋ ฅํ•˜์—ฌ React ์„œ๋ฒ„ ๊ตฌ์„ฑ ์š”์†Œ ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ์•„ํ‚คํ…์ฒ˜์— ๋Œ€ํ•œ ์ง€์›์„ ํ†ตํ•ด CSS ๋ฐ JavaScript ์ž์‚ฐ์„ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • styled-component๋Š” ํ”„๋กœ๋•์…˜ ๋ชจ๋“œ์—์„œ SPEEDY_MODE
    • CSSOM ํŠธ๋ฆฌ์— ์ง์ ‘ ์Šคํƒ€์ผ์„ ๋จน์ž„ (InsertRule)