๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

FE/React

[React] React ๊ฐœ๋…

๐Ÿ“Œ ๋ฆฌ์•กํŠธ(React)๋ž€?

 ์˜ค๋กœ์ง€ ๋ทฐ(View)์— ์ง‘์ค‘ํ•ด ๊ฐœ๋ฐœํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

๋ฆฌ์•กํŠธ๋Š” SPA๋ฐฉ์‹์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ, ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค. ๊ธฐ์—…์—์„œ ํ”ํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋Š” MVC(Model-View-Controller) ์•„ํ‚คํ…์ฒ˜ ๊ธฐ๋ฐ˜ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค. MVC๋ฐฉ์‹์€ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ปจํŠธ๋กค๋Ÿฌ/๋ชจ๋ธ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๊ณ , ๋ณ€๊ฒฝ๋œ ์‚ฌํ•ญ์„ ๋ทฐ์— ๋ Œ๋”๋งํ•˜์—ฌ ํ™”๋ฉด์— ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋งŒ์•ฝ ํ”„๋ก ํŠธ๋‹จ์—์„œ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์ด๋ฒคํŠธ๊ฐ€ ๋งŽ์€ ๊ฒฝ์šฐ, ์„œ๋ฒ„ ๋กœ์ง์ด ๋ณต์žกํ•  ๊ฒฝ์šฐ๋Š” ์–ด๋–จ๊นŒ์š”? ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์„ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐ ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํŽ˜์ด์Šค๋ถ์€ ์˜ค์ง "๋ทฐ"์— ์ง‘์ค‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ ๋ฆฌ์•กํŠธ๋ฅผ ๊ฐœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค. 

 

 ์ปดํฌ๋„ŒํŠธ(Component) ๋‹จ์œ„๋กœ ํ™”๋ฉด์ด ๊ตฌ์„ฑ๋จ 

๋ฆฌ์•กํŠธ์—์„œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ํ™”๋ฉด์€ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ปดํฌ๋„ŒํŠธ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๊ณ , ๋ฆฌ์•กํŠธ ์•ฑ์„ ์ด๋ฃจ๋Š” ์ตœ์†Œํ•œ์˜ ๋‹จ์œ„๋Š” '์ปดํฌ๋„ŒํŠธ'์ž…๋‹ˆ๋‹ค.

์ปดํฌ๋„ŒํŠธ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ง€๋Š” UI ์š”์†Œ๋ฅผ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํฌ๋„ŒํŠธ๋Š” ์ƒˆ๋กœ์šด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” Input ์ปดํฌ๋„ŒํŠธ, ๋ฆฌ์ŠคํŠธ๋ฅผ ํ‘œํ˜„ํ•˜๋Š” List ์ปดํฌ๋„ŒํŠธ, ๋ฆฌ์ŠคํŠธ์—์„œ ๊ฐ๊ฐ์˜ ํ•ญ๋ชฉ์„ ๋ณด์—ฌ์ฃผ๋Š” Item ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 


๐Ÿ“Œ ๋ฆฌ์•กํŠธ ๋ Œ๋”๋ง 

•  ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR)

์–ด๋–ค ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์—ฌ์ฃผ๋ ค๋ฉด '๋ Œ๋”๋ง'์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฆฌ์•กํŠธ๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ HTML์„ ๊ทธ๋ฆฌ๋Š” 'ํด๋ผ์ด์–ธํŠธ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(CSR)' ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. CSR๋ฐฉ์‹์€ ์ดˆ๊ธฐ์— HTML,CSS, ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ชจ๋‘ ๋ถˆ๋Ÿฌ์˜ค๊ณ  ์ดํ›„์—๋Š” ์‚ฌ์šฉ์ž์˜ ํ–‰๋™์— ๋”ฐ๋ผ ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ถˆ๋Ÿฌ์˜ค๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ถ€๋ถ„๋งŒ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ์ „์ฒด๋ฅผ ๋‹ค์‹œ ๋ถˆ๋Ÿฌ์˜ค๋Š” '์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)'๋ฐฉ์‹๋ณด๋‹ค ๋ฆฌ๋ Œ๋”๋ง ์‹œ๊ฐ„์ด ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค. 

 

•  ์ดˆ๊ธฐ ๋ Œ๋”๋ง, ๋ฆฌ๋ Œ๋”๋ง

๋ฆฌ์•กํŠธ์—์„œ๋Š” ์ด๋Ÿฌํ•œ ๋ Œ๋”๋ง์„ ๋‘ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์‹คํ–‰ํ•˜๋Š”๋ฐ์š”.

