[TIL] 0605 | React with Redux, Next.js, TypeScript

Teasanยท2022๋…„ 6์›” 5์ผ
0

TIL

๋ชฉ๋ก ๋ณด๊ธฐ
1/36
post-thumbnail

๋ชฉ์ฐจ

  • ๋ฆฌ์•กํŠธ๊ฐ€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹
  • ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹คํ–‰ ๊ณผ์ •
  • ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ธฐ

โœง ๋ฆฌ์•กํŠธ๊ฐ€ ์‹ค์ œ๋กœ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹

  • ๋ฆฌ์•กํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์ž‘๋™๋˜๋Š” ๊ฑธ๊นŒ? ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๊ฐ€ ๋ฆฌ์•กํŠธ์— ๋Œ€ํ•ด ํ•™์Šตํ•œ ๋ฐ”๋กœ๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค ๊ตฌ์ถ•์„ ์œ„ํ•œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ผ์ปฌ์œผ๋ฉฐ, ๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ์€ ์ปดํฌ๋„ŒํŠธ๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•ด์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ๋ฆฌ์•กํŠธ๋Š” ์ด ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋…์„ ์ฑ„ํƒํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ๊ตฌ์„ฑํ•˜๋ฉฐ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ์—…๋ฐ์ดํŠธ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ ๊ฐœ๋…์ด ๋“ฑ์žฅํ•˜๋Š”๋ฐ, ๋ฐ”๋กœ ๋ฆฌ์•กํŠธ DOM ์ด๋ž€ ๊ฐœ๋…์ด๋‹ค.

ReactDOM

  • ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜์ž๋ฉด, ReactDOM ์€ ์›น์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด React ์ž์ฒด๋Š” ์›น์— ๋Œ€ํ•ด์„œ ์ž˜ ์•Œ์ง€ ๋ชปํ•œ๋‹ค. ์ฆ‰ ๋ธŒ๋ผ์šฐ์ €์™€ ์ „ํ˜€ ๊ด€๊ณ„๊ฐ€ ์—†๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ผ๋Š” ์ด์•ผ๊ธฐ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ์–ด๋–ป๊ฒŒ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค๋ฃจ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์ปดํฌ๋„ŒํŠธ์— HTML ์š”์†Œ๋“ค์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ˜น์€ ํ—ˆ๊ตฌ์ ์ธ ์š”์†Œ๋“ค์ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ๋Š” ์ „ํ˜€ ์•Œ์ง€ ๋ชปํ•œ๋‹ค. ์ด๋Š” ReactDOM์˜ ์—ญํ• ์ด ์‹ค์ œ HTML ์š”์†Œ๋“ค์„ ํ™”๋ฉด์— ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด๋ผ๋Š” ์ด์•ผ๊ธฐ์ด๊ธฐ๋„ ํ•˜๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ๊ทธ์ € ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์ƒํƒœ(state) ๊ฐ์ฒด๋ฅผ ๊ด€๋ฆฌํ•˜๋ฉฐ ๋‹ค๋ฅธ ๊ฐ์ฒด์˜ ์ƒํƒœ(state)์™€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋˜์–ด ๋ชจ๋“  ์ •๋ณด๋“ค์„ (ํ˜„์žฌ ์‚ฌ์šฉ์ค‘์ธ) ์ธํ„ฐํŽ˜์ด์Šค์— ์ „๋‹ฌํ•  ๋ฟ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ธํ„ฐํŽ˜์ด์Šค๋ž€ ReactDOM ๊ฐ™์€ ๊ฒƒ์„ ๋งํ•œ๋‹ค. ์ด๋ ‡๋“ฏ, ReactDOM ์€ ๋ธŒ๋ผ์šฐ์ €์˜ ์ผ๋ถ€์ธ ์‹ค์ œ DOM์— ๋Œ€ํ•œ ์ž‘์—…์„ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๊ณ  ์žˆ๋Š” ํ™”๋ฉด์— ๋ฌด์–ธ๊ฐ€๋ฅผ ํ‘œ์‹œํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

๋ฆฌ์•กํŠธ๊ฐ€ ๊ณ ๋ คํ•˜๊ฑฐ๋‚˜ ์‹ ๊ฒฝ์“ฐ๋Š” ๊ฒƒ๋“ค(๋ฆฌ์•กํŠธ์˜ ํ•ต์‹ฌ๊ธฐ๋Šฅ)

  • ๋ฆฌ์•กํŠธ๋Š” ํ•ต์‹ฌ ๊ธฐ๋Šฅ(์ปดํฌ๋„ŒํŠธ, props, ์ƒํƒœ(state), context ๋“ฑ)๋งŒ์„ ๋‹ค๋ฃฌ๋‹ค. ์ฆ‰ ๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ๋งŒ ์‹ ๊ฒฝ์“ด๋‹ค๋Š” ์˜๋ฏธ์ด๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์ธ props๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.
    • ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์˜ ๋ฐ์ดํ„ฐ์ธ ์ƒํƒœ(state)๋ฅผ ๊ด€๋ฆฌํ•œ๋‹ค.

      props๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๊ตฌ์„ฑ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ด์ฃผ๋ฉฐ ๋ถ€๋ชจ-์ž์‹ ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ํ†ต์‹ ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” ์—ญํ• ์ด๋‹ค.

    • ์ปดํฌ๋„ŒํŠธ ์ „์ฒด(์ „์—ญ) ๋ฐ์ดํ„ฐ์ธ ์ปจํ…์ŠคํŠธ(context)๋„ ๊ด€๋ฆฌํ•œ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” props ์™€ ์ƒํƒœ(state) ๋˜๋Š” ์ปจํ…์ŠคํŠธ(context)๊ฐ€ ๋ณ€๊ฒฝ์ด ๋˜๋ฉด, ์ปดํฌ๋„ŒํŠธ ์—ญ์‹œ ๋ฆฌ์•กํŠธ๋ฅผ ํ†ตํ•ด์„œ ๋ณ€๊ฒฝ๋˜๋ฉฐ ๋ฆฌ์•กํŠธ๋Š” ์ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ํ™”๋ฉด์— ์ƒˆ๋กœ์šด ๊ฒƒ์„ ํ‘œ์‹œํ•˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ํ™•์ธํ•œ๋‹ค. ํ™”๋ฉด์— ๋ญ”๊ฐ€๋ฅผ ๊ทธ๋ฆฌ๋ ค๊ณ  ํ•œ๋‹ค๋ฉด ๋ฆฌ์•กํŠธ๋Š” ReactDOM ์—๊ฒŒ ์ด๋Ÿฐ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด์„œ ReactDOM ์ด ์—…๋ฐ์ดํŠธ๋œ ํ™”๋ฉด์„ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ค€๋‹ค.

