Frontend ๐Ÿ“š/React

[React] React์˜ ํ•ต์‹ฌ ๊ฐ€์น˜

leejaejae 2025. 2. 25. 13:34

๐Ÿ”น React ๋ž€?

  • Facebook์—์„œ ๋งŒ๋“  JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
  • ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ UI ์ปดํฌ๋„ŒํŠธ๋กœ ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์œผ๋กœ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์ถ•์— ์‚ฌ์šฉ
  • ๋‹จ์ˆœํ•œ ์›น์‚ฌ์ดํŠธ๋ถ€ํ„ฐ ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊นŒ์ง€ ๋‹ค์–‘ํ•˜๊ฒŒ ํ™œ์šฉ ๊ฐ€๋Šฅ

 

๐Ÿ”น React์˜ ํ•ต์‹ฌ ๊ฐ€์น˜

1. ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜

  • ์ปดํฌ๋„ŒํŠธ๋ผ๋Š” ๋…๋ฆฝ์ ์ธ UI ๋‹จ์œ„๋กœ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ตฌ์„ฑ
  • ํ•˜๋‚˜์˜ ํŽ˜์ด์ง€๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‚˜๋ˆ„๋ฉด ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋†’์•„์ง€๊ณ  ์œ ์ง€๋ณด์ˆ˜๊ฐ€ ์‰ฌ์›Œ์ง

2. ๊ฐ€์ƒ DOM(Virtual DOM)

  • ์‹ค์ œ DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜๋Š” ๋Œ€์‹ , ๊ฐ€์ƒ DOM์„ ์‚ฌ์šฉํ•ด ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•จ
  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋ฉ”๋ชจ๋ฆฌ ์ƒ์—์„œ ๋น„๊ต(diffing)ํ•œ ํ›„, ์ตœ์†Œํ•œ์˜ ์—…๋ฐ์ดํŠธ๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•ด์„œ ๋ Œ๋”๋ง ์„ฑ๋Šฅ์„ ํ–ฅ์ƒ์‹œํ‚ด(๋ฐ”๋€ ๋ถ€๋ถ„๋งŒ ์—…๋ฐ์ดํŠธ)
  • ์˜ˆ๋ฅผ ๋“ค์–ด, ์‡ผํ•‘๋ชฐ์—์„œ ์žฅ๋ฐ”๊ตฌ๋‹ˆ์— ์ถ”๊ฐ€ํ•  ๋•Œ ์ „์ฒด ํŽ˜๋ฆฌ์ง€๊ฐ€ ์ƒˆ๋กœ๊ณ ์นจ๋˜์ง€ ์•Š๋Š” ์ด์œ ์ž„

3. ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„(One-way Data Flow)

  • ๋ถ€๋ชจ → ์ž์‹ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ๋ฐ์ดํ„ฐ๊ฐ€ ํ๋ฆ„
  • Props๋ฅผ ์‚ฌ์šฉํ•ด ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ ๋ฐ์ดํ„ฐ ์ „๋‹ฌํ•จ

4. ์ƒํƒœ ๊ด€๋ฆฌ(State Management)

  • ์ปดํฌ๋„ŒํŠธ๋Š” state๋ผ๋Š” ๋‚ด๋ถ€ ์ƒํƒœ๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Œ
  • useState ํ›…์„ ์‚ฌ์šฉํ•˜๋ฉด ๋™์ ์ธ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Œ

5. ์ •๋ฆฌ

  • react๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์œผ๋กœ UI๋ฅผ ๊ตฌ์„ฑํ•ด ์œ ์ง€๋ณด์ˆ˜์™€ ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚จ
  • ๊ฐ€์ƒ DOM, ๋‹จ๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„, ์ƒํƒœ๊ด€๋ฆฌ(useState, Redux)๋ฅผ ํ†ตํ•ด ์„ฑ๋Šฅ ์ตœ์ ํ™” 

 