๊ฐ€์žฅ ์ฒ˜์Œ ์‹คํ–‰๋˜๋Š” '์ดˆ๊ธฐ ๋ Œ๋”๋ง' ๋‹จ๊ณ„, ์ดํ›„ ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ์žฌ์‹คํ–‰๋˜๋Š” '๋ฆฌ๋ Œ๋”๋ง' ๋‹จ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ๋Š” ์ดˆ๊ธฐ ๋ Œ๋”๋งํ•œ ์ดํ›„์—, ๋ฐ์ดํ„ฐ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์˜ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐˆ์•„๋ผ์šฐ๋Š” 'Reconciliation' ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

 

โšก ์ดˆ๊ธฐ ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค  

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

1. ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ๋ Œ๋”๋ง 
์ปดํฌ๋„ŒํŠธ ํŠธ๋ฆฌ์˜ ๋ฃจํŠธ์—์„œ ์‹œ์ž‘ํ•ด ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์•„๋ž˜๋กœ ์ˆœํšŒํ•˜๋ฉด์„œ ๋ทฐ ์ •๋ณด๋ฅผ ๋‹ด์€ ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

//1. ์ผ๋ฐ˜์ ์ธ JSX ์ปดํฌ๋„ŒํŠธ ์‚ฌ์šฉ ๋ฌธ๋ฒ•
return <MyComponent>Hello</MyComponent> 

//2. JSX ๋ฌธ๋ฒ•์„ ํ˜ธ์ถœํ•ด์„œ ๋ณ€ํ™˜ 
return React.createElement(MyComponent, {name : "jelly", age: 2});

//3. ํ˜ธ์ถœ๊ฒฐ๊ณผ ์ปดํฌ๋„ŒํŠธ ์ •๋ณด ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ 
{type: MyComponent, props: {name: "jelly", age : 2}, children: ["Hello"]}

2. ๋ฐ˜ํ™˜๋œ ๊ฐ์ฒด์˜ ์ •๋ณด๋“ค์„ ์ด์šฉํ•ด HTML ์ฝ”๋“œ ์ƒ์„ฑ

3. ์‹ค์ œ ํŽ˜์ด์ง€์˜ DOM ์š”์†Œ์— ์ฃผ์ž…ํ•ฉ๋‹ˆ๋‹ค.  

 

โšก ์žฌ์กฐ์ •(Reconciliation) ๊ณผ์ •

์ดˆ๊ธฐ ๋ Œ๋”๋ง๋œ ์ดํ›„์— ํŽ˜์ด์ง€ ๋‚ด ๋ฐ์ดํ„ฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋Š” Reconciliation ๊ณผ์ •์ด ์ผ์–ด๋‚˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Reconciliation ์€ '์žฌ์กฐ์ •'์ด๋ผ๋Š” ๋œป์ด๊ณ , ๋ฆฌ์•กํŠธ์—์„œ '์žฌ์กฐ์ • ๊ณผ์ •' ๋˜๋Š” '์กฐํ™” ๊ณผ์ •'์„ ๊ฑฐ์นœ๋‹ค๊ณ  ํ‘œํ˜„ํ•ฉ๋‹ˆ๋‹ค.  

 

์ปดํฌ๋„ŒํŠธ๋Š” ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธ ํ–ˆ์„๋•Œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  render ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. render ํ•จ์ˆ˜๋Š” ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์ปดํฌ๋„ŒํŠธ ์ •๋ณด์™€ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ ์ •๋ณด๋ฅผ ๋น„๊ตํ•ด DOM ํŠธ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š”๋ฐ์š”. ์ด๋•Œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„์€ ์ƒˆ๋กœ์šด ์ปดํฌ๋„ŒํŠธ๋กœ ๊ฐˆ์•„ ๋ผ์›Œ ์ง‘๋‹ˆ๋‹ค. (render ํ•จ์ˆ˜๋Š” ํœด๋ฆฌ์Šคํ‹ฑ์„ ์‚ฌ์šฉํ•œ React์˜ ๋น„๊ต ์•Œ๊ณ ๋ฆฌ์ฆ˜(Diffing Algorithm) ์œผ๋กœ O(n) ๋ณต์žก๋„๋งŒ์— ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค)

 

๋งŒ์•ฝ <App> ์ปดํฌ๋„ŒํŠธ ์—์„œ <MyComponent> ์ปดํฌ๋„ŒํŠธ ๋กœ ๋ณ€๊ฒฝ๋œ๋‹ค๋ฉด, ์ƒˆ๋กœ์šด DOM ํŠธ๋ฆฌ๋ฅผ ์žฌ๊ตฌ์ถ•ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. 

