3. React

  • React๋ž€?

  • React ์ปดํฌ๋„ŒํŠธ

  • React ๋ฆฌ๋ Œ๋”๋ง

  • IoC(Inversion of Control)

  • Library vs Framework

React

React ๊ณต์‹๋ฌธ์„œ

โ†’ ์˜›๋‚  ๊ฑฐ๋ผ์„œ ๋ณด๋ฉด ์•ˆ ๋  ์ค„ ์•Œ์•˜๋Š”๋ฐ, ์ตœ๊ทผ์— ์—…๋ฐ์ดํŠธ๊ฐ€ ๋จ.

  • ๊ธฐ์กด์—๋Š” ํด๋ž˜์Šค ์ปดํฌ๋„ŒํŠธ ์˜ˆ์ œ๊ฐ€ ๋งŽ์•˜์ง€๋งŒ, ๋งŽ์€ ๋ถ€๋ถ„์ด ํ•จ์ˆ˜ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ณ€๊ฒฝ๋˜์–ด ์ฝ๊ธฐ์— ๊ดœ์ฐฎ๋‹ค.

React Beta ๋ฌธ์„œ โ†’ ์š”์ฆ˜ React ์‚ฌ์šฉ๋ฒ•์„ ๋‹ค๋ฃฌ ๋ฌธ์„œ. ๋ฒ ํƒ€ ๋ฒ„์ „์ด๊ณ  ์™„์„ฑ๋„๊ฐ€ ๋‚ฎ์ง€๋งŒ (+ ํ•œ๊ตญ์–ด ๋ฒ„์ „์ด ์—†์ง€๋งŒ) ์ด๊ฒƒ๋ถ€ํ„ฐ ์ฝ๋Š” ๊ฑธ ๊ถŒ์žฅ.

  • React๋กœ ์ž‘์—…ํ•˜๋Š” ํ”„๋กœ์„ธ์Šค๋Š” Thinking in React๋ฅผ ์ฐธ๊ณ . โ€œ์ƒํƒœโ€๋ฅผ ๊ณจ๋ผ๋‚ด๋Š” ๊ฒŒ ํ•ต์‹ฌ์ด๋‹ค. React๋Š” ์ง์ ‘ DOM์„ ์ฐพ์•„์„œ ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ  element๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ช…๋ นํ˜• ํ”„๋กœ๊ทธ๋ž˜๋ฐ์ด ์•„๋‹Œ ์„ ์–ธ์  ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค. ํ™”๋ฉด์— UI๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€์ง€ React์—๊ฒŒ ์ „๋‹ฌํ•˜๋ฉด ๋œ๋‹ค. React๋กœ UI(User Interface)๋ฅผ ๊ฐœ๋ฐœํ•  ๋•Œ ๋จผ์ € Component(์ปดํฌ๋„ŒํŠธ)๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ์กฐ๊ฐ๋“ค๋กœ ์ชผ๊ฐœ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์— ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ์ ํ•ฉํ•œ state๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์ปดํฌ๋„ŒํŠธ๋“ค์„ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฅด๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜์—์„œ๋Š” React๋ฅผ ์ด์šฉํ•˜์—ฌ ์ œํ’ˆ ๊ฒ€์ƒ‰์„ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํ…Œ์ด๋ธ”์„ ๋งŒ๋“œ๋Š” ๊ณผ์ •์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด๋ณผ๊ฒƒ ๋จผ์ € ๋ฐ์ดํ„ฐ(JSON)์™€ ๋””์ž์ธ ๋ชฉ์—…์„ ์ „๋‹ฌ๋ฐ›์•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. React์—์„œ UI๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ 5๊ฐ€์ง€ ์Šคํ…์„ ๋ฐŸ๊ฒŒ ๋œ๋‹ค.

Step 1: UI๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์ชผ๊ฐ ๋‹ค