๐Ÿ“Œ ์‹ค์ œ DOM vs ๊ฐ€์ƒ DOM

  • DOM ์ด๋ž€?
    • DOM(Document Object Model)์€ ์›น์‚ฌ์ดํŠธ์˜ ํ™”๋ฉด์„ ๊ตฌ์„ฑํ•˜๋Š” ์š”์†Œ๋“ค(HTML ํƒœ๊ทธ๋“ค)์„ ํŠธ๋ฆฌ(Tree) ๊ตฌ์กฐ๋กœ ํ‘œํ˜„ํ•œ ๊ฒƒ
    • ์›น์‚ฌ์ดํŠธ๋ฅผ ๋งŒ๋“ค ๋•Œ HTML ์ฝ”๋“œ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•ด์„๋˜๋ฉด์„œ DOM ๊ตฌ์กฐ๊ฐ€ ๋งŒ๋“ค์–ด์ง
    • ์‰ฝ๊ฒŒ ๋งํ•˜๋ฉด, HTML์„ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€ํ™˜ํ•œ ๊ตฌ์กฐ
  • ์‹ค์ œ DOM ์ด๋ž€?
    • ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” HTML ํƒœ๊ทธ๋“ค๋กœ ๋งŒ๋“ค์–ด์ง„ ํ™”๋ฉด ๊ตฌ์กฐ, HTML ์ฝ”๋“œ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ•ด์„๋˜๋ฉด ์‹ค์ œ๋กœ DOM์ด ๋งŒ๋“ค์–ด์ง
    • ์‹ค์ œ DOM ํŠน์ง•: ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ง์ ‘ ํ™”๋ฉด์„ ๊ทธ๋ ค์คŒ, ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ๋งˆ๋‹ค ์ „์ฒด DOM์„ ๋‹ค์‹œ ๊ทธ๋ ค์•ผ ํ•จ → ๋Š๋ฆผ!, ์ž‘์€ ๋ณ€๊ฒฝ์ด ์ƒ๊ฒจ๋„ ์ „์ฒด ํŽ˜์ด์ง€๊ฐ€ ์—…๋ฐ์ดํŠธ๋  ์ˆ˜ ์žˆ์Œ
  • ๊ฐ€์ƒ DOM์ด๋ž€?
    • ์‹ค์ œ DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜์ง€ ์•Š๊ณ , ๊ฐ€์งœ DOM(๊ฐ€์ƒ DOM)์„ ๋จผ์ € ๋ณ€๊ฒฝํ•œ ํ›„, ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•˜๋Š” ๋ฐฉ์‹
    • ๋™์ž‘ ๋ฐฉ์‹: ๋จผ์ € ๊ฐ€์ƒ DOM์„ ๋ณ€๊ฒฝ → ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ๋น„๊ต(diffing)ํ•œ ํ›„, ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜ → ๋ธŒ๋ผ์šฐ์ €๋Š” ์ตœ์†Œํ•œ์˜ ์—…๋ฐ์ดํŠธ๋งŒ ์ง„ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋น ๋ฆ„
    • ๊ฐ€์ƒ DOM ํŠน์ง•: ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์ฐพ์•„์„œ ์—…๋ฐ์ดํŠธ → ๋น ๋ฆ„, ์‹ค์ œ DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜์ง€ ์•Š์Œ → ์„ฑ๋Šฅ ์ตœ์ ํ™” ๊ฐ€๋Šฅ, ํ™”๋ฉด์ด ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์‡ผํ•‘๋ชฐ, SNS, ๋Œ€์‹œ๋ณด๋“œ ๊ฐ™์€ ๊ณณ์—์„œ ์œ ์šฉ
  • ๋น„๊ตํ•˜๊ธฐ → ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๊ธ€์ž๊ฐ€ ๋ฐ”๋€Œ๋Š” ๊ฒฝ์šฐ
    • ์‹ค์ œ DOM ๋ฐฉ์‹(๋Š๋ฆผ): ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ์ „์ฒด ํ™”๋ฉด์ด ๋‹ค์‹œ ๊ทธ๋ ค์ง → ๋ณ€๊ฒฝํ•  ํ•„์š” ์—†๋Š” ์š”์†Œ๋„ ๋‹ค์‹œ ์—…๋ฐ์ดํŠธ๋จ → ๋น„ํšจ์œจ์ 
    • ๊ฐ€์ƒ DOM ๋ฐฉ์‹(๋น ๋ฆ„): ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ๊ฐ€์ƒ DOM์—์„œ ๋จผ์ € ๋ณ€๊ฒฝํ•จ → ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์ฐพ์•„์„œ ์‹ค์ œ DOM์— ๋ฐ˜์˜ → ๋ถˆํ•„์š”ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ค„์—ฌ์„œ ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘
  • ๊ฐ€์ƒ DOM์ด ์ค‘์š”ํ•œ ์ด์œ 
    • ์‹ค์ œ DOM์„ ์ง์ ‘ ์กฐ์ž‘ํ•˜๋ฉด ๋Š๋ฆผ → React๋Š” ๊ฐ€์ƒ DOM์„ ์‚ฌ์šฉํ•ด์„œ ๋น ๋ฅด๊ฒŒ ์—…๋ฐ์ดํŠธ

 