์ปดํฌ๋„ŒํŠธ์™€ ์‹ค์ œ DOM๊ณผ์˜ ํ†ต์‹ ์€ ์–ด๋–ป๊ฒŒ ์ž‘๋™๋˜๊ณ  ์žˆ๋Š” ๊ฑธ๊นŒ?

  • ์ตœ์ข…์ ์œผ๋กœ ๋ฆฌ์•กํŠธ๊ฐ€ ๋‹ด๋‹นํ•˜๋Š” ์—ญํ• ์ด๋ž€ ๊ฐ€์ƒ(Virtual)์˜ DOM ์ด๋ผ๋Š” ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

React์˜ ๊ฐ€์ƒ(Virtual) DOM

  • ๋ฆฌ์•กํŠธ์˜ ๊ฐ€์ƒ DOM ์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋งˆ์ง€๋ง‰์— ๋งŒ๋“ค์–ด๋‚ด๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ํŠธ๋ฆฌ๋ฅผ ๊ฒฐ์ •ํ•œ๋‹ค. ๊ฐ๊ฐ์˜ ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋“ค์€ JSX ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ, ์ด ๊ฐ€์ƒ DOM์€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ํ˜„์žฌ ๋ชจ์–‘๊ณผ ์ตœ์ข… ๋ชจ์–‘์„ ๊ฒฐ์ • ์ง“๋Š”๋‹ค. ๊ฐ€๋ น, ์ƒํƒœ(state)๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์ด ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ •๋ณด๋Š” ReactDOM ์œผ๋กœ ์ „๋‹ฌ๋˜์–ด ์—…๋ฐ์ดํŠธ ์ด์ „๊ณผ ์ดํ›„(๊ฐฑ์‹  ์ดํ›„)์˜ ์ƒํƒœ(state) ์ฐจ์ด๋ฅผ ์ธ์‹ํ•˜๊ณ  ๋ฆฌ์•กํŠธ๊ฐ€ ์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ๊ตฌ์„ฑํ•œ ๊ฐ€์ƒ์˜ ์Šค๋ƒ…์ƒท์ธ ๊ฐ€์ƒDOM ๊ณผ ์ผ์น˜ํ•˜๋„๋ก ์‹ค์ œ DOM์„ ์กฐ์ž‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

  • ์•ž์„œ ์—ฌ๋Ÿฌ๋ฒˆ ๊ฑฐ๋ก ํ–ˆ๋‹ค์‹œํ”ผ ๋ฆฌ์•กํŠธ๋Š” ์ƒํƒœ(state)๋‚˜ props, ์ปจํ…์ŠคํŠธ(context) ๊ทธ๋ฆฌ๊ณ  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ์ž์ฒด๊ฐ€ ์žฌ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฆฌ์•กํŠธ๋Š” ๋‹ค์‹œ ๋ Œ๋”๋ง์„ ํ•ด์ค€๋‹ค. ํ•˜์ง€๋งŒ ์ด ๋ Œ๋”๋ง์ด ์‹ค์ œ DOM ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹˜์„ ๋ช…์‹ฌํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ฆฌ์•กํŠธ์— ์˜ํ•ด ์ž๋™์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๊ฐ€ ์žฌ์‹คํ–‰๋œ๋‹ค๊ณ  ํ•ด์„œ ์‹ค์ œ DOM์˜ ๊ฐ ๋ถ€๋ถ„๋“ค์ด ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋ผ๋Š” ์˜๋ฏธ์ด๋‹ค. ์žฌ์‹คํ–‰๊ณผ ๋ Œ๋”๋ง์„ ๋‹ค๋ฃฐ ๋•Œ ์ปดํฌ๋„ŒํŠธ ๋ถ€๋ถ„๊ณผ ๋ฆฌ์•กํŠธ ๋ถ€๋ถ„, ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ ์—…๋ฐ์ดํŠธ ๋˜๋Š” DOM(ํŠธ๋ฆฌ)๋ฅผ ๊ตฌ๋ถ„ํ•ด์„œ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒํƒœ, props, ์ปจ๋ฑ์ŠคํŠธ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค์‹œ ๋ Œ๋”๋ง์ด ๋˜์–ด๋„ ์‹ค์ œ DOM ์€ React๊ฐ€ ๊ตฌ์„ฑํ•œ ์ปดํฌ๋„ŒํŠธ์˜ ์ด์ „ ์ƒํƒœ์™€ ํ˜„์žฌ ์ƒํƒœ์˜ ์‹ค์งˆ์ ์ธ ์ฐจ์ด์ ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์งˆ์ ์œผ๋กœ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๋ถ€๋ถ„์ด ์žˆ์„ ๋•Œ๋งŒ ๋ณ€๊ฒฝ-์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ค€๋‹ค. ์ฆ‰, ์‹ค์ œ DOM ์€ ๊ฐ€์ƒ์˜ DOM ๊ณผ ๋น„๊ตํ•˜์—ฌ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  'ํŒ๋‹จ'์ด ๋  ๋•Œ์—๋งŒ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ด์ค€๋‹ค๋Š” ๋œป์ด๋‹ค.

React์˜ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋ฒ„์ธ„์–ผ ๋”์€ ์–ด๋–ค ์—ญํ• ์„ ํ• ๊นŒ?

  • React๊ฐ€ ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ ๋ฉ”๋ชจ๋ฆฌ์— ๊ฐ€์ƒ DOM์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋ฌด์—‡์„ ์˜๋ฏธํ• ๊นŒ? ๋งค๋ฒˆ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•  ๋•Œ๋งˆ๋‹ค ๋ฆฌ๋กœ๋“œ๋ฅผ ํ•˜๊ณ , ์‹ค์ œ DOM์„ ์‚ฌ์šฉํ•ด์„œ ๋ธŒ๋ผ์šฐ์ €์— ์ง์ ‘ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ ์ธก๋ฉด์—์„œ ๋งŽ์€ ์ž์›์ด ํ•„์š”ํ•˜๊ฒŒ ๋œ๋‹ค. ์‹ค์ œ DOM ์„ ์ด์šฉํ•˜๋Š” ์ž‘์—…์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ฑ๋Šฅ์— ๊ณผ๋ถ€ํ™”๋ฅผ ์ผ์œผํ‚ฌ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ํ•˜์ง€๋งŒ ์ด์ „๊ณผ ํ˜„์žฌ์˜ ์ƒํƒœ๋ฅผ ๊ฐ€์ƒ DOM์„ ์‚ฌ์šฉํ•ด์„œ ๋น„๊ต-๊ณ„์‚ฐํ•˜์—ฌ ๋ Œ๋”๋งํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ฐ„ํŽธํ•˜๊ธฐ๋„ ํ•˜๊ฑฐ๋‹ˆ์™€, ์ž์›๋„ ์ ๊ฒŒ ๋“ ๋‹ค. ์ฆ‰ ์„ฑ๋Šฅ ๋ฉด์—์„œ ์šฐ์ˆ˜ํ•œ ํผํฌ๋จผ์Šค๋ฅผ ๋ณด์—ฌ์ค„ ์ˆ˜ ์žˆ๋‹ค.
  • ์ด๋ ‡๊ฒŒ ๋ฆฌ์•กํŠธ๋Š” ๊ฐ€์ƒ DOM ๊ณผ ์‹ค์ œ DOM ์˜ ๋น„๊ต๋ฅผ ํ†ตํ•ด ์ตœ์ข… ์Šค๋ƒ…์ƒท๊ณผ ํ˜„์žฌ์˜ ์Šค๋ƒ…์ƒท์„ ์‹ค์ œ DOM์— ์ „๋‹ฌํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ๊ฐ€์ƒ DOM์„ ํ†ตํ•ด 2๊ฐœ์˜ ์Šค๋ƒ…์ƒท(์ตœ์ข… ์Šค๋ƒ…์ƒท, ํ˜„์žฌ์˜ ์Šค๋ƒ…์ƒท) ๊ฐ„์˜ ์ฐจ์ด์ ์„ ์•Œ์•„๋‚ด๊ณ  ์‹ค์ œ DOM์— ๋ Œ๋”๋งํ•˜๋Š” ๋ฐฉ์‹ ๋ง์ด๋‹ค. ๊ทธ๋ž˜๋„ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ์˜ˆ์‹œ ์ฝ”๋“œ๋ฅผ ํ†ตํ•ด ๋น„๊ตํ•˜์—ฌ ์ดํ•ดํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
