๋ณธ๋ฌธ์œผ๋กœ ๊ฑด๋„ˆ๋›ฐ๊ธฐ

201110

ยท ์•ฝ 12๋ถ„

๋ชจ๋ฐ”์ผ ์‚ฌํŒŒ๋ฆฌ ๋””๋ฒ„๊น…#

  • ์•„์ดํฐ์„ ๋งฅ๋ถ์— ์—ฐ๊ฒฐํ•œ๋‹ค.

  • ์•„์ดํฐ์—์„œ ๋””๋ฒ„๊น…ํ•˜๊ณ ์ž ํ•˜๋Š” ์›นํŽ˜์ด์ง€๋ฅผ Safari์— ๋„์šด๋‹ค.

  • ๋งฅ๋ถ์—์„œ Safari๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

  • ๊ฐœ๋ฐœ์ž์šฉ > iPhone > Safari ์›น ํŽ˜์ด์ง€ ์„ ํƒ

    2020-11-10-201110-image-0

  • ์š”์†Œ, ์ฝ˜์†”, ์†Œ์Šค, ๋„คํŠธ์›Œํฌ ๋“ฑ ์‚ฌํŒŒ๋ฆฌ์˜ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ๋กœ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์žˆ๋‹ค.

    2020-11-10-201110-image-1

Debugging Your iPhone Mobile Web App With Safari Dev Tools

๋ชจ๋ฐ”์ผ ์‚ฌํŒŒ๋ฆฌ๋ฅผ ๋งฅ์˜ Chrome์—์„œ ๋””๋ฒ„๊น…ํ•˜๊ธฐ#

๋ชจ๋ฐ”์ผ Safari๋ฅผ ๋งฅ์˜ Chrome์—์„œ ๋””๋ฒ„๊น…ํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์— ์•Œ์•„๋ด์•ผ๊ฒ ๋‹ค.

Jon Sadka - How to debug an issue in Chrome for iOS using remote debugging

๋ฆฌ์•กํŠธ#

  • ๋ฆฌ์•กํŠธ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—˜๋ฆฌ๋จผํŠธ๋“ค์„ ํŠธ๋ฆฌ ํ˜•ํƒœ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ํ‘œํ˜„ํ•œ๋‹ค.

  • ์ด๋ฅผ Virtual-DOM์œผ๋กœ ๋ถ€๋ฅด๋Š”๋ฐ, ์ด๋Š” JavaScript ์ผ๋ฐ˜ ๊ฐ์ฒด์ด๋‹ค. (Plain Object)

  • ๊ธฐ์กด VanillaJS๋Š” UI๋ฅผ ๋ช…๋ นํ˜•์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•˜์ง€๋งŒ, React๋Š” ์„ ์–ธํ˜•์œผ๋กœ UI๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ#

  • ์ปดํฌ๋„ŒํŠธ๋Š” ๋‚ด๋ถ€์—์„œ ๊ด€๋ฆฌํ•˜๋Š” ์ƒํƒœ ๊ฐ’์ธ state ์™€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋‚ด๋ ค ์ฃผ๋Š”์†์„ฑ ๊ฐ’ props ๋ฅผ ๊ฐ€์ง„๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๋Š” state , props ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด render() ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜์–ด ํ™”๋ฉด์„ ๊ฐฑ์‹ ํ•œ๋‹ค.

  • UI ๋ฐ์ดํ„ฐ(์ƒํƒœ๊ฐ’๊ณผ ์†์„ฑ๊ฐ’)๋กœ ๋ทฐ๋ฅผ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ์ด๋‹ค.

  • setState ๋Š” ๋น„๋™๊ธฐ๋กœ ๋™์ž‘ํ•œ๋‹ค.