์ด๋•Œ ๊ธฐ์กด ์ปดํฌ๋„ŒํŠธ๋Š” componentWillUnmount() ๊ฐ€ ์‹คํ–‰๋˜๋ฉฐ DOM ๋…ธ๋“œ๊ฐ€ ํŒŒ๊ดด๋˜๊ณ , componentDidMount() ๊ฐ€ ์‹คํ–‰๋˜ ์ƒˆ๋กœ์šด DOM ๋…ธ๋“œ๊ฐ€ DOM์— ์‚ฝ์ž…๋ฉ๋‹ˆ๋‹ค. 

 


๐Ÿ“Œ Virtual DOM (๊ฐ€์ƒ ๋”)

Virtual DOM ์„ ์•Œ๊ธฐ ์ „, DOM์„ ๋จผ์ € ์‚ดํŽด๋ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

 

โšก DOM ์ •์˜ 

DOM(Document Object Model)์ด๋ž€ ์›นํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ ๋ ๋•Œ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Document๋Š” ๋ฌธ์„œ, Object๋Š” ๊ฐ์ฒด, Model์€ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค. ๋ฌธ์„œ, ๊ฐ์ฒด, ๋ชจ๋ธ ๊ณผ์—ฐ ์ด๊ฒŒ ๋ฌด์Šจ ๋œป์ผ๊นŒ์š”?

 

์—ฌ๊ธฐ์„œ ๋ฌธ์„œ๋ž€ <html>, <body>, <div> ์™€ ๊ฐ™์€ HTML ํƒœ๊ทธ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, ์ด ํƒœ๊ทธ๋“ค์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“ค๋ฉด ๋ฌธ์„œ ๊ฐ์ฒด์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ DOM(๋ฌธ์„œ ๊ฐ์ฒด ๋ชจ๋ธ)์€ HTML ๋‚ด ์—ฌ๋Ÿฌ ํƒœ๊ทธ๋“ค์„ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์ด์šฉ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐฉ์‹, ์ฆ‰ HTML ๋ฌธ์„œ์˜ ๊ฐ์ฒด ๊ธฐ๋ฐ˜ ํ‘œํ˜„ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. (์‹ค์ œ ํ™”๋ฉด์— ๋‚˜ํƒ€๋‚˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค) 

์ด ๋ฌธ์„œ ๊ฐ์ฒด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ Œ๋”๋ง๋˜๋ฉฐ, DOM์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠธ๋ฆฌ ๊ตฌ์กฐ๋กœ ํ‘œํ˜„๋ฉ๋‹ˆ๋‹ค. 

 

 

โšก Virtual DOM (๊ฐ€์ƒ ๋”) 

• DOM์˜ ๋น„ํšจ์œจ์„ฑ 

DOM ํŠธ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ „์ฒด ํŠธ๋ฆฌ๋ฅผ ๋‹ค์‹œ ๊ตฌ์„ฑํ•˜๊ณ  ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๊ฒŒ ๋œ๋‹ค๋ฉด, ํŽ˜์ด์ง€์˜ ์—…๋ฐ์ดํŠธ๊ฐ€ ์žฆ์€ ์‹œ์Šคํ…œ์€ ํŽ˜์ด์ง€ ๋กœ๋”ฉ์ด ์•„์ฃผ ๋Š๋ฆด ์ˆ˜ ๋ฐ–์— ์—†์Šต๋‹ˆ๋‹ค. Virtual DOM์€ ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๊ทธ๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹Œ ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„๋งŒ ๋ฐ˜์˜๋˜๋Š” DOM์ด๊ธฐ ๋•Œ๋ฌธ์— ์ง€์†์ ์ธ ์—…๋ฐ์ดํŠธ๊ฐ€ ์ผ์–ด๋‚˜๋Š” ๋Œ€๊ทœ๋ชจ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค :D 

 

• ๊ฐ€์ƒ์˜ UI์™€ ์žฌ์กฐ์ • 

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

 

Virtual DOM ์„ ํ™œ์šฉํ•ด ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ 

๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋ ๋•Œ ๋ฆฌ์•กํŠธ์—์„œ Virtual DOM์„ ํ™œ์šฉํ•ด ์‹ค์ œ DOM ๊นŒ์ง€ ์—…๋ฐ์ดํŠธ ๋˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค. 

1. ๋ฐ์ดํ„ฐ๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด Virtual DOM์— ์ „์ฒด UI๋ฅผ ๋ฆฌ๋ Œ๋”๋ง 

2. ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ Virtual DOM๊ณผ ์ด์ „ Virtual DOM ์„ ๋น„๊ต (diff) 

3. ๋ณ€๊ฒฝ๋œ ๋‚ด์šฉ๋งŒ ์‹ค์ œ DOM ์— ๋ฐ˜์˜ (patch/apply)