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์ ๊ธฐ๋ฐ์ผ๋ก HTML ์์ฑ
- 2๋ฅผ ํด๋ผ์ด์ธํธ์ ์ ๋ฌ
- 3์ ๋ฐํ์ผ๋ก hydrate (DOM์ ๋ฆฌ์กํธ ๋ผ์ดํ ์ฌ์ดํด๊ณผ ์ด๋ฒคํธ ํธ๋ค๋ฌ ์ถ๊ฐ)
- 4์ hydrate์ ํตํด ๋ง๋ ๋ฆฌ์กํธ ์ปดํฌ๋ํธ ํธ๋ฆฌ์, ์๋ฒ์์ ๋ง๋ HTML์ด ๋ค๋ฅด๋ฉด ๋ถ์ผ์น ์๋ฌ
- suppressHydrationWarning
- 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)