<div>
  <h1>Hi there!</h1>
</div>
  • ๋จผ์ € ์œ„์˜ ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋Š” ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋‹ด์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์‹คํ–‰ํ•œ ์‹œ์ ์˜ ์ตœ์ข… ์Šค๋ƒ…์ƒท ์ƒํƒœ๋ผ๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์„œ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด, ์ƒˆ๋กœ์šด ๋ฌธ์žฅ์„ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ˆ˜์ •ํ•ด๋ณด์ž.
<div>
  <h1>Hi there!</h1>
  <p>This is New!</p>
</div>
  • ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ์™€ ๋น„๊ตํ•ด๋ณด๋ฉด, <h1> ํƒœ๊ทธ ๋ฐ‘์— ์ƒˆ๋กœ์šด <p> ํƒœ๊ทธ๊ฐ€ ์ถ”๊ฐ€๋œ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ์ด ๋‘๊ฐœ์˜ ์Šค๋ƒ…์ƒท(์ตœ์ข… ์Šค๋ƒ…์ƒท, ํ˜„์žฌ ์Šค๋ƒ…์ƒท) ๊ฐ„์˜ ์ฐจ์ด์ ์ด ์ด <p>This is New!</p> ์ž„์„ ํ™•์ธํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๋Ÿฌํ•œ ๋ณ€๊ฒฝ ์‚ฌ์‹ค์„ ReactDOM ์— ์ „๋‹ฌํ•˜๋ฉด ReactDOM ์€ ์‹ค์ œ DOM์„ ์—…๋ฐ์ดํŠธํ•˜๊ณ  ์ด <p>This is New!</p>์„ ์ง‘์–ด๋„ฃ๋Š”๋‹ค. ReactDOM ์€ ์ „์ฒด DOM์„ ์žฌ๋ Œ๋”๋ง ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ด์ „์— DOM ํŠธ๋ฆฌ์— ์—…๋ฐ์ดํŠธ ๋˜์—ˆ๋˜ ์ตœ์ข… ์Šค๋ƒ…์ƒท ๋‚ด๋ถ€์˜ ์ฝ”๋“œ <h1>๊ณผ <div>๋Š” ๊ฑด๋“œ๋ฆฌ์ง€ ์•Š๊ณ , ๋‹ค๋งŒ ํ˜„์žฌ์˜ ์Šค๋ƒ…์ƒท๊ณผ ์ตœ์ข… ์Šค๋ƒ…์ƒท๊ณผ์˜ ์ฐจ์ด์ ์ธ <p>This is New!</p> ๋งŒ์„ ์ถ”๊ฐ€ํ•ด์„œ ์‹ค์ œ DOM ํŠธ๋ฆฌ์— ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์ด ๋ฐ”๋กœ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ๋ฆฌ์•กํŠธ๊ฐ€ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

โœ“ ๋ฆฌ์•กํŠธ์˜ ๊ฐ€์ƒ ๋”(๋ฒ„์ธ„์–ผ ๋”) ์ •๋ฆฌ

  • ๋ฆฌ์•กํŠธ์˜ ๊ฐ€์ƒ๋”์€ ์ƒํƒœ(state)๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๊ณ  ์—…๋ฐ์ดํŠธ๊ฐ€ ๋˜๋Š” ๋น„ํšจ์œจ์ ์ธ ๋ฐฉ์‹์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ•œ ๊ฐœ๋…์ž…๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ๊ฐ€์ƒ์˜ ๋” ํŠธ๋ฆฌ๋กœ ๋ฆฌ์•กํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋ฐ”๋กœ ๋” ํŠธ๋ฆฌ์— ์—…๋ฐ์ดํŠธ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์— ๋ณ€๋™ ์‚ฌํ•ญ์ด ์ƒ๊ฒจ render ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๋ฆฌ์•กํŠธ๋Š” ์ด์ „์˜ ๋” ํŠธ๋ฆฌ์™€ ๋น„๊ตํ•ด์„œ ์‹ค์งˆ์ ์œผ๋กœ ์–ด๋–ค ๋ถ€๋ถ„์ด ์—…๋ฐ์ดํŠธ ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ , ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋” ํŠธ๋ฆฌ์— ์—…๋ฐ์ดํŠธ๋ฅผ ํ•ฉ๋‹ˆ๋‹ค. render ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ์—…๋ฐ์ดํŠธ-ํ˜ธ์ถœ์ด ๋˜์–ด๋„ ์‹ค์งˆ์ ์œผ๋กœ ๋ณด์—ฌ์ง€๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๋™๋˜์ง€ ์•Š์œผ๋ฉด, ์ด ๋” Tree์—๋Š” ์ „ํ˜€ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ์— render ํ•จ์ˆ˜๊ฐ€ ์—ฌ๋Ÿฌ๋ฒˆ ํ˜ธ์ถœ์ด ๋˜์–ด๋„ React์˜ ์„ฑ๋Šฅ์— ํฐ ์˜ํ–ฅ์„ ๋ผ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

โœง ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹คํ–‰ ๊ณผ์ •

  • ์‹ค์ œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋ณด๋ฉด์„œ ์ปดํฌ๋„ŒํŠธ ์—…๋ฐ์ดํŠธ ์‹คํ–‰ ๊ณผ์ •๊ณผ ํ•จ์ˆ˜ ์—…๋ฐ์ดํŠธ ์ดํ›„ ์‹ค์ œ DOM์— ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ณผ ๊ฒƒ์ด๋‹ค.
<div className="app">
  <h1>Hi there!</h1>
</div>
  • ํ˜„์žฌ App.js ์—๋Š” ๊ฐ„๋‹จํ•œ <div> ์™€ <h1> ํƒœ๊ทธ๊ฐ€ ๋“ค์–ด์žˆ๋‹ค.