๐Ÿ“Œ ๋ฆฌ์•กํŠธ๋Š” ๋น„๋™๊ธฐ์ผ๊นŒ?

  • ๋ฆฌ์•กํŠธ์˜ ๊ธฐ๋ณธ ๋™์ž‘์€ “๋™๊ธฐ์ ”
    • ๋ฆฌ์•กํŠธ๋Š” ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž„
    • ์ƒํƒœ(state)๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ™”๋ฉด์ด ๋‹ค์‹œ ๋ Œ๋”๋ง ๋˜๋Š” ๊ตฌ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
    • ํ•˜์ง€๋งŒ ์ผ๋ฐ˜์ ์ธ ๋™๊ธฐ ์ฝ”๋“œ์ฒ˜๋Ÿผ ํ•œ ์ค„์”ฉ ์‹คํ–‰๋จ
  • ํ•˜์ง€๋งŒ, ๋ฆฌ์•กํŠธ์˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ๋Š” "๋น„๋™๊ธฐ์ " ์œผ๋กœ ๋™์ž‘ํ•จ!
    • react์˜ setState๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ์Œ
    • ์ฆ‰, ๋ฐ”๋กœ ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๊ณ , ํ•œ ๋ฒˆ์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ์ƒํƒœ ๋ณ€๊ฒฝ์„ ๋ชจ์•„์„œ ์ฒ˜๋ฆฌํ•จ (์—ฌ๋Ÿฌ ๋ฒˆ ํ˜ธ์ถœํ•ด์„œ ์ตœ์ข…์ ์œผ๋กœ ํ•œ ๋ฒˆ๋งŒ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ)
    • ๊ทธ๋ž˜์„œ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ ์ด์ „ ์ƒํƒœ ๊ฐ’์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ํ•จ์ˆ˜ํ˜• ์—…๋ฐ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•จ
  • ๋ฆฌ์•กํŠธ๋Š” "๋น„๋™๊ธฐ ์ž‘์—…" ์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ?
    • ๋ฆฌ์•กํŠธ์—์„œ๋Š” ๋น„๋™๊ธฐ ์ž‘์—…(์˜ˆ: API ํ˜ธ์ถœ, ๋ฐ์ดํ„ฐ ์š”์ฒญ)์„ ํ•  ๋•Œ useEffect์™€ fetch ๊ฐ™์€ ๋น„๋™๊ธฐ ํ•จ์ˆ˜(async/await)๋ฅผ ์‚ฌ์šฉํ•จ
    • useEffect ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฒ˜์Œ ๋ Œ๋”๋ง๋  ๋•Œ API๋ฅผ ํ˜ธ์ถœํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์•„์˜จ ํ›„ ์ƒํƒœ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•จ
      → ์ด ๊ณผ์ •์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋ผ์„œ UI๊ฐ€ ๋ฉˆ์ถ”์ง€ ์•Š๊ณ  ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์Œ
  • ๊ฒฐ๋ก : ๋ฆฌ์•กํŠธ๋Š” ๋น„๋™๊ธฐ์ผ๊นŒ !?
    • ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฆฌ์•กํŠธ ์ž์ฒด๋Š” ๋™๊ธฐ์ ์œผ๋กœ ๋™์ž‘ํ•จ
    • ํ•˜์ง€๋งŒ setState๋Š” ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Œ(์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด ํ•œ ๋ฒˆ์— ์ฒ˜๋ฆฌ)
    • ๋น„๋™๊ธฐ ์ž‘์—…(API ํ˜ธ์ถœ ๋“ฑ)์€ useEffect + async/await ๋ฅผ ํ™œ์šฉํ•ด์„œ ์ฒ˜๋ฆฌํ•จ
      → ์ฆ‰! ๋ฆฌ์•กํŠธ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋™๊ธฐ์ ์ด์ง€๋งŒ, ์ผ๋ถ€ ๋™์ž‘(setState, API ํ˜ธ์ถœ ๋“ฑ)์€ ๋น„๋™๊ธฐ์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋จ