๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐ŸŒณ React

[React, Vue] React์™€ Vue์˜ ํŠน์ง•, ์–ด๋–ค ์ฐจ์ด์ ์ด ์žˆ์„๊นŒ?

by hyeong._.ing 2026. 8. 20.

 

 

 

React๋Š” ์›๋ž˜ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ์ง€๋งŒ
์š”์ฆ˜๋“ค์–ด Vue๋„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์ถ”์„ธ์ธ ๊ฒƒ ๊ฐ™๋‹ค!
์–ด๋–ค ์ ์ด ์–ด๋–ป๊ฒŒ ๋‹ค๋ฅธ์ง€ ํ•œ ๋ฒˆ ์•Œ์•„๋ณด์ž.

 

 

 

 

 

1. DOM (Document Object Model)
๋จผ์ € DOM์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ์žˆ์–ด์•ผ Vue์™€ React์˜ ํŠน์ง•์„ ๋” ์ž˜ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

  • DOM์€ HTML ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ดํ•ดํ•˜๊ณ  ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํŠธ๋ฆฌ ๊ตฌ์กฐ ํ˜•ํƒœ์˜ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•œ ๊ฒƒ์ด๋‹ค.
  • HTML ์ž์ฒด๋Š” ๋‹จ์ˆœํ•œ ํ…์ŠคํŠธ ํŒŒ์ผ์ด๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์›น ํŽ˜์ด์ง€์˜ ํ…์ŠคํŠธ๋ฅผ ๋ฐ”๊พธ๊ฑฐ๋‚˜ ์Šคํƒ€์ผ์„ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด HTML ์š”์†Œ๋“ค์„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด ํ˜•ํƒœ๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ ค๋†“์•„์•„์•ผ ํ•˜๋Š”๋ฐ, ๊ทธ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ DOM์ด๋‹ค.
  • DOM์€ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
  • ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋กœ DOM์„ ์กฐ์ž‘ํ•˜๋ฉด ๋ธŒ๋ผ์šฐ์ €๋Š” ํ™”๋ฉด์˜ ์œ„์น˜์™€ ํฌ๊ธฐ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” Reflow์™€ ํ™”๋ฉด์„ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” Repaint ๊ณผ์ •์„ ๊ฑฐ์นœ๋‹ค.
  • ๊ทธ๋ž˜์„œ ์ด๋Ÿฐ ๋ฌธ์ œ ๋•Œ๋ฌธ์— React์™€ Vue ๋ชจ๋‘ ๊ฐ€์ƒ DOM(Virtual DOM)์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ์ง„์งœ DOM ๋Œ€์‹  ๋ฉ”๋ชจ๋ฆฌ์ƒ ๋งค์šฐ ๊ฐ€๋ฒผ์šด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๊ฐ์ฒด ํ˜•ํƒœ์˜ ํŠธ๋ฆฌ๋ฅผ ๋งŒ๋“ ๋‹ค.
  • ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ์ƒˆ๋กœ์šด ๊ฐ€์ƒ DOM์„ ์ƒ์„ฑํ•˜๊ณ  ์ด์ „ ๊ฐ€์ƒ DOM๊ณผ ๋น„๊ตํ•˜๋ฉฐ ์‹ค์ œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ์ฐพ์•„๋‚ธ๋‹ค.
  • ๋ณ€๊ฒฝ๋œ ์ตœ์†Œํ•œ์˜ ์š”์†Œ๋งŒ ์ง„์งœ DOM์— ํ•œ ๋ฒˆ์— ์ ์šฉํ•œ๋‹ค. -> Reflow์™€ Repaint๋ฅผ ์ตœ์†Œํ™”
  • ์ด๋ ‡๊ฒŒ React์™€ Vue๋Š” ๋ชจ๋‘ Virtual DOM์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ๊ทธ๋Ÿฌ๋‚˜ DOM์„ ์—…๋ฐ์ดํŠธํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€ํ™”๋ฅผ ๊ฐ์ง€ํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜๊ณผ DOM์„ ์ •์˜ํ•˜๋Š” ๋ฌธ๋ฒ•์—๋Š” ํฐ ์ฐจ์ด๊ฐ€ ์žˆ๋‹ค.

 

 

 


 

 

 

 

2. React

์ƒํƒœ๋ฅผ UI๋กœ ํ‘œํ˜„ํ•˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

  • React๋Š” ์›น์‚ฌ์ดํŠธ ํ™”๋ฉด์„ ์ปดํฌ๋„ŒํŠธ๋กœ ๋‚˜๋ˆ„์–ด ๋งŒ๋“  ๋’ค, ํ•„์š”ํ•œ ์กฐ๊ฐ๋งŒ ๋ถ™์—ฌ์„œ ํ™”๋ฉด์„ ๋งŒ๋“œ๋Š” ๋„๊ตฌ์ด๋‹ค.
  • ์˜›๋‚ ์—๋Š” "๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํ…์ŠคํŠธ๋ฅผ ๋นจ๊ฐ„์ƒ‰์œผ๋กœ ๋ฐ”๊ฟ”๋ผ."๋ผ๊ณ  ์ผ์ผ์ด ์ง€์‹œํ•ด์•ผ ํ–ˆ๋‹ค.
  • React๋Š” "๋ฐ์ดํ„ฐ๊ฐ€ ์„ฑ๊ณต์ด๋ฉด ์ดˆ๋ก์ƒ‰, ์‹คํŒจ๋ฉด ๋นจ๊ฐ„์ƒ‰"์ด๋ผ๊ณ  ๊ทœ์น™๋งŒ ์ •ํ•ด๋‘๋ฉด, ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋Š” ์ˆœ๊ฐ„ ์•Œ์•„์„œ ํ™”๋ฉด์€ ๋ณ€์‹ ์‹œํ‚จ๋‹ค.
  • ์ปดํฌ๋„ŒํŠธ ์ค‘์‹ฌ ์‚ฌ๊ณ ์™€ Hook์„ ํ†ตํ•œ ๋กœ์ง ์žฌ์‚ฌ์šฉ
    React๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ ๋…๋ฆฝ์ ์ธ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ์–ด ๊ฐœ๋ฐœํ•œ๋‹ค. View์™€ ๋กœ์ง์„ ์™„๋ฒฝํ•˜๊ฒŒ ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋‹จ์œ„๋กœ ๋ถ„๋ฆฌํ•œ๋‹ค. ํŠนํžˆ useState(์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ™”๋ฉด์„ ๋ฐ”๊ฟˆ), useEffect(ํ™”๋ฉด์ด ๊ทธ๋ ค์ง„ ๋’ค ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ํƒ€์ด๋จธ๋ฅผ ์„ค์ •ํ•˜๋Š” ๋“ฑ ๋ถ€์ˆ˜์ ์ธ ์ž‘์—… ์ฒ˜๋ฆฌ) ๊ฐ™์€ React Hooks๋ฅผ ํ™œ์šฉํ•ด ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์ƒํƒœ ๊ด€๋ฆฌ์™€ ์ƒ๋ช…์ฃผ๊ธฐ ์ œ์–ด๋ฅผ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋ถˆ๋ณ€์„ฑ ๊ธฐ๋ฐ˜์˜ ์ƒํƒœ ๊ฐ์ง€
    React๋Š” ์ƒํƒœ๋Š” ์ ˆ๋Œ€ ์ง์ ‘ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋ถˆ๋ณ€์„ฑ ์›์น™์„ ๋”ฐ๋ฅธ๋‹ค. useState(์ƒํƒœ๋ฅผ ๊ธฐ์–ตํ•˜๊ณ  ์ƒํƒœ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ํ™”๋ฉด์„ ๋ฐ”๊ฟˆ)์˜ ๊ฐฑ์‹  ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ์•„์˜ˆ ์ƒˆ๋กœ์šด ๊ฐ์ฒด๋‚˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•ด ๋„˜๊ฒจ์ฃผ์–ด์•ผ๋งŒ React๊ฐ€ ๋ณ€ํ™”๋ฅผ ์ธ์ง€ํ•˜๊ณ  ๊ฐ€์ƒ DOM์˜ ๋น„๊ต ๋ฐ ๋ฆฌ๋ Œ๋”๋ง ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.
  • JSX(JavaScript XML)
    React๋Š” JSX๋ผ๋Š” ๋ฌธ๋ฒ•์„ ํ†ตํ•ด HTML๊ณผ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ•˜๋‚˜์˜ ๋กœ์ง ์•ˆ์—์„œ ๊ฒฐํ•ฉํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋ณ„๋„์˜ ํ”„๋ ˆ์ž„์›Œํฌ ์ „์šฉ ์ง€์‹œ์–ด๋ฅผ ๋ฐฐ์šธ ํ•„์š” ์—†์ด ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ ์ˆœ์ˆ˜ ๋ฌธ๋ฒ•์„ ์‚ฌ์šฉํ•ด UI๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹จ๋ฐ˜ํ–ฅ ๋ฐ์ดํ„ฐ ํ๋ฆ„
    React์˜ ๋ฐ์ดํ„ฐ๋Š” ํ•ญ์ƒ ๋ถ€๋ชจ ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋กœ๋งŒ ํ๋ฅธ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฐ์ดํ„ฐ ํ๋ฆ„์ด ํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ์–ด์„œ ์•ฑ์˜ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋”๋ผ๋„ ๋ฐ์ดํ„ฐ์˜ ๋ณ€ํ™” ์›์ธ์„ ์ถ”์ ํ•˜๊ณ  ๋””๋ฒ„๊น…ํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • ๊ฐœ๋ฐœ์ž๊ฐ€ ํ”„๋กœ์ ํŠธ ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋ผ์šฐํŒ…, ์ƒํƒœ ๊ด€๋ฆฌ(TanStack Query, Redux, Zustand ๋“ฑ) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์กฐํ•ฉํ•˜์—ฌ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋†’์€ ์œ ์—ฐ์„ฑ์„ ๊ฐ€์ง„๋‹ค.

 

 

Q. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ฐจ์ด์ ์ด ๋ฌด์—‡์ธ๊ฐ€์š”?

A. ์ด ๋‘˜์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ์ œ์–ด๊ถŒ์˜ ํ๋ฆ„์„ ๋ˆ„๊ฐ€ ์ฃผ๋„ํ•˜๋А๋ƒ์— ์žˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ œ์–ด๊ถŒ์„ ๊ฐ€์ง„๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•„์š”ํ•œ ์‹œ์ ์— ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์›ํ•˜๋Š” ๊ณณ์—๋งŒ ์ž์œ ๋กญ๊ฒŒ ์„ ํƒํ•ด์„œ ์ ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค. ๊ทธ๋ž˜์„œ ์ž์œ ๋„๊ฐ€ ํ”„๋ ˆ์ž„์›Œํฌ์— ๋น„ํ•ด ์ƒ๋Œ€์ ์œผ๋กœ ๋†’๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ฃผ๋„๊ถŒ์„ ๊ฐ€์ง„๋‹ค. ์ด๋ฏธ ํ”„๋ ˆ์ž„์›Œํฌ์— ๊ทœ์น™์ด ์žˆ๊ณ  ๊ทธ๊ฑฐ์— ๋”ฐ๋ผ ์ž‘์„ฑํ•˜๋ฉด ์•Œ์•„์„œ ํ˜ธ์ถœ๋˜๋Š” ๋ฐฉ์‹์ด๋‹ค. ์•„๋ฌด๋ž˜๋„ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ •ํ•œ ๊ทœ๊ฒฉ๊ณผ ๊ตฌ์กฐ๋ฅผ ๋”ฐ๋ผ์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ž์œ ๋„๋Š” ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ํŽธ์ด๋‹ค.

๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋Š” React, jQuery, NumPy๊ฐ€ ์žˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋Œ€ํ‘œ์ ์ธ ์˜ˆ์‹œ๋Š” Spring, Django, Next.js, Vue.js๊ฐ€ ์žˆ๋‹ค.

 

 

 

 


 

 

 

 

3. Vue

๊ณต์‹์ ์ธ ํ‹€์„ ์ œ๊ณตํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ

  • Vue๋Š” ๊ฐœ๋ฐœ์— ํ•„์š”ํ•œ ํ•ต์‹ฌ ๋„๊ตฌ๋ฅผ ๊ณต์‹์ ์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋‹ค.
  • ๋ผ์šฐํŒ…(Vue Router), ์ƒํƒœ ๊ด€๋ฆฌ(Pinia), ๋นŒ๋“œ ๋„๊ตฌ(Vite) ๋“ฑ์ด ๊ณต์‹์ ์ธ ํ‘œ์ค€์œผ๋กœ ์ •๋ฆฝ๋˜์–ด ์žˆ๋‹ค.
  • ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ๋ฅผ ๊ณ ๋ฏผํ•˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ด๊ณ  ํ˜‘์—… ์‹œ ํ†ต์ผ๋œ ์ฝ”๋“œ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์‰ฝ๋‹ค.
  • SFC(Single File Component)
    HTML, CSS, JS์˜ ์ง๊ด€์ ์ธ ๋ถ„๋ฆฌ๋กœ Vue๋Š” .vue๋ผ๋Š” ๋‹จ์ผ ํŒŒ์ผ ์•ˆ์— <template>, <script>, <style> ์˜์—ญ์„ ๋ช…ํ™•ํžˆ ๋‚˜๋ˆ„์–ด ์ž‘์„ฑํ•œ๋‹ค. ๊ธฐ์กด ์›น ๊ฐœ๋ฐœ ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๊ณ  ์ฝ”๋“œ์˜ ์—ญํ•  ๊ตฌ๋ถ„์ด ์ง๊ด€์ ์ด๋‹ค.
  • ๋ฐ˜์‘ํ˜• ์‹œ์Šคํ…œ๊ณผ ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ
    Vue๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ Proxy ๊ธฐ๋ฐ˜ ๋ฐ˜์‘ํ˜• ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•ด์„œ ๊ฐ์ฒด์˜ ๊ฐ’์„ ์ง์ ‘ ์ˆ˜์ •ํ•˜๊ธฐ๋งŒ ํ•ด๋„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ํ™”๋ฉด์„ ๊ฐฑ์‹ ํ•œ๋‹ค. v-model ์ง€์‹œ์–ด๋ฅผ ํ†ตํ•ด ์–‘๋ฐฉํ–ฅ ๋ฐ์ดํ„ฐ ๋ฐ”์ธ๋”ฉ์„ ์ง€์›ํ•˜๋ฉฐ ํผ ์ž…๋ ฅ๊ฐ’์„ ์ƒํƒœ์™€ ๋™๊ธฐํ™”ํ•  ๋•Œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ฝ”๋“œ(ํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค ๋•Œ ์ตœ์†Œํ•œ์˜ ์ˆ˜์ •๋งŒ ๊ฑฐ์น˜๊ฑฐ๋‚˜ ๊ทธ๋Œ€๋กœ ๋ฐ˜๋ณตํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ํ•„์ˆ˜์ ์ธ ํ‘œ์ค€ ์ฝ”๋“œ ์กฐ๊ฐ)๋ฅผ ํš๊ธฐ์ ์œผ๋กœ ์ค„์—ฌ์ค€๋‹ค.
  • ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ํ†ตํ•œ ๊ฐ„ํŽธํ•œ UI ์ œ์–ด
    Vue๋Š” HTML ํƒœ๊ทธ ์•ˆ์— v-if(์กฐ๊ฑด์ด ์ฐธ์ผ ๋•Œ๋งŒ DOM์— ์š”์†Œ๋ฅผ ์ƒ์„ฑ), v-for(๋ฐฐ์—ด์ด๋‚˜ ๊ฐ์ฒด ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ผํ•œ DOM ์š”์†Œ๋ฅผ ๋ฐ˜๋ณตํ•˜์—ฌ ๋ Œ๋”๋ง), v-show(DOM ์š”์†Œ๋ฅผ ํ•ญ์ƒ ์ƒ์„ฑํ•ด๋‘๊ณ  ์กฐ๊ฑด์— ๋”ฐ๋ผ CSS์˜ display ์†์„ฑ๋งŒ ๋ณ€๊ฒฝํ•˜์—ฌ ํ™”๋ฉด์— ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ๋ณด์—ฌ์คŒ) ๊ฐ™์€ ๋””๋ ‰ํ‹ฐ๋ธŒ๋ฅผ ์‚ฝ์ž…ํ•ด ํ…œํ”Œ๋ฆฟ ์ œ์–ด๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด HTML ๊ตฌ์กฐ ๋‚ด์—์„œ ์กฐ๊ฑด๋ถ€ ๋ ˆ๋”๋ง์ด๋‚˜ ๋ฐ˜๋ณต ์ถœ๋ ฅ์„ ์ง๊ด€์ ์ด๊ณ  ๋น ๋ฅด๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Composition API๋ฅผ ํ†ตํ•œ ์œ ์—ฐํ•œ ๋กœ์ง ์žฌ์‚ฌ์šฉ
    Vue 3๋ถ€ํ„ฐ ๋„์ž…๋œ Composition API๋Š” React์˜ Hooks์™€ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฐœ๋ฐœ ๋ฐฉ์‹์„ ์ œ๊ณตํ•œ๋‹ค. ์—ฐ๊ด€๋œ ์ƒํƒœ์™€ ๋กœ์ง์„ ํ•˜๋‚˜์˜ ํ•จ์ˆ˜ ๋‹จ์œ„๋กœ ๋ฌถ์–ด ๋ชจ๋“ˆํ™”ํ•  ์ˆ˜ ์žˆ๊ณ  ์•ฑ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง€๋”๋ผ๋„ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์€ ์ˆ˜์ค€์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

 

Q. Composition API๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€?

A. Composition API๋Š” <script setup> ํƒœ๊ทธ์™€ ref, reactive ๋“ฑ์˜ ๋ฐ˜์‘ํ˜• API๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ด€๋ จ ๋กœ์ง์„ ํ•œ๊ณณ์— ๋ชจ์•„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.  <script setup>์€ Composition API๋ฅผ ํ›จ์”ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฌธ๋ฒ• ์„คํƒ•์ด๋‹ค. ref( )๋Š” ๊ธฐ๋ณธ ํƒ€์ž…์˜ ๊ฐ’(์ˆซ์ž, ๋ฌธ์ž์—ด ๋“ฑ)์„ ๋ฐ˜์‘ํ˜•์œผ๋กœ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์˜์—ญ์—์„œ๋Š” .value๋กœ ์ ‘๊ทผํ•œ๋‹ค. ๊ด€๋ จ ์žˆ๋Š” ๋ฐ์ดํ„ฐ, ๋ฉ”์„œ๋“œ, ์ƒ๋ช…์ฃผ๊ธฐ ํ›…์„ ํ•œ ๊ณต๊ฐ„์— ๋ฌถ์–ด์„œ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์–ด ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์ด ๋†’์•„์ง„๋‹ค.
<template>
  <div>
    <p>ํ˜„์žฌ ์นด์šดํŠธ: {{ count }}</p>
    <p>2๋ฐฐ ๊ฐ’: {{ doubleCount }}</p>
    <button @click="increment">์ฆ๊ฐ€</button>
  </div>
</template>

<script setup>
import { ref, computed, onMounted } from 'vue'

// 1. ๋ฐ˜์‘ํ˜• ์ƒํƒœ ์ •์˜
const count = ref(0)

// 2. ๊ณ„์‚ฐ๋œ ์†์„ฑ (Computed)
const doubleCount = computed(() => count.value * 2)

// 3. ๋ฉ”์„œ๋“œ ์ •์˜
const increment = () => {
  count.value++
}

// 4. ์ƒ๋ช…์ฃผ๊ธฐ ํ›… (Lifecycle Hook)
onMounted(() => {
  console.log('์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋งˆ์šดํŠธ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.')
})
</script>โ€‹

 

 

 

 


 

 

 

 