๋ฆฌ์•กํŠธ์˜ ๋ Œ๋”๋ง ๊ณผ์ •#

  • ์ปดํฌ๋„ŒํŠธ์˜ Props๋‚˜ State์˜ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ, ์ปดํฌ๋„ŒํŠธ์˜ ์ด์ „ ์ƒํƒœ ์—˜๋ฆฌ๋จผํŠธ์™€ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋น„๊ตํ•˜๊ณ  ์‹ค์ œ DOM์˜ ์—…๋ฐ์ดํŠธ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๋น„๊ตํ•˜์—ฌ์ฐพ์€ ๋ณ€๊ฒฝ ์ ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฐฑ์‹ ํ•œ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ์˜ setState ๋ฉ”์„œ๋“œ๊ฐ€ ์ˆ˜ํ–‰๋˜๋ฉด, ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๋ฅผ Dirty ์ฒดํฌํ•˜๊ณ , ๋‹ค์Œ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ๋ฐฐ์น˜ ์ž‘์—…์œผ๋กœ ๋Œ€์ƒ ์ปดํฌ๋„ŒํŠธ๋“ค์˜ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ๋ Œ๋”๋งํ•œ๋‹ค. (๋น„๋™๊ธฐ )

  • ์ด๋Ÿฌํ•œ ๋ฆฌ์•กํŠธ์˜ ๋ Œ๋”๋ง ๊ณผ์ •์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ชผ๊ฐค ์ˆ˜ ์žˆ๋‹ค.

    • ๋ณ€๊ฒฝ ์ ์„ ์ฐพ๋Š” Reconciliation์˜ Diffing ์•Œ๊ณ ๋ฆฌ์ฆ˜ (render or reconciliation phase)

    • ๋ณ€๊ฒฝ ์ ์„ ์‹ค์ œ UI์— ์ ์šฉํ•˜๋Š” ReactDOMComponent.updateComponent (commit phase)

Reconciliation: The diffing algorithm#

Reconciliation์€ ์–ด๋–ค ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ ์ „/ํ›„ ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ๋น„๊ต(Diff)ํ•˜์—ฌ, ๊ฐฑ์‹ ์ดํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ์„ ์ฐพ์•„ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ธŒ๋ผ์šฐ์ €์˜ DOM ์กฐ์ž‘์„์ตœ์†Œํ™”์‹œํ‚จ๋‹ค.

๋‹ค์‹œ ์ •๋ฆฌ

  • render() ์—์„œ ์ƒˆ๋กœ์šด ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ๋ฅผ ์ƒ์„ฑ

  • ์ด์ „ ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ์™€ ๋น„๊ตํ•˜์—ฌ ๋ณ€๊ฒฝ ์ ์„ ์ฐพ์•„ ์—…๋ฐ์ดํŠธ

๊ทธ๋Ÿฐ๋ฐ Diff ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ O(n^3)์˜ ์‹œ๊ฐ„๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ๋‹ค์Œ์˜ ๋ฐฉ๋ฒ•์œผ๋กœ O(n)์— ๊ทผ์‚ฌํ•œ ํœด๋ฆฌ์Šคํ‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•˜์˜€๋‹ค.

  • ๋‹ค๋ฅธ ํƒ€์ž…์˜ ๋‘ ์—˜๋ฆฌ๋จผํŠธ๋Š” ๋‹ค๋ฅธ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๊ฒƒ์ด๋‹ค.

  • ๊ฐ™์€ ๋ ˆ๋ฒจ์˜ ์—˜๋ฆฌ๋จผํŠธ์— key ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•„์•ผ ํ•  ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ํ‘œ์‹œํ•œ๋‹ค.

โ˜ ํœด๋ฆฌ์Šคํ‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ์ง๊ด€์— ์˜์กดํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜. ์ฆ‰ ํœด๋ฆฌ์Šคํ‹ฑ์€ ๋ณดํ†ต ํ•ฉ๋ฆฌ์ ์ธ์‹คํ–‰ ์‹œ๊ฐ„์„ ๊ฐ€์ง€์ง€๋งŒ ๊ทธ๊ฒƒ์ด ํ•ญ์ƒ ๊ทธ๋ ‡๋‹ค๋Š” ์–ด๋– ํ•œ ์ถ”๋ก  ๊ณผ์ •์ด๋‚˜ ์ฆ๋ช…์ด ์—†๋‹ค.

๊ฐ™์€ ์œ„์น˜์—์„œ ์—˜๋ฆฌ๋จผํŠธ์˜ ํƒ€์ž…์ด ๋‹ค๋ฅธ ๊ฒฝ์šฐ

  1. ๊ธฐ์กด ํŠธ๋ฆฌ๋ฅผ ์ œ๊ฑฐ ํ›„ ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.

  2. ๊ธฐ์กด ํŠธ๋ฆฌ ์ œ๊ฑฐ ์‹œ ํŠธ๋ฆฌ ๋‚ด๋ถ€(ํ•˜์œ„)์˜ ์—˜๋ฆฌ๋จผํŠธ/์ปดํฌ๋„ŒํŠธ๋“ค์€ ๋ชจ๋‘ ์ œ๊ฑฐํ•œ๋‹ค. (์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ ์ œ๊ฑฐ๋˜๋ฉด์„œ componentWillUnmount() ๊ฐ€ ์‹คํ–‰๋จ.) ์ด์ „ ํŠธ๋ฆฌ์˜ ๋ชจ๋“  state๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค.

  3. ์ƒˆ๋กœ์šด ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ค ๋•Œ ๋‚ด๋ถ€ ์—˜๋ฆฌ๋จผํŠธ/์ปดํฌ๋„ŒํŠธ๋“ค๋„ ๋ชจ๋‘ ์ƒˆ๋กœ ๋งŒ๋“ ๋‹ค. (์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ componentDidMount() ๊ฐ€ ์‹คํ–‰๋จ.)

๊ฐ™์€ ์œ„์น˜์—์„œ ์—˜๋ฆฌ๋จผํŠธ์˜ ํƒ€์ž…์ด ๊ฐ™์€ ๊ฒฝ์šฐ

  1. ์—˜๋ฆฌ๋จผํŠธ์˜ attributes ๋ฅผ ๋น„๊ตํ•œ๋‹ค.

  2. ๋ณ€๊ฒฝ๋œ attributes ๋งŒ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

  3. ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋“ค์— diff ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•œ๋‹ค.

๊ฐ™์€ ์œ„์น˜์—์„œ ์—˜๋ฆฌ๋จผํŠธ๊ฐ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ๊ทธ ํƒ€์ž…์ด ๊ฐ™์€ ๊ฒฝ์šฐ

  1. ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค ์ž์ฒด๋Š” ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค. (state๊ฐ€ ์œ ์ง€๋œ๋‹ค.)

  2. ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค์˜ ์—…๋ฐ์ดํŠธ ์ „ ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ ๋“ค์ด ํ˜ธ์ถœ๋˜๋ฉฐ props๊ฐ€ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.

  3. render() ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์ปดํฌ๋„ŒํŠธ์˜ ์ด์ „ ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ์™€ ๋‹ค์Œ ์—˜๋ฆฌ๋จผํŠธ ํŠธ๋ฆฌ์—๋Œ€ํ•ด diff ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์žฌ๊ท€์ ์œผ๋กœ ์ ์šฉํ•œ๋‹ค.

์ž์‹ ์—˜๋ฆฌ๋จผํŠธ ์žฌ๊ท€

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

  • ์ •๋ ฌ๊ณผ ๊ฐ™์€ ์ƒํ™ฉ์— ์ทจ์•ฝํ•˜๋‹ค.

keys

  • ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์ž์‹ ์—˜๋ฆฌ๋จผํŠธ๋“ค์ด key๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด key๋ฅผ ํ†ตํ•ด ๊ธฐ์กด ํŠธ๋ฆฌ์™€ ์ดํ›„ ํŠธ๋ฆฌ์˜ ์ž์‹ ๋“ค์ด ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.

Avoid Reconciliation#

  • ์ปดํฌ๋„ŒํŠธ์˜ ๋ถˆํ•„์š”ํ•œ ๋ Œ๋”๋ง์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

    • ShouldComponentUpdate ํ•จ์ˆ˜๊ฐ€ return false ํ•˜๋„๋ก ํ•œ๋‹ค.

    • ์ปดํฌ๋„ŒํŠธ๊ฐ€ PureComponent ๋ฅผ ์ƒ์†๋ฐ›๋„๋ก ํ•œ๋‹ค.

    • ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ๋ฅผ React.memo() ๋กœ ๊ฐ์‹ธ์„œ export ํ•œ๋‹ค.

โ˜ ํ•ต์‹ฌ์€ ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ state , props ๊ฐ€ ๋ณ€๊ฒฝ ๋˜์—ˆ์„ ๋•Œ๋งŒ ๋ Œ๋”๋งํ•˜๋„๋กํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ์€ ๋ฆฌ์•กํŠธ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๋ฉ”๋ชจ์ด์ง•ํ•˜๋Š”๊ฒƒ์ด๋‹ค.

๊ฐ€์žฅ ์ข‹์€ ์ผ€์ด์Šค๋Š” ๊ฐ™์€ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์— ์˜ํ•ด ๊ฐ™์€ props ๋กœ ์ž์ฃผ ๋ Œ๋”๋ง ๋ ๋•Œ์ด๋‹ค. ์ด์ „ ๋ฉ”๋ชจ์ด์ง• ๊ฒฐ๊ณผ์™€ props ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๋‚ด๋ถ€๋ฅผ ๋น„๊ตํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ์ด์ง•๋œ๊ฒฐ๊ณผ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ๋ฐ˜๋Œ€๋กœ props ๊ฐ€ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ๋Œ€๋ถ€๋ถ„์ด๋ผ๋ฉด, ์ด์ „ props ์™€ ๋‹ค์Œ props ๋น„๊ต๋ฅผ ํ•˜๊ณ , ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ props ๋น„๊ต๋ฅผ ํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋˜ํ•œ ๋ฉ”๋ชจ์ด์ง•์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚จ์šฉํ•ด์„  ์•ˆ๋œ๋‹ค.

์ฒ˜์Œ๋ถ€ํ„ฐ ์„ฑ๋Šฅ์— ์ตœ์ ํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ ์ž์ฒด๊ฐ€ ๋น„ํšจ์œจ์ ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ์ ˆํžˆ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์€ ์ค‘์š”ํ•˜๋‹ค. ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ ์ ˆํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ด์Šˆ๋ฅผ๋น ๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๊ณ  ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด ์ „๋žต์ด๋‹ค.

UI ๋Ÿฐํƒ€์ž„์œผ๋กœ์„œ์˜ React

์žฌ์กฐ์ • (Reconciliation) - React

์„ฑ๋Šฅ ์ตœ์ ํ™” - React

React ๋ Œ๋”๋ง๊ณผ ์„ฑ๋Šฅ ์•Œ์•„๋ณด๊ธฐ : TOAST Meetup

React.memo() ํ˜„๋ช…ํ•˜๊ฒŒ ์‚ฌ์šฉํ•˜๊ธฐ

๋ฆฌ์•กํŠธ ํ›…(Hook)#

ํ›…(Hook)์ด๋ž€?#

  • ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์—์„œ React state๋ฅผ ์—ฐ๋™(hook into)ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜.

  • ์ฆ‰ ์ƒํƒœ๋ฅผ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ์— ๋™๊ธฐํ™” ํ•ด์ค€๋‹ค. (์ด ๋ง์€ ์ƒํƒœ๊ฐ€ ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ ์™ธ๋ถ€์—์„œ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ๋‹ค๋Š” ์˜๋ฏธ๋ฅผ ๋‚ดํฌํ•จ.)

๋™๊ธฐ#

  • ์ปดํฌ๋„ŒํŠธ ์‚ฌ์ด์—์„œ ์ƒํƒœ์™€ ๊ด€๋ จ๋œ ๋กœ์ง์„ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๋‹ค.

    • render props, HOC์™€ ๊ฐ™์€ ํŒจํ„ด์€ ๋ž˜ํผ๋ฅผ ๊นŠ๊ฒŒ ๋งŒ๋“ ๋‹ค.
  • ๋ผ์ดํ”„์‚ฌ์ดํด ๋ฉ”์„œ๋“œ ๋“ค์ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ณต์žกํ•˜๊ณ  ์ดํ•ดํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ ๋‹ค.

  • ํด๋ž˜์Šค๋ณด๋‹ค ํ•จ์ˆ˜๊ฐ€ ์ง๊ด€์ ์ด๋‹ค. this ๋ฐ”์ธ๋”ฉ