<div className="app">
  <h1>Hi there!</h1>
  <p>This is New!</p>
</div>
  • ๊ทธ๋ฆฌ๊ณ , <p>This is New!</p> ๊ฐ€ ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ด๋ณด์ž. ์–ด๋–ป๊ฒŒ ํ•˜๋ฉด, ์ฒ˜์Œ์—๋Š” ๋ฌธ์žฅ์„ ํ‘œ์‹œ(์ถ”๊ฐ€)ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์–ด๋–ค ์‹œ์ ์„ ๊ธฐ์ ์œผ๋กœ ๋ฌธ์žฅ์„ ํ‘œ์‹œ(์ถ”๊ฐ€)ํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์ด๋•Œ ์šฐ๋ฆฌ๊ฐ€ ๋Š˜ ์‚ฌ์šฉํ•˜๋Š” ์ƒํƒœ(state)๋ฅผ ์ด์šฉํ•œ ๋ฐฉ๋ฒ•์ด ๋– ์˜ฌ๋ ธ๋‹ค๋ฉด ์ •๋‹ต์ด๋‹ค. ์ƒํƒœ(state)์™€ ์ƒํƒœ(state) ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ, ์ฒ˜์Œ์—๋Š” <p> ํƒœ๊ทธ์˜ ๋ฌธ์žฅ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š๋‹ค๊ฐ€ ํ•ด๋‹น ์ƒํƒœ(state)์˜ ์—…๋ฐ์ดํŠธ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๊ธฐ๋Šฅ(๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฑฐ๋‚˜, ํƒ€์ด๋จธ๋ฅผ ์ž‘๋™์‹œํ‚จ๋‹ค๊ฑฐ๋‚˜)์— ๋”ฐ๋ผ์„œ <p> ํƒœ๊ทธ์˜ ๋ฌธ์žฅ์ด ํ‘œ์‹œ๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
const [showParagraph, setShowParagraph] = useState(false);
  • ๋จผ์ €, ๊ธฐ๋ณธ ๊ฐ’์„ false ๋กœ ๊ฐ–๋Š” useState ์ƒํƒœ(state)๋ฅผ ์„ค์ •ํ•œ๋‹ค. ์•ž์„œ ๋ˆ„๋ˆ„ํžˆ ๋งํ–ˆ๋“ฏ์ด ๋ฆฌ์•กํŠธ๋Š” ์ƒํƒœ(state)๋‚˜ props, ์ปจํ…์ŠคํŠธ(context) ๋ณ€๊ฒฝ ์‹œ์—๋งŒ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๋ฅผ ์žฌ์‹คํ–‰ํ•˜๊ณ  ์žฌ ๋ Œ๋”๋ง ํ•œ๋‹ค. ํ˜„์žฌ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์„ฑํ•˜๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” root ์ปดํฌ๋„ŒํŠธ๋กœ props๋‚˜ ์ปจํ…์ŠคํŠธ(context)๋กœ๋Š” ๊ฑฐ์˜ ๋ฐ”๋€Œ์ง€ ์•Š์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ง€๊ธˆ ์ƒํƒœ(state) ๋ณ€ํ™”๋ฅผ ์ด์šฉํ•ด์„œ ์•ž์„œ ์„ค๋ช…ํ•œ ์ด๋ก ์  ์ด์•ผ๊ธฐ๋“ค์„ ์ถ”์ƒ์ ์ธ ์ดํ•ด๊ฐ€ ์•„๋‹Œ ์‹ค์งˆ์ ์ธ ์ดํ•ด๋กœ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.
<div className="app">
  <h1>Hi there!</h1>
  {showParagraph && <p>This is New!</p>}
</div>
  • showParagraph ์ƒํƒœ(state)์™€ setShowParagraph ์ƒํƒœ(state) ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด์„œ, ์ฆ‰ ์ด์ „์— ๋ฐฐ์šด ์กฐ๊ฑด๋ถ€ ์‹์„ ์ด์šฉํ•ด์„œ showParagraph๊ฐ€ true ์ผ ๋•Œ๋งŒ <p> ํƒœ๊ทธ์˜ ๋ฌธ์žฅ์ด ํ‘œ์‹œ๋˜๋„๋ก ์ˆ˜์ •ํ•ด์ฃผ์—ˆ๋‹ค. showParagraph ์ƒํƒœ(state)์˜ ์ดˆ๊ธฐ ๊ฐ’์ด false ์ด๋ฏ€๋กœ, ์ฒ˜์Œ ํŽ˜์ด์ง€๋ฅผ ๋ Œ๋”๋งํ•˜๋ฉด, <p> ํƒœ๊ทธ์˜ ๋ฌธ์žฅ์€ ๋ณด์ด์ง€ ์•Š์„ ๊ฒƒ์ด๋‹ค. ์ด์ œ <p> ํƒœ๊ทธ์˜ ๋ฌธ์žฅ์„ ๋ณด์ผ ์ˆ˜ ์žˆ๊ฒŒ๋” showParagraph ์ƒํƒœ(state) ๊ฐ’์„ ๋ณ€๊ฒฝํ•ด๋ณด์ž.

Button.js

const Button = (props) => {
  return (
    <button
      type={props.type || "button"}
      className={`${classes.button} ${props.className}`}
      onClick={props.onClick}
      disabled={props.disabled}
    >
      {props.children}
    </button>
  );
};

App.js

import Button from "./components/UI/Button/Button";

...
<div className="app">
  <h1>Hi there!</h1>
  {showParagraph && <p>This is New!</p>}
  <Button onClick={}>Toggle Paragraph!</Button>
</div>
  • ๊ธฐ์กด์— ์žˆ๋˜ Button ์ปดํฌ๋„ŒํŠธ๋ฅผ import ํ•˜๊ณ  onClick ์ด๋ผ๋Š” prop์œผ๋กœ (์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๋Š”)ํŠธ๋ฆฌ๊ฑฐ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ”์ธ๋“œ ํ•œ๋‹ค.
const toggleParagraphHandler = () => {
  setShowParagraph((prevParagraph) => !prevParagraph);
};
...
  <Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
  • showParagraph ์ƒํƒœ(state)์˜ ์—…๋ฐ์ดํŠธ ํ•จ์ˆ˜์ธ setShowParagraph()๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ณ , ํ•ด๋‹น ํŠธ๋ฆฌ๊ฑฐ ํ•จ์ˆ˜๊ฐ€ Button ์ปดํฌ๋„ŒํŠธ์˜ onClick ์ด๋ฒคํŠธ๋กœ ํŠธ๋ฆฌ๊ฑฐ ๋  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด์˜ ์ƒํƒœ(prevParagraph)์˜ ๋ฐ˜๋Œ“๊ฐ’(!prevParagraph)์œผ๋กœ ์—…๋ฐ์ดํŠธํ•˜๋„๋ก ์ž‘์„ฑํ•œ๋‹ค.