3. React์™€ Vue์˜ ์ฐจ์ด์ 

  • React๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•(JSX) ๊ธฐ๋ฐ˜์˜ UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ฐœ๋ฐœ์ž์˜ ์ž์œ ๋„๊ฐ€ ๋†’๋‹ค.
    Vue๋Š” ํ‘œ์ค€ HTML/CSS/JS ๊ตฌ์กฐ๋ฅผ ์ ๊ทน ํ™œ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ƒ์‚ฐ์„ฑ๊ณผ ํ‘œ์ค€ํ™”๋œ ๊ตฌ์กฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • React๋Š” ์ƒํƒœ๋ฅผ ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์ƒˆ ๊ฐ’์œผ๋กœ ๊ต์ฒดํ•˜๋Š” ๋ถˆ๋ณ€์„ฑ ์›์น™์„ ๋”ฐ๋ฅธ๋‹ค.
    Vue๋Š” ๋ฐ์ดํ„ฐ ์ˆ˜์ • ์‹œ ๋ณ€ํ™”๋ฅผ ์ž๋™์œผ๋กœ ์ถ”์ ํ•˜๋Š” ๋ฐ˜์‘ํ˜• ์›์น™์„ ๋”ฐ๋ฅธ๋‹ค.


  • ๊ฐ€์ƒ DOM ์ž‘๋™ ๋ฐฉ์‹ ์ฐจ์ด
    React_ ํŠธ๋ฆฌ ์žฌ์‹คํ–‰๊ณผ ์ „์ฒด ์žฌ๋ Œ๋”๋ง
    - ์ƒํƒœ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ ํ•จ์ˆ˜ ์ „์ฒด๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰๋œ๋‹ค.
    - ์ปดํฌ๋„ŒํŠธ ํ•˜์œ„์˜ ์ „์ฒด ๊ฐ€์ƒ DOM ํŠธ๋ฆฌ๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•œ ๋’ค, ์ด์ „ ๊ฐ€์ƒ DOM ํŠธ๋ฆฌ์™€ ๋น„๊ต(Diffing)ํ•˜์—ฌ ๋‹ฌ๋ผ์ง„ ์ฐจ์ด์ ๋งŒ ์‹ค์ œ DOM์— ๋ฐ˜์˜ํ•œ๋‹ค.
    - ๋ถ€๋ชจ๊ฐ€ ์žฌ๋ Œ๋”๋ง๋˜๋ฉด ์ž์‹ ์ปดํฌ๋„ŒํŠธ๋„ ๊ธฐ๋ณธ์ ์œผ๋กœ ์žฌ๋ Œ๋”๋ง๋œ๋‹ค. ๋ถˆํ•„์š”ํ•œ ์žฌ๋ Œ๋”๋ง์„ ๋ง‰๊ธฐ ์œ„ํ•ด useMemo, useCallback, React.memo ๊ฐ™์€ ์ตœ์ ํ™” ๊ธฐ๋ฒ•์„ ์ง์ ‘ ์ ์šฉํ•ด์•ผ ํ•œ๋‹ค.

    Vue_ ๋ฐ˜์‘ํ˜• ์ถ”์ ๊ณผ ์ •์ /๋™์  ๋ถ„๋ฆฌ
    - Vue๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ Proxy๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค DOM ์š”์†Œ์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ์žˆ๋Š”์ง€ ๊ฐ์ง€(์˜์กด์„ฑ ์ถ”์ )ํ•ฉ๋‹ˆ๋‹ค.
    - ๊ฐœ๋ฐœ์ž๊ฐ€ const count = ref(0) ๋˜๋Š” reactive({name : 'Vue'})์ฒ˜๋Ÿผ ์ƒํƒœ๋ฅผ ์ •์˜ํ•˜๋ฉด Vue๋Š” ์ด ๊ฐ์ฒด๋ฅผ Proxy๋กœ ๊ฐ์‹ผ๋‹ค.
    - Vue๋Š” ์ด ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์˜ ๊ฐ€์ƒ DOM์„ ์ฐธ์กฐํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ธฐ์–ตํ•ด๋‘”๋‹ค. (์˜์กด์„ฑ)
    - ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •ํ•˜๋ฉด Proxy๊ฐ€ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ด ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋ผ๊ณ  ์•Œ๋ ค์ค€๋‹ค.
    - ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฐ”๋€Œ๋ฉด ์ „์ฒด ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๊ณ„์‚ฐํ•˜๋Š” ๋Œ€์‹ , ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์ตœ์†Œํ•œ์˜ ํ…œํ”Œ๋ฆฟ ์˜์—ญ๋งŒ ํ•€ํฌ์ธํŠธ๋กœ ์ถ”์ ํ•˜์—ฌ ๊ฐฑ์‹ ํ•œ๋‹ค.
    - Vue 3๋Š” ์ปดํฌ๋„ŒํŠธ ํ…œํ”Œ๋ฆฟ ๋‚ด์—์„œ ๋ณ€ํ™”ํ•˜์ง€ ์•Š๋Š” ์ •์  ์š”์†Œ์™€ ๋ณ€ํ™”ํ•˜๋Š” ๋™์  ์š”์†Œ๋ฅผ ๋นŒ๋“œ ํƒ€์ž„์— ๋ฏธ๋ฆฌ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ฐ€์ƒ DOM ๋น„๊ต ๋ฒ”์œ„๋ฅผ ๋Œ€ํญ ์ค„์ธ๋‹ค.
    - <p>{{count}}</p>์ฒ˜๋Ÿผ ๋ณ€์ˆ˜๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ถ€๋ถ„์—๋Š” ์ด ํƒœ๊ทธ๋Š” ํ…์ŠคํŠธ๋งŒ ๋ฐ”๋€๋‹ค๋Š” PathFlag(ํƒœ๊ทธ)๋ฅผ ๋‹ฌ์•„๋‘”๋‹ค.
    - ๊ทธ๋ž˜์„œ ๊ฐ€์ƒ DOM ๋น„๊ต๊ฐ€ ์‹œ์ž‘๋  ๋•Œ, Vue๋Š” ์ •์  ์š”์†Œ๋Š” ๊ฑด๋„ˆ๋›ฐ๊ณ  PatchFlag๊ฐ€ ๋ถ™์€ ๋™์  ์š”์†Œ๋งŒ ํ•€ํฌ์ธํŠธ๋กœ ๋น„๊ตํ•œ๋‹ค.

    - ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์žฌ๋ Œ๋”๋ง ์ตœ์ ํ™” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ๊ธฐ๋ณธ ๊ตฌ๋™ ์„ฑ๋Šฅ์ด ์ผ์ •ํ•˜๊ฒŒ ์œ ์ง€๋œ๋‹ค.


  • ์ƒ๋ช…์ฃผ๊ธฐ ํ›…์˜ ์ฐจ์ด์ 
    ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  - DOM์— ๋งˆ์šดํŠธ๋˜๊ณ  -  ์—…๋ฐ์ดํŠธ๋˜๊ณ  - ํŒŒ๊ดด๋˜๋Š” ๊ณผ์ •(์ƒ๋ช…์ฃผ๊ธฐ)์„ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์˜ ์ฐจ์ด๋ฅผ ์•Œ์•„๋ณด์ž.

    React_ useEffect ์ค‘์‹ฌ์˜ Side Effect ๊ด€๋ฆฌ
    - React ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ์—์„œ๋Š” ๋‹จ๊ณ„๋ณ„ ํ›…์ด ๋”ฐ๋กœ ์กด์žฌํ•˜์ง€ ์•Š๋Š”๋‹ค.
    - useEffect๋กœ ๋งˆ์šดํŠธ/์—…๋ฐ์ดํŠธ/์–ธ๋งˆ์šดํŠธ ๋™์ž‘์„ ํ†ตํ•ฉ ๊ด€๋ฆฌํ•œ๋‹ค.
    - React๋Š” ํŠน์ • ๋ฐ์ดํ„ฐ ์ƒํƒœ๊ฐ€ ๋ฐ”๋€” ๋•Œ ์–ด๋–ค Side Effect๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์ •๋ฆฌํ• ๊ฑด์ง€ ์ƒํƒœ ๋™๊ธฐํ™” ์ค‘์‹ฌ์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.

    Vue_ ๋ช…์‹œ์ ์ธ ์‹œ์ ๋ณ„ API
    - Vue๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ๋‹จ๊ณ„์— ์ •ํ™•ํžˆ ๋งž์ถฐ ์‹คํ–‰๋˜๋Š” ์ง๊ด€์ ์ธ ์ด๋ฆ„์˜ ํ›… ํ•จ์ˆ˜๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.
    - setup( )์€ ์ปดํฌ๋„ŒํŠธ ์ธ์Šคํ„ด์Šค๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ๋ฐ˜์‘ํ˜• ๋ฐ์ดํ„ฐ๊ฐ€ ์ดˆ๊ธฐํ™”๋˜๋Š” ์‹œ์ ์ด๋‹ค.
    - onMounted( )๋Š” DOM ์š”์†Œ๊ฐ€ ์‹ค์ œ ํ™”๋ฉด์— ๋งˆ์šดํŠธ๋œ ์งํ›„๋‹ค.
    - onUpdated( )๋Š” ๋ฐ˜์‘ํ˜• ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์œผ๋กœ ์ธํ•ด DOM์ด ์žฌ๋ Œ๋”๋ง ์™„๋ฃŒ๋œ ์งํ›„๋‹ค.
    - onUnmounted( )๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ DOM์—์„œ ์–ธ๋งˆ์šดํŠธ๋œ ์งํ›„๋‹ค.
    - Vue๋Š” ์ง€๊ธˆ์ด ๋งˆ์šดํŠธ ๋‹จ๊ณ„์ธ์ง€ ์—…๋ฐ์ดํŠธ ๋‹จ๊ณ„์ธ์ง€๋ผ๋Š” ์‹œ์  ์ค‘์‹ฌ์œผ๋กœ ์ ‘๊ทผํ•œ๋‹ค.