๐ ๋ฆฌ์กํธ(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)
'FE > React' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ๋ฆฌ์กํธ ๋ถํธ์คํธ๋ฉ(react-bootstrap) ์ ์ฉํ๊ธฐ (0) | 2023.02.07 |
---|---|
[React] State๋? ๋ณ๊ฒฝ๋๋ ๋์ ์ธ ๊ฐ (0) | 2023.02.01 |
[React] Props๋? ์ปดํฌ๋ํธ์ ๋ฐ์ดํฐ ์ ๋ฌํ๋ ํ๋กํผํฐ (0) | 2023.01.29 |
[React] React ์ปดํฌ๋ํธ๋? React ์ฑ์ ๊ตฌ์ฑํ๋ ์์ (0) | 2023.01.27 |
[React] JSX ์ ์ ๋ฐ ๋ฌธ๋ฒ (0) | 2023.01.24 |