.app {
  ...
  text-align: center;
}
  • ์กฐ๊ธˆ ๋” ์˜ˆ์˜๊ฒŒ ๋ณด์ด๋„๋ก CSS ๋„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.
  • ์ด์ œ Toggle Paragraph! ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด This is New! ๋ผ๋Š” ๋ฌธ์žฅ์ด ๋‚˜ํƒ€๋‚˜๊ณ , ๋‹ค์‹œ ์ด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด, This is New! ๋ฌธ์žฅ์€ ์‚ฌ๋ผ์ง„๋‹ค.

์ž‘๋™ ๋ฐฉ์‹ ๋ถ„์„ํ•˜๊ธฐ

  • ํ•จ์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋Š” ์ž‘๋™ ๋ฐฉ์‹์„ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด์„œ App ์ปดํฌ๋„ŒํŠธ์— ๊ฐ„๋‹จํ•œ ๋กœ๊ทธ๋ฅผ ์ž‘์„ฑํ•ด๋ณด์ž.
console.log("APP RUNNING");

const toggleParagraphHandler = () => {
  setShowParagraph((prevParagraph) => !prevParagraph);
};
  • console.log("APP RUNNING");๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค "APP RUNNING" ๋ฌธ๊ตฌ๋ฅผ ์ฝ˜์†”๋กœ๊ทธ์— ์ถœ๋ ฅํ•˜๋„๋ก ํ–ˆ๋‹ค.

  • ์ €์žฅ ํ›„ ์ฝ˜์†” ํ™”๋ฉด์„ ๋ณด๋ฉด ์‹คํ–‰ ๋ฌธ๊ตฌ("APP RUNNING")๊ฐ€ ๋œจ๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๋ฆฌ์•กํŠธ๊ฐ€ App ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™”๋ฉด์— ์ตœ์ดˆ๋กœ ๋ Œ๋”๋งํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฒซ ๋ Œ๋”๋ง์„ ํ•˜๋ฉด์„œ ๋ฆฌ์•กํŠธ๋Š” <div>์™€ <h1> ์š”์†Œ ๊ทธ๋ฆฌ๊ณ  <Button>์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์กฐ๊ฑด๋ถ€ ์‹์œผ๋กœ ์ž‘์„ฑํ–ˆ๋˜ <p>์˜ ๋ฌธ์žฅ๋“ค์€ ํ‘œ์‹œ๋˜์ง€ ์•Š๋Š”๋‹ค. <p>์˜ ๋ฌธ์žฅ์ด true ์ผ ๋•Œ๋งŒ ํ‘œ์‹œํ•˜๋„๋ก ์ปจํŠธ๋กคํ•˜๋Š” ์ƒํƒœ(state) ๊ฐ’์˜ ์ดˆ๊ธฐ ๊ฐ’์€ false ์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฆฌ์•กํŠธ๊ฐ€ App ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฒ˜์Œ์œผ๋กœ ๋ Œ๋”๋งํ•œ ์ดํ›„ ์ถœ๋ ฅํ•  ๊ฒƒ์€ ์—†๋‹ค. ์ฆ‰ ์ด์ „ ์Šค๋ƒ…์ƒท์€ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ๋”ฐ๋ผ์„œ ์ฐจ์ด์ ์„ ๋น„๊ตํ•˜๋Š” ๊ณผ์ •์—์„œ <div>์™€ <h1> ์š”์†Œ ๊ทธ๋ฆฌ๊ณ  <Button>๊ฐ€ ๋‹ค์‹œ ๋ Œ๋”๋งํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์ •๋ณด๊ฐ€ ReactDOM ํŒจํ‚ค์ง€๋กœ ์ „๋‹ฌ๋˜๋ฉฐ ํ™”๋ฉด์— ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๊ฐ€ ํ‘œ์‹œ๋œ๋‹ค.

  • ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋˜ ๋‹ค์‹œ "APP RUNNING" ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ์ด๋ ‡๊ฒŒ ๋งค ๋ฒˆ ์ƒํƒœ(state) ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚  ๋•Œ๋งˆ๋‹ค App ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌ์‹คํ–‰๋˜๋ฉฐ ๋‹ค์‹œ ๋ Œ๋”๋ง ๋œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด, ์‹ค์ œ DOM ์—๋Š” ์–ด๋–ค ์˜ํ–ฅ์„ ๋ผ์น ๊นŒ? ๋ผ์ด๋ธŒ ์„œ๋ฒ„๋ฅผ ์—ด๊ณ , ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Elements ํƒญ์„ ํ™•์ธํ•ด๋ณด์ž.

  • ํŽ˜์ด์ง€๋ฅผ ๋กœ๋“œํ•˜๋ฉด ๊ฐœ๋ฐœ ์ฐฝ์— <div>์™€ <h1> ์š”์†Œ ๊ทธ๋ฆฌ๊ณ  <Button> ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜๊ณ  ์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

    ๊ฐœ๋ฐœ ํˆด์˜ Elements ํƒญ์€ DOM ์—์„œ ๋ฐœ์ƒํ•œ ๋ณ€๊ฒฝ ์š”์†Œ๋“ค์„ ๊ฐ•์กฐํ•ด์„œ ํ‘œ์‹œํ•ด์ค€๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‹ค์ œ DOM์ด ์ƒˆ๋กœ ๋ Œ๋”๋ง ๋˜๊ฑฐ๋‚˜ ๊ฐฑ์‹ ๋œ ์š”์†Œ๋“ค์„ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด๋‹ค.

  • <Button>์„ ํด๋ฆญํ•˜๋ฉด, <p> ๋ถ€๋ถ„์ด ๊ฐ•์กฐ๋˜์–ด ํ‘œ์‹œ๋˜๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค. ๋ฐ˜๋ฉด ๊ธฐ์กด์˜ <div>์™€ <h1>, <Button> ์š”์†Œ๋“ค์€ ์ด์ „๊ณผ ๊ทธ๋Œ€๋กœ์ด๋‹ค. ๋‹ค์‹œ <Button>์„ ํด๋ฆญํ•˜๋ฉด <div> ์š”์†Œ๊ฐ€ ๊ฐ•์กฐ ํ‘œ์‹œ ๋œ๋‹ค. ์ด ์•ˆ์— ์žˆ๋Š” <p> ์š”์†Œ๊ฐ€ ์‚ฌ๋ผ์กŒ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด์ฒ˜๋Ÿผ ์‹ค์ œ DOM์„ ํ†ตํ•œ ์—…๋ฐ์ดํŠธ๋Š” ๋ฆฌ์•กํŠธ์˜ ๊ฐ€์ƒ DOM ๊ณผ ์ตœ์ข… ์Šค๋ƒ…์ƒท์„ ์ €์žฅํ•˜๊ณ  ์žˆ๋Š” ์‹ค์ œ DOM ๊ณผ์˜ ์ฐจ์ด์ ๋งŒ ๋ฐ˜์˜๋˜๋Š” ๊ฒƒ์ด๋‹ค.


