2024-03-31.md

๐Ÿก

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

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


DIL-week4-7_2024-03-31

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

์˜ค๋Š˜ ์ฝ์€ ๋‚ด์šฉ์„ markdown์œผ๋กœ ๊ฐ„๋‹จํžˆ ๋ฉ”๋ชจ
์ฝ์€ ์‹œ๊ฐ„: ์ƒˆ๋ฒฝ ๊ณต๋ถ€


์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง์„ ์œ„ํ•œ ๋ฆฌ์•กํŠธ API ์•Œ์•„๋ณด๊ธฐ

  • ๋ฆฌ์•กํŠธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋žœ๋”๋งํ•  ์ˆ˜ ์žˆ๋Š” API
    • Node.js์™€ ๊ฐ™์€ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค
    • https://github.com/facebook/react/blob/main/packages/react-dom/server.node.js

1. renderToString

  • ์ธ์ˆ˜๋กœ ๋„˜๊ฒจ๋ฐ›์€ ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋žœ๋”๋งํ•ด HTML ๋ฌธ์ž์—ด๋กœ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
  • ์ตœ์ดˆ์˜ ํŽ˜์ด์ง€๋ฅผ HTML๋กœ ๋จผ์ € ๋žœ๋”๋ง
const result = ReactDOMServer.renderToString(
  React.createElement("div", { id: "root" }, <MyComponent />)
);

2. renderToStaticMarkup

  • renderToString๊ณผ ์œ ์‚ฌํ•œ ํ•จ์ˆ˜
  • ๋ฆฌ์•กํŠธ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ HTML ๋ฌธ์ž์—ด์„ ๋งŒ๋“ ๋‹ค
    • data-reactroot๊ณผ ๊ฐ™์€ ๋ฆฌ์•กํŠธ์—์„œ๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ถ”๊ฐ€์ ์ธ DOM ์†์„ฑ์„ ๋งŒ๋“ค์ง€ ์•Š๋Š”๋‹ค.
    • HTML์˜ ํฌ๊ธฐ๋ฅผ ์•ฝ๊ฐ„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค
  • ๋ธŒ๋ผ์šฐ์ € API๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๊ณ , hydrate์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ๋‚ด์šฉ์ด ๋งž์ง€ ์•Š๋Š” ์—๋Ÿฌ
    • hydrate์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฐ€์ •ํ•˜์— HTML์„ ๋ฐ˜ํ™˜ ๋ธ”๋กœ๊ทธ ๊ธ€, ์ƒํ’ˆ ์•ฝ๊ด€ ์ •๋ณด ๊ฐ™์€ ์•„๋ฌด๋Ÿฐ ์•ก์…˜์ด ์—†๋Š” ์ •์ ์ธ ๋‚ด์šฉ์„ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉ
const result = ReactDOMServer.renderToStaticMarkup(
  React.createElement("div", { id: "root" }, <MyComponent />)
);

3. renderToNodeStream

  • renderToString๊ณผ ๊ฒฐ๊ณผ๋ฌผ์ด ๋™์ผ
  • Node.js์— ์˜์กดํ•˜๊ณ  ์žˆ์–ด, ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅ
    • Node.js์˜ ReadableStream
    • ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด์ด์ง€๋งŒ, ๋งŒ๋“œ๋Š” ๊ณผ์ •์ด ๋ถˆ๊ฐ€๋Šฅ
  • utf-8์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ: Deno, Bun๊ณผ ๊ฐ™์€ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ŠคํŠธ๋ฆผ์ด๋ž€?
    • ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ, ๋ฐ์ดํ„ฐ๋ฅผ ์ฒญํฌ(chunk)๋กœ ๋ถ„ํ• ํ•ด ์กฐ๊ธˆ์”ฉ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐฉ์‹์„ ์˜๋ฏธ
  • ๋Œ€๋ถ€๋ถ„์˜ ๋ฆฌ์•กํŠธ ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋žœ๋”๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋Š” renderToNodeStream์„ ์ฑ„ํƒ

4. renderToStaticNodeStream

  • renderToNodeStrea๊ณผ ๊ฒฐ๊ณผ๋ฌผ์ด ๋™์ผ
    • ๋ฆฌ์•กํŠธ ์†์„ฑ์ด ์ œ๊ณต๋˜์ง€ ์•Š๋Š”, hydrate์„ ํ•  ํ•„์š”์—†๋Š” ์ˆœ์ˆ˜ HTML ๊ฒฐ๊ณผ๋ฌผ.

5. hydrate

  • HTML ์ฝ˜ํ…์ธ ์— ์ด๋ฒคํŠธ์™€ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ๋ถ™์ธ๋‹ค
  • render() ๋ฉ”์„œ๋“œ
    • create-react-app์œผ๋กœ ์ƒ์„ฑ๋œ index.js์—์„œ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค
    const rootElement = document.getElementById("root");
    React.render(<App />, rootElement);
    
  • hydrate()
    const element = document.getElementById(containerId); // ์„œ๋ฒ„์—์„œ ๋žœ๋”๋ง๋œ HTML์˜ ํŠน์ • ์œ„์น˜
    ReactDOM.hydrate(<App />, element);
    
    • ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜์—๋Š” ์ด๋ฏธ renderToString ๋“ฑ์œผ๋กœ ๋žœ๋”๋ง๋œ ์ •์  HTML ์ •๋ณด๊ฐ€ ๋‹ด๊ฒจ ์žˆ์–ด์•ผ ํ•œ๋‹ค.
    • ๋‹ด๊ฒจ์žˆ์ง€ ์•Š๋‹ค๋ฉด ๋ถˆ์ผ์น˜ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๊ณ , hydrate๊ฐ€ ๋žœ๋”๋งํ•œ ๊ธฐ์ค€์œผ๋กœ ์›น ํŽ˜์ด์ง€๋ฅผ ๊ทธ๋ฆฌ๋Š” ๋ฐ, ์‚ฌ์‹ค์ƒ ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์—์„œ ๋‘ ๋ฒˆ ๋žœ๋”๋ง์„ ํ•˜๊ฒŒ ๋œ๋‹ค.
    • ๋ถˆ๊ฐ€ํ”ผํ•œ ๊ฒฝ์šฐ (ms๊ฐ’ ์‚ฌ์šฉ ๋“ฑ) suppressHydrationWarning์„ ์ถ”๊ฐ€ํ•ด ๊ฒฝ๊ณ ๋ฅผ ๋Œ ์ˆ˜ ์žˆ๋‹ค.