ํ›…์˜ ๊ทœ์น™#

โ˜ ๋ฆฌ์•กํŠธ๋Š” ํ›…์ด ํ˜ธ์ถœ๋˜๋Š” ์ˆœ์„œ์— ์˜์กดํ•œ๋‹ค. (์ƒํƒœ๋ฅผ ์‹๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ ์ˆœ์„œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.)

  • ์ตœ์ƒ์œ„(at the Top Level)์—์„œ๋งŒ ํ›…์„ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. (๋ฐ˜๋ณต๋ฌธ, ์กฐ๊ฑด๋ฌธ, ์ค‘์ฒฉ๋œ ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•˜์ง€ ๋ง๋ผ)

    // ๐Ÿ”ด ์กฐ๊ฑด๋ฌธ์— Hook์„ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ฒซ ๋ฒˆ์งธ ๊ทœ์น™์„ ๊นผ์Šต๋‹ˆ๋‹คif (name !== '') {    useEffect(function persistForm() {        localStorage.setItem('formData', name);    });}
  • ์˜ค์ง React ํ•จ์ˆ˜ ๋‚ด์—์„œ Hook์„ ํ˜ธ์ถœํ•ด์•ผ ํ•œ๋‹ค. (์ผ๋ฐ˜ JS ํ•จ์ˆ˜์—์„œ ํ˜ธ์ถœํ•˜์ง€ ๋ง๋ผ)

โ˜ ๋ฆฌ์•กํŠธ์˜ ํ›…์€ ๋ Œ๋”๋ง ๋˜๋Š” ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ํ•œ ์ˆ˜์ค€ ์œ„์˜ ์™ธ๋ถ€ ๊ณต๊ฐ„(์‹คํ–‰ ์ปจํ…์ŠคํŠธ)์— ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ(๋ฐฐ์—ด)ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋Š” ๋ฐ์ดํ„ฐ( state , setter )์ด๋‹ค. ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์™€ ๊ณต์œ ๋˜์ง€ ์•Š๊ณ , ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ์ปดํฌ๋„ŒํŠธ์—์„œ ์—‘์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋‹ค.

useState#

useState์—์„œ ๋ฐ˜ํ™˜๋œ setter ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด, React์—๊ฒŒ ๋‚ด๋ถ€์ ์œผ๋กœ ์•ก์…˜์„ dispatch ํ•˜๊ฒŒ ๋˜๊ณ , ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ new state๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ์—…๋ฐ์ดํŠธ ํ•ด์•ผ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๋ฆฐ๋‹ค.

React hooks: not magic, just arrays

useEffect#

  • ๋ Œ๋”๋ง ์ดํ›„(DOM ์—…๋ฐ์ดํŠธ ํ›„)์— ์ˆ˜ํ–‰ํ•  "side effect"๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

Fiber#

  • virtualDOM์˜ ์ฆ๋ถ„ ๋ Œ๋”๋ง์„ ํ™œ์„ฑํ™”ํ•˜๊ธฐ ์œ„ํ•จ.

  • requestIdleCallback ์„ ํ™œ์šฉ.

  • ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์— ๋Œ€ํ•œ ์ถ”๊ฐ€ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ธฐ ์œ„ํ•œ ๋‚ด๋ถ€ ๊ฐ์ฒด

  • ๋‚ด์žฅ ์Šคํƒ์— ์˜์กดํ•œ ๋™๊ธฐ์‹ ์žฌ๊ท€ ๋ชจ๋ธ์—์„œ ๋งํฌ๋“œ ๋ฆฌ์ŠคํŠธ์™€ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋Š” ๋น„๋™๊ธฐ์‹๋ชจ๋ธ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์žฌ๊ตฌํ˜„ํ•จ.

    • ํ˜ธ์ถœ ์Šคํƒ์„ ๋งˆ์Œ๋Œ€๋กœ ์ค‘๋‹จํ•˜๊ณ  ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ˆ˜๋™์œผ๋กœ ์กฐ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด

React Fiber Architecture - A Deep Dive