โœง ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ธฐ

  • ๋จผ์ € components ํด๋”์— ํ•˜์œ„ ํด๋” Demo๋ฅผ ๋งŒ๋“ค๊ณ , ์—ฌ๊ธฐ์— ์ƒˆ๋กœ์šด ํŒŒ์ผ DemoOutput.js ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

DemoOutput.js

const DemoOutput = (props) => {
  return;
};
  • ๊ทธ๋ฆฌ๊ณ  App ์ปดํฌ๋„ŒํŠธ์˜ ์กฐ๊ฑด์‹ <p> ๋ฌธ์žฅ์„ ์ œ๊ฑฐํ•˜๊ณ , DemoOutput ์ปดํฌ๋„ŒํŠธ์— ๋„ฃ์–ด์ค€๋‹ค.
const DemoOutput = (props) => {
  return <p>This is New!</p>;
};
  • props ๋กœ ์ „๋‹ฌ๋ฐ›์€ show ์ƒํƒœ(state)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐ๊ฑด์‹ <p> ํƒœ๊ทธ ์† ๋ฌธ์žฅ์„ ๋ Œ๋”๋งํ•œ๋‹ค.
const DemoOutput = (props) => {
  return <p>{props.show ? "This is New!" : ""}</p>;
};
  • ๋‹ค์‹œ App ์ปดํฌ๋„ŒํŠธ๋กœ ๋Œ์•„์™€์„œ, DemoOutput ์ปดํฌ๋„ŒํŠธ๋ฅผ import ํ•˜๊ณ , ์ง์ „์— ์ง€์›Œ์ค€ ์ฝ”๋“œ ์œ„์น˜์— ์œ„์น˜์‹œํ‚จ ๋’ค, show ๋ผ๋Š” ํ•„๋“œ์˜ props๋กœ showParagraph ์ƒํƒœ(state) ๊ฐ’์„ ๋„˜๊ฒจ์ค€๋‹ค.
<div className="app">
  <h1>Hi there!</h1>
  <DemoOutput show={showParagraph} />
  <Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
</div>
  • ์ด์ œ DemoOutput ์ปดํฌ๋„ŒํŠธ์— props ๋กœ ๋„˜๊ฒจ์ค€ show์˜ ์ƒํƒœ๊ฐ’์— ๋”ฐ๋ผ ๊ธฐ๋ณธ ๊ฐ’์€ false๊ฐ€ ๋  ๊ฒƒ์ด๊ณ , ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด true๋กœ ์ƒํƒœ๊ฐ’์ด ์—…๋ฐ์ดํŠธ ๋˜์–ด <p> ํƒœ๊ทธ ๋‚ด๋ถ€์˜ ๋ฌธ์žฅ์ด ์ถœ๋ ฅ๋  ๊ฒƒ์ด๋‹ค.
  • DemoOutput ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ญ์ƒ ๋ Œ๋”๋ง ๋˜๊ณ , DemoOutput ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ๋Š” <p> ํƒœ๊ทธ๊ฐ€ ํ•ญ์ƒ ๋ Œ๋”๋ง ๋˜์ง€๋งŒ, <p> ํƒœ๊ทธ ๋‚ด๋ถ€์˜ ๋ฌธ์ž์—ด์€ props.show์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง€๋Š” ๊ฒƒ์ด๋‹ค.

  • ์ €์žฅํ•˜๊ณ  ํ™”๋ฉด์œผ๋กœ ๋Œ์•„๊ฐ€๋ฉด, ์ด์ „๊ณผ ๊ฐ™์€ ํ–‰๋™์„ ํ•˜๊ณ  ํฐ ์ฐจ์ด๋„ ์—†์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Elements ํƒญ์—์„œ ์ด์ „๊ณผ๋Š” ์ฐจ์ด์ ์ด ์žˆ์Œ์„ ์•Œ ์ˆ˜ ์žˆ๋Š”๋ฐ,

  • ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•˜์ž๋งˆ์ž DOM์„ ํ™•์žฅํ•ด์„œ ๋ณด๋ฉด <p> ํƒœ๊ทธ ์š”์†Œ๊ฐ€ ํ•ญ์ƒ ํ‘œ์‹œ๋˜์–ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ํ•˜์ง€๋งŒ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ด๋ฒˆ์—๋Š” <p> ํƒœ๊ทธ๊ฐ€ ๊นœ๋นก์ด๊ณ , ๋‹ค์‹œ ํด๋ฆญํ•˜๋ฉด <p> ํƒœ๊ทธ ์—ญ์‹œ ๋‹ค์‹œ ๊นœ๋นก์ธ๋‹ค.

  • <p> ํƒœ๊ทธ๊ฐ€ ๊นœ๋นก์ด๋Š” ์ด์œ ๋Š” ํ…์ŠคํŠธ์˜ ์ถ”๊ฐ€์™€ ์‚ญ์ œ๊ฐ€ <p> ํƒœ๊ทธ ์š”์†Œ ์•ˆ์—์„œ๋งŒ ์ด๋ฃจ์–ด์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ด๊ฒƒ์€ ์ „์ฒด ์š”์†Œ์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์œผ๋กœ ๊ฐ„์ฃผ๋˜๋ฉฐ ํ…์ŠคํŠธ๊ฐ€ ์•„๋‹Œ <p> ํƒœ๊ทธ๊ฐ€ ๊นœ๋นก์ด๋Š” ์ด์œ ๋Š” ์ด ํ…์ŠคํŠธ๊ฐ€ <p> ํƒœ๊ทธ์˜ props์™€ ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฌผ๋ก , ์ด๋ฅผ ์ปจํ…์ŠคํŠธ๋ผ๊ณ  ํ•  ์ˆ˜๋„ ์žˆ๊ฒ ์ง€๋งŒ ์ด๊ฒƒ์€ ์—„์—ฐํžˆ <p> ํƒœ๊ทธ์ด๋‹ค.

  • ์ด ๋ง์ธ ์ฆ‰์Šจ, ์ด <p> ํƒœ๊ทธ๋Š” ํ˜„์žฌ <p> ํƒœ๊ทธ์˜ ์œ„ ์•„๋ž˜์— ์œ„์น˜ํ•œ <h1> ์ด๋‚˜ <button> ๊ฐ™์€ ์ผ๋ฐ˜์ ์ธ ํƒœ๊ทธ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๋œป์ด๋‹ค. ์™œ๋ƒํ•˜๋ฉด, ๋ฆฌ์•กํŠธ์˜ ์—…๋ฐ์ดํŠธ ๋งค์ปค๋‹ˆ์ฆ˜์€ ๊ฐ€์ƒ์˜ DOM ๊ณผ ์‹ค์ œ DOM์˜ ์‹ค์งˆ์ ์ธ ์ฐจ์ด์ ์„ ๋น„๊ตํ•˜์—ฌ ์‹คํ–‰๋˜์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

    ๋ฌผ๋ก , App ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋Š” ๊ณ„์† ๋ฐ”๋€Œ๋‚˜ ์‹ค์ œ๋กœ ๋ฐ”๋€Œ๋Š” ๋ถ€๋ถ„์€ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์˜ ์ผ๋ถ€๋ถ„์ด๋‹ค.

  • ์ด ์‚ฌ๋ก€๋Š” ๋ฆฌ์•กํŠธ๊ฐ€ ๊ฐ€์ƒ์˜ DOM์„ ์‚ฌ์šฉํ•˜์—ฌ ๋Š์ž„์—†์ด ์‹ค์ œ์˜ DOM๊ณผ ๊ณ„์† ๋น„๊ต ์ž‘์—…์„ ํ•˜๊ณ  ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹ค์ œ DOM์„ ์—…๋ฐ์ดํŠธ๋ฅผ ํ•œ๋‹ค๋Š” ์ฆ๊ฑฐ๊ฐ€ ๋œ๋‹ค.