๋ชฉ์—…์˜ ์ปดํฌ๋„ŒํŠธ์™€ ์„œ๋ธŒ ์ปดํฌ๋„ŒํŠธ์— ๋„ค๋ชจ ๋ฐ•์Šค๋ฅผ ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ ์ด๋ฆ„์„ ๋ถ™์ด๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•œ๋‹ค. ๋งŒ์•ฝ ๋””์ž์ด๋„ˆ์™€ ํ•จ๊ป˜ ํ˜‘์—…ํ•œ๋‹ค๋ฉด, ์ด๋ฏธ ๋””์ž์ธ ํˆด์—์„œ ์ปดํฌ๋„ŒํŠธ์— ๋ถ™์—ฌ๋†“์€ ์ด๋ฆ„์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ๋ฐฐ๊ฒฝ ์ง€์‹์— ๋”ฐ๋ผ ๋””์ž์ธ์„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์„ ์ƒ๊ฐํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.

  • Programming: ํ•จ์ˆ˜ ํ˜น์€ ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹๊ณผ ๋˜‘๊ฐ™๋‹ค. ๋‹จ์ผ์ฑ…์ž„์›์น™(SRP)์ด๋ฉฐ ์ฆ‰ ์ปดํฌ๋„ŒํŠธ๋Š” ์ด์ƒ์ ์œผ๋กœ ํ•œ ๊ฐ€์ง€์˜ ์ผ๋งŒ ํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ปค์ง€๋ฉด, ์ž‘์€ ์„œ๋ธŒ ์ปดํฌ๋„ŒํŠธ๋“ค๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค.

  • CSS: ๋ฌด์—‡์„ class selector๋กœ ๋งŒ๋“ค์ง€ ๊ณ ๋ คํ•œ๋‹ค.

  • Design: ๋””์ž์ธ ๋ ˆ์ด์–ด๋ฅผ ์–ด๋–ป๊ฒŒ ๊ตฌ์„ฑํ• ์ง€ ๊ณ ๋ คํ•œ๋‹ค.

๋งŒ์•ฝ JSON์ด ์ž˜ ๊ตฌ์กฐํ™”๋˜์–ด ์žˆ๋‹ค๋ฉด, UI์™€ ์ปดํฌ๋„ŒํŠธ ๊ตฌ์กฐ๋ฅผ ์ž์—ฐ์Šค๋žฉ๊ฒŒ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด, UI์™€ data model์€ ์ข…์ข… ๊ฐ™์€ ์•„ํ‚คํ…์ฒ˜, ๊ฐ™์€ ๋ชจ์–‘์„ ๊ฐ€์ง„๋‹ค. ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๊ฐ€ data model์˜ ํ•œ ์กฐ๊ฐ๊ณผ ๋งค์น˜๋˜๋„๋ก UI๋ฅผ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. github pr ProductTable์˜ Name๊ณผ Price๊ฐ€ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹Œ ๊ฒƒ์€ ์ทจํ–ฅ์˜ ์ฐจ์ด๋‹ค. ์ปดํฌ๋„ŒํŠธ๋กœ ๋งŒ๋“ค์–ด๋„ ๊ดœ์ฐฎ๋‹ค. ์ง€๊ธˆ์€ ๊ดœ์ฐฎ์ง€๋งŒ ์ •๋ ฌ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜๋Š” ๋“ฑ ํ—ค๋”๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉด, ๊ทธ๋•Œ๋Š” ProductTableHeader ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒŒ ํ•ฉ๋‹นํ•  ๊ฒƒ์ด๋‹ค. ํ˜„์žฌ ๋ชฉ์—…์œผ๋กœ๋ถ€ํ„ฐ ์ปดํฌํ„ดํŠธ๋ฅผ ์‹๋ณ„ํ–ˆ๊ณ  ๋ถ„๋ฆฌํ•˜๋ฉด์„œ ์ •๋ฆฌํ–ˆ๋‹ค. ๋ชฉ์—…์—์„œ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์— ๋“ฑ์žฅํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ๋Š” ๊ณ„์ธต์ ์œผ๋กœ ์ž์‹์œผ๋กœ ๋“ฑ์žฅํ•ด์•ผ ํ•œ๋‹ค.

  • FilterableProductTable

    • SearchBar

    • ProductTable

      • ProductCategoryRow

      • ProductRow

Step 2: React๋ฅผ ์ •์  ๋ฒ„์ „์œผ๋กœ ๋งŒ๋“ ๋‹ค

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

Props๋Š” ๋ถ€๋ชจ์—์„œ ์ž์‹์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. State๋Š” ์˜ค์ง ์ƒํ˜ธ์ž‘์šฉ์„ ์œ„ํ•œ, ์ฆ‰ ํ•ญ์ƒ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒƒ์ด๋‹ค. UI๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” state๋Š” ํ•„์š”์—†๋‹ค.

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ top down ๋ฐฉ์‹๊ณผ bottom up ๋ฐฉ์‹์ด ์žˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ผ๋ฐ˜์ ์œผ๋กœ top-down ๋ฐฉ์‹์ด ์‰ฝ๊ณ  ๊ทœ๋ชจ๊ฐ€ ์žˆ๋Š” ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์€ bottom-up ๋ฐฉ์‹์ด ์‰ฝ๋‹ค.

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ž‘์„ฑํ•œ ํ›„์—๋Š” ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋ Œ๋”๋งํ•˜๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋œ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ •์  app์ด๋ผ์„œ ์ปดํฌ๋„ŒํŠธ๋Š” JSX๋งŒ returnํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์ตœ์ƒ์œ„ ์ปดํฌ๋„ŒํŠธ๋Š” prop์œผ๋กœ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋ฐ›๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ์ด๊ฒƒ์€ one-way data flow(๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„)๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”๋ฐ ๋ฐ์ดํ„ฐ๊ฐ€ ์ตœ์ƒ์œ„ ๋ ˆ๋ฒจ ์ปดํฌ๋„ŒํŠธ๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋ฐ”๋‹ฅ์— ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ๊นŒ์ง€ ์œ„์—์„œ ์•„๋ž˜๋กœ ํ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

Step 3: ์ ์ ˆํ•œ UI state๋ฅผ ์ฐพ๋Š”๋‹ค

UI๋ฅผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ์„ ๋ณ€ํ™”์‹œํ‚ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š”๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ state๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

state๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ app์—์„œ ๊ธฐ์–ตํ•˜๊ณ  ์žˆ์–ด์•ผ ํ•˜๋Š” ์ตœ์†Œํ•œ์˜ ์ง‘ํ•ฉ์ด๋‹ค. state๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์›์น™์€ DRY (Don't Repeat Yourself). ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ•„์š”ํ•œ ์ตœ์†Œํ•œ์˜ ๊ฐ’๋งŒ state๋กœ ๋งŒ๋“ค๊ณ  ๊ทธ ์ด์™ธ์˜ ๊ฒƒ๋“ค์€ ํ•„์š”์— ๋”ฐ๋ผ state๋ฅผ ์ด์šฉํ•œ ์—ฐ์‚ฐ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์‡ผํ•‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ  ์žˆ๋‹ค๊ณ  ํ•˜๋ฉด ์•„์ดํ…œ์„ state ๋ฐฐ์—ด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ ๋ฆฌ์ŠคํŠธ์— ๋‹ด๊ธด ์•„์ดํ…œ์˜ ๊ฐœ์ˆ˜๋ฅผ ํ‘œํ˜„ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ๋˜ ๋‹ค๋ฅธ state์— ์•„์ดํ…œ ๊ฐœ์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ state ๋ฐฐ์—ด์—์„œ ๊ธธ์ด๋ฅผ ์ด์šฉํ•ด์•ผ ํ•œ๋‹ค.

์ด์ œ ์˜ˆ์ œ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋ฐ์ดํ„ฐ๋“ค์„ ์ƒ๊ฐํ•ด๋ณด์ž.

  1. ์ œํ’ˆ์˜ ์›๋ณธ ๋ฆฌ์ŠคํŠธ

  2. ์œ ์ €๊ฐ€ ์ž…๋ ฅํ•œ ๊ฒ€์ƒ‰์–ด

  3. ์ฒดํฌ๋ฐ•์Šค์˜ ๊ฐ’

  4. ํ•„ํ„ฐ๋œ ์ œํ’ˆ ๋ฆฌ์ŠคํŠธ

์ด์ค‘์— ๋ฌด์—‡์ด state์ผ๊นŒ? ์•„๋ž˜์— ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š”๊ฒƒ์„ ์ฐพ์•„๋ณด์ž.

  • ์‚ฌ์šฉ๋˜๋Š” ๋‚ด๋‚ด ๊ฐ’์ด ๋ณ€ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด state๊ฐ€ ์•„๋‹ˆ๋‹ค.

  • props๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ๋กœ๋ถ€ํ„ฐ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค๋ฉด state๊ฐ€ ์•„๋‹ˆ๋‹ค.

  • ์ปดํฌ๋„ŒํŠธ ๋‚ด์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” state๋‚˜ props๋ฅผ ์ด์šฉํ•˜์—ฌ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํŠนํžˆ state๊ฐ€ ์•„๋‹ˆ๋‹ค.

ํ•ด๋‹นํ•˜์ง€ ์•Š๋Š”๊ฒƒ๋“ค์€ state๊ฐ€ ๋  ๊ฒƒ์ด๋‹ค.

ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž.

  1. ์ œํ’ˆ์˜ ์›๋ณธ ๋ฆฌ์ŠคํŠธ๋Š” props๋กœ ์ „๋‹ฌ๋ฐ›๊ธฐ ๋•Œ๋ฌธ์— state๊ฐ€ ์•„๋‹ˆ๋‹ค.

  2. ๊ฒ€์ƒ‰์–ด๋Š” ๊ณ„์† ๋ณ€ํ•˜๊ณ , ๋ฌด์–ธ๊ฐ€๋กœ ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— state๋กœ ๋ณด์ธ๋‹ค.

  3. ์ฒดํฌ๋ฐ•์Šค์˜ ๊ฐ’๋„ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๊ณ„์† ๋ณ€ํ•˜๊ณ , ๋ฌด์–ธ๊ฐ€๋กœ๋ถ€ํ„ฐ ๊ณ„์‚ฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— state๋กœ ๋ณด์ธ๋‹ค.

  4. ํ•„ํ„ฐ๋œ ์ œํ’ˆ ๋ฆฌ์ŠคํŠธ๋Š” ์ƒํƒœ๊ฐ€ ์•„๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ œํ’ˆ์˜ ์›๋ณธ ๋ฆฌ์ŠคํŠธ์™€ ๊ฒ€์ƒ‰์–ด, ์ฒดํฌ๋ฐ•์Šค์˜ ๊ฐ’์œผ๋กœ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ’์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

์ฆ‰ ๊ฒ€์ƒ‰์–ด์™€ ์ฒดํฌ๋ฐ•์Šค ๊ฐ’๋งŒ state์ธ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


๋ Œ๋”๋ง

  • ๋ธŒ๋ผ์šฐ์ €์— view๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ

  • ํ•จ์ˆ˜๊ฐ€ ์‹คํ–‰๋˜๋Š” ๊ฒƒ

  • createRoot (React 18)

function Greeting() {
  return <p>Hello, world!</p>;
}

function main() {
  const element = document.getElementById('root');

  if (!element) {
    return;
  }

  const root = ReactDOM.createRoot(element);

  root.render(<Greeting />);
}

main();
  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ Root๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๊ณ , ์—ฌ๋Ÿฌ ๋ฒˆ renderํ•  ์ˆ˜ ์žˆ๋‹ค.

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

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

    • diffing algorithm

๋ฆฌ๋ Œ๋”๋ง

State๊ฐ€ ๋ฐ”๋€” ๋•Œ ๋ฆฌ๋ Œ๋”๋ง์ด ๋˜๊ณ , ์ž๋…€๋“ค๋„ ๋ฆฌ๋ Œ๋”๋ง์ด ๋œ๋‹ค.

Component๋Š” ์ตœ์ƒ์œ„์— ํ•˜๋‚˜์˜ ๋ถ€๋ชจ๊ฐ€ ์žˆ์–ด์•ผ ํ•œ๋‹ค.

  • React.createElement

    • jsx๊ฐ€ js๋กœ ๋ณ€ํ™˜๋  ๋•Œ ์œ„ ๋ฉ”์†Œ๋“œ๋ฅผ ์‹คํ–‰ํ•œ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ํƒœ๊ทธ ํ˜น์€ ์ปดํฌ๋„ŒํŠธ๋ฅผ 1๊ฐœ ๋ฐ›๋Š”๋‹ค.

  • Fragment

    • DOM์— ๋ Œ๋”๋ง์ด ๋  ๋•Œ ์‚ฌ๋ผ์ง€๋Š” ํƒœ๊ทธ, ์ฝ”๋“œ ์ž‘์„ฑ์‹œ ๋ถ€๋ชจ ํƒœ๊ทธ์˜ ์—ญํ• ์„ ํ•œ๋‹ค.

๋ณด๋„ˆ์Šค

๋ฉด์ ‘ ๋•Œ ์ข…์ข… ๋‚˜์˜ค๋Š” (์“ธ๋ชจ ์—†๋Š”) ์งˆ๋ฌธ์ธ โ€œReact๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ธ๊ฐ€์š”, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ๊ฐ€์š”?โ€์— ๋Œ€ํ•œ React ๊ฐœ๋ฐœ์ž์˜ ๋‹ต๋ณ€

์ œ์–ด์˜ ์—ญ์ „(IoC: Inversion of Control)์ด Framework์˜ ์ฃผ์š”ํ•œ ํŠน์ง•์ด๊ณ , React๋Š” IoC๋ฅผ ํ†ตํ•ด ์ƒํƒœ์™€ ์—…๋ฐ์ดํŠธ๊ฐ€ ์–ฝํžŒ ๋ณต์žกํ•œ ์ƒํ™ฉ์„ ๊ฐ„๋‹จํžˆ ์„ ์–ธํ˜• UI๋กœ ๊ตฌ์„ฑํ•˜๋Š” ํ˜œํƒ์„ ๋ˆ„๋ฆฐ๋‹ค(์ด๊ฒŒ ๋ฐ”๋กœ React์˜ ์ฒซ ๋ฒˆ์งธ ํŠน์ง•์ด๋‹ค). ๊ทธ ๋ˆ„๊ตฌ๋„ ๋งค๋ฒˆ root๋ฅผ renderํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์“ฐ๋ฉด์„œ โ€œ์ด๊ฒŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ง€!โ€๋ผ๋ฉฐ ๊ฐํƒ„ํ•˜์ง€ ์•Š๋Š”๋‹ค.

ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ๋Š” (Martin Fowler์˜ ๊ฐœํƒ„์ฒ˜๋Ÿผ) IoC๋Š” IoC ์ปจํ…Œ์ด๋„ˆ์™€ ์—ฎ์—ฌ์„œ DI์™€ ๋™์˜์–ด์ฒ˜๋Ÿผ ์“ฐ์ด๊ณ , Next.js, Remix ๊ฐ™์€ ๊ฑธ Framework์ด๋ผ๊ณ  ๋ถ€๋ฅด๋‹ˆ ๋ฉด์ ‘ ๋•Œ ๊ดœํžˆ ์ด๋Ÿฐ ๊ฑธ๋กœ ์‹ธ์šฐ์ง€๋Š” ๋ง์ž. โ€œ๋ฆฌ์•กํŠธ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ด๋ ‡๊ฒŒ ์ด์•ผ๊ธฐํ–ˆ๋‹ค๋‹ˆ๊นŒ์š”!โ€๋ผ๊ณ  ํ•ด๋ด์•ผ ์„œ๋กœ ๊ฐ์ •๋งŒ ์ƒํ•  ๋ฟ์ด๋‹ค.

์šฐ๋ฆฌ๋Š” ์Šค์Šค๋กœ ๋ชฐ๋ž๋”๋ผ๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์ œ์–ด์˜ ์—ญ์ „์„ ๊ฒฝํ—˜ํ•˜๊ณ  ์žˆ๋‹ค. ์Šค์Šค๋กœ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๋”๋ผ๋„ ๊ตฌํ˜„์ฒด์— ๊ฐ’์„ ์ „๋‹ฌํ•ด์ฃผ๋ฉด, ๊ตฌํ˜„์ฒด๊ฐ€ ๋Œ€์‹ ํ•ด์„œ ํŠน์ • ์—ญํ• ์„ ํ•ด์ฃผ๋Š” ๊ฒƒ. React์˜ ์„ ์–ธ์ ์ธ ๋ Œ๋”๋ง๋„ ์ œ์–ด์˜ ์—ญ์ „์ด๋‹ค.

Last updated