App.js

console.log("APP RUNNING");

const toggleParagraphHandler = () => {
  setShowParagraph((prevParagraph) => !prevParagraph);
};

  • ๋‹ค์‹œ ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Console๋กœ ์ด๋™ํ•ด์„œ ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด, ์•„๊นŒ์˜ APP RUNNING ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ๋˜๊ณ  ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค ๋ฌธ๊ตฌ๊ฐ€ ์ถ”๊ฐ€๋กœ ํ™•์ธ๋œ๋‹ค. ์‹ค์ œ ๋ณ€๊ฒฝ์€ DemoOutput์—์„œ ๋ฐœ์ƒํ•˜์ง€๋งŒ props.show์— ๋Œ€ํ•œ ์ƒํƒœ(state)๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” App ์ปดํฌ๋„ŒํŠธ ์—ญ์‹œ ๋‹ค์‹œ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์ด๋‹ค.

  • ์ƒํƒœ(state)๋‚˜ props ๋˜๋Š” ์ปจํ…์ŠคํŠธ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ•ด๋‹น ์ƒํƒœ(state)๋ฅผ ๋ณ€ํ™”์‹œํ‚จ๋‹ค๊ณ  ํ•ด๋„, ์žฌ์‹คํ–‰-๋ฆฌ๋กœ๋“œ ๋œ๋‹ค. ํ˜„์žฌ show๋ผ๋Š” ์ƒํƒœ(state)๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ๊ฑด App์ด๊ธฐ ๋•Œ๋ฌธ์—, App์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ์ƒํƒœ(state)์— ๋”ฐ๋ฅธ ๋ณ€๊ฒฝ์ด ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ์— ์‹œ๊ฐ์ ์œผ๋กœ ์˜ํ–ฅ์„ ์คฌ์„ ๋•Œ ๋‹น์—ฐํžˆ App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ๋ฆฌ๋กœ๋“œ ๋˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ App์ด ์ด ๋ชจ๋“  ๋ณ€ํ™”์˜ ์ƒํƒœ(state) ๊ด€๋ฆฌ๋ฅผ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

const DemoOutput = (props) => {
  console.log("DemoOutput RUNNUNG");
  return <p>{props.show ? "This is New!" : ""}</p>;
};
  • DemoOutput ์ปดํฌ๋„ŒํŠธ์— "DemoOutput RUNNUNG" ์„ ์ถœ๋ ฅํ•˜๋„๋ก console.log๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

  • ํŽ˜์ด์ง€๋ฅผ ์žฌ์‹คํ–‰ํ•˜๋ฉด, "APP RUNNING" ๊ณผ "DemoOutput RUNNUNG" ๊ฐ€ ๋กœ๊ทธ์— ์ถœ๋ ฅ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. APP๊ณผ DemoOutput ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ตœ์ดˆ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋ Œ๋”๋ง ๋์„ ๋•Œ ์ถœ๋ ฅ๋˜๋Š” ๋ฌธ๊ตฌ๋“ค์ด๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋งค๋ฒˆ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค "DemoOutput RUNNUNG" ์ด ์ถœ๋ ฅ๋œ๋‹ค. ๋ฒ„ํŠผ์„ ํด๋ฆญํ•  ๋•Œ๋งˆ๋‹ค show๋ผ๋Š” props๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— APP๊ณผ DemoOutput ์ปดํฌ๋„ŒํŠธ ์—ญ์‹œ ๊ทธ์— ๋”ฐ๋ผ์„œ ์žฌ์‹คํ–‰ ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค.

props ์™€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง

App.js

<DemoOutput show={showParagraph} />
  • ๋จผ์ €, DemoOutput ์ปดํฌ๋„ŒํŠธ์— show prop ์œผ๋กœ ์ „๋‹ฌํ•˜๋˜ ์ƒํƒœ(state) ๊ฐ’์ธ showParagraph๋ฅผ ์ˆ˜์ •ํ•ด์ฃผ์ž.
<DemoOutput show={false} />
  • DemoOutput ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋˜ show์˜ ๊ฐ’์„ false๋กœ ๋ฐ”๊ฟ”์ค€ ๊ฒƒ์ด๋‹ค. onClick ์ด๋ฒคํŠธ๋กœ showParagraph ์ƒํƒœ(state) ๊ฐ’์„ ๋ณ€๊ฒฝ์€ ํ•ด์ฃผ๊ณ  ์žˆ์ง€๋งŒ showParagraph ๊ฐ’์„ ๊ฐ€์‹œํ™”ํ•˜๋Š” DemoOutput์— ์ด ์—…๋ฐ์ดํŠธ ๋œ showParagraph ๊ฐ’์„ ์ „๋‹ฌํ•ด์ฃผ์ง€ ์•Š๊ณ  ์žˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ํŽ˜์ด์ง€๋ฅผ ์žฌ์‹คํ–‰ํ•ด๋ณด์ž.

  • ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจ ํ•œ ๋’ค์— ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์„ค์ •ํ•œ ์ฝ˜์†” ๋กœ๊ทธ ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. App ๊ณผ DemoOutput ์ปดํฌ๋„ŒํŠธ ๋ชจ๋‘ ๋ Œ๋”๋ง ๋˜๊ณ  ๋‚œ ํ›„ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‹ค์‹œ ๋™์ผํ•˜๊ฒŒ ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ์„ค์ •ํ•œ ์ฝ˜์†” ๋กœ๊ทธ ๋ฌธ๊ตฌ๊ฐ€ ์ถœ๋ ฅ๋œ๋‹ค. ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค ๋ง์ด๋‹ค.

props ๊ฐ’์€ ๋ณ€ํ™”๋˜์ง€ ์•Š์•˜์ง€๋งŒ DemoOutput ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ์ด์œ 

  • App ์ปดํฌ๋„ŒํŠธ์—์„œ DemoOutput ์ปดํฌ๋„ŒํŠธ์— ์ „๋‹ฌํ•˜๋˜ show์˜ ๊ฐ’์„ props ๊ฐ’์„ false๋กœ ๊ณ ์ •์„ ํ•ด์ฃผ์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  DemoOutput ์ปดํฌ๋„ˆํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์™œ ๊ทธ๋Ÿด๊นŒ? ํ•˜๋‚˜ํ•˜๋‚˜ ์งš์–ด๋ณด๋„๋ก ํ•˜์ž.

  • ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅผ ๋•Œ๋งˆ๋‹ค App ์ปดํฌ๋„ŒํŠธ๋Š” showParagraph ์ƒํƒœ(state)๊ฐ€ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํ•˜๊ฒŒ๋„ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค.

return (
  <div className="app">
    <h1>Hi there!</h1>
    <DemoOutput show={false} />
    <Button onClick={toggleParagraphHandler}>Toggle Paragraph!</Button>
  </div>
);
  • App ์ปดํฌ๋„ŒํŠธ๋Š” ๋ฌด์—‡์„ ๋ฐ˜ํ™˜ํ• ๊นŒ? ๋‹น์—ฐํžˆ JSX ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์—ฌ๊ธฐ์— ์žˆ๋Š” ๋ชจ๋“  JSX ์š”์†Œ๋“ค์€ ๊ฒฐ๊ตญ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๋™์ผํ•˜๋‹ค. ์ด๋ง์ธ ์ฆ‰์Šจ, App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๋Š” JSX ์š”์†Œ๋“ค ์•ˆ์— ์žˆ๋Š” DemoOutput ์ด๋‚˜, Button ์ปดํฌ๋„ŒํŠธ ๋“ฑ์„ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. App ์ปดํฌ๋„ŒํŠธ์—์„œ ๊ด€๋ฆฌํ•˜๊ณ  ์žˆ๋Š” ์ƒํƒœ(state)๊ฐ€ ๋ณ€ํ™”ํ•  ๋•Œ๋งˆ๋‹ค APP ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ, App ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ(DemoOutput, Button) ์—ญ์‹œ ๋™์ผํ•˜๊ฒŒ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค๋Š” ๋œป์ด๋‹ค.

  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋ฉด, ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž์‹ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜๋„ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค. ๋”ฐ๋ผ์„œ props์˜ ๊ฐ’์€ ์ด ๋ฆฌ๋ Œ๋”๋ง๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ƒ๊ด€์ด ์—†๋‹ค๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.

props ์˜ ๋ณ€๊ฒฝ

  • props ์˜ ๋ณ€ํ™”๋Š” ์‹ค์ œ DOM์˜ ์—…๋ฐ์ดํŠธ๋กœ ์ด์–ด์งˆ ์ˆ˜๋Š” ์žˆ์œผ๋‚˜, ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์—์„œ ๋ฆฌ๋ Œ๋”๋ง์„ ํ•  ๋•Œ๋Š” ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง ๋˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ DemoOutput ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ฆฌ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ์ด ์‹ค์ œ DOM์ด ์—…๋ฐ์ดํŠธ๋œ๋‹ค๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋œป์€ ์•„๋‹ ๊ฒƒ์ด๋‹ค.

  • ๊ฐœ๋ฐœ์ž ๋„๊ตฌ์˜ Element๋ฅผ ํ™•์ธํ•ด๋ณด๋ฉด, ๋ฒ„ํŠผ์„ ์•„๋ฌด๋ฆฌ ๋ˆŒ๋Ÿฌ๋„ ํ•ด๋‹น ์š”์†Œ๋“ค ์ค‘ ๊ทธ ์–ด๋Š ๊ฒƒ๋„ ๋ฐ˜์ง์ด์ง€ ์•Š๋Š” ๊ฑธ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ์•ž์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฑฐ๋ก ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์ปดํฌ๋„ŒํŠธ์˜ ๋ฆฌ๋ Œ๋”๋ง๊ณผ ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜์˜ ๋ฆฌ๋ Œ๋”๋ง์ด ์ผ์–ด๋‚˜๋„, ์‹ค์ œ DOM์ด ๋‹ค์‹œ ๋ Œ๋”๋ง๋˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‹คํ–‰๋˜๋ฉด, ์ž์‹ ์ปดํฌ๋„ŒํŠธ ์—ญ์‹œ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค. ๋”ฐ๋ผ์„œ App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค DemoOutput ์ปดํฌ๋„ŒํŠธ ๋ฟ๋งŒ์ด ์•„๋‹ˆ๋ผ, Button ์ปดํฌ๋„ŒํŠธ ์—ญ์‹œ ๋ฆฌ๋ Œ๋”๋ง ๋œ๋‹ค. ๋งŒ์•ฝ App ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ž์‹ ์ปดํฌ๋„ŒํŠธ์ธ DemoOutput ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ ๋˜ ๋‹ค๋ฅธ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด, ๊ทธ ์ปดํฌ๋„ŒํŠธ ์—ญ์‹œ App ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์žฌ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋ฆฌ๋ Œ๋”๋ง ๋  ๊ฒƒ์ด๋‹ค.

์ •๋ฆฌ

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

  • ๋ฐฉ๊ธˆ ์ „ ์˜ˆ์‹œ๋ฅผ ๋ดค๋“ฏ์ด, DemoOutput ์ปดํฌ๋„ŒํŠธ๋Š” ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜์œผ๋ฏ€๋กœ DemoOutput ์ปดํฌ๋„ŒํŠธ๋Š” ์žฌํ‰๊ฐ€ ๋˜์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ DemoOutput ์ปดํฌ๋„ŒํŠธ์— prop ์œผ๋กœ ๋‚ด๋ ค์ฃผ๋˜ ๊ฐ’์„ ์ง€์šด๋‹ค๋ฉด, App ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(state) ๋ณ€๊ฒฝ์ด ์—†์œผ๋ฏ€๋กœ ์ถœ๋ ฅ ๊ฒฐ๊ณผ ์—ญ์‹œ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด ์—†์„ ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , DemoOutput ์ปดํฌ๋„ŒํŠธ์™€ ๊ฐ™์€ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ฆฌ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ์€ ์•„๋งˆ๋„ ๋ถˆํ•„์š”ํ•œ ๋‚ญ๋น„๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค.


โœฆ ์ถœ์ฒ˜


๐Ÿšจ ํ•ด๋‹น ํฌ์ŠคํŒ…์€ Udemy์˜ โŒœReact ์™„๋ฒฝ ๊ฐ€์ด๋“œโŒŸ ๊ฐ•์˜๋ฅผ ๋ฒ ์ด์Šค๋กœ ํ•œ ๊ธฐ๋ก์ž…๋‹ˆ๋‹ค.
โœ๐Ÿป ๊ฐ•์˜ git repo ๋ฐ”๋กœ๊ฐ€๊ธฐ

profile
์ผ๋‹จ ๊ณต๋ถ€๊ฐ€ '์ ์„ฑ'์— ๋งž๋Š” ๊ฐœ๋ฐœ์ž. ๊ทผ์„ฑ์žˆ์Šต๋‹ˆ๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€