๐ React ์ ์จ์?
๋๋ ๋ฆฌ์กํธ๋ฅผ ๋ฐฐ์ฐ๊ณ ์๋ค. ๋ณ๋ค๋ฅธ ์ด์ ๋ ์๋ค. ์ ์ผ ๋ง์ด ์ฌ์ฉ๋๋ ํธ๋ ๋ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ณ ๊ทธ๋ผ ๋๋ ๋ฐฐ์์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๊ฒ ๋ด ์์งํ ์ฌ๊ฒฝ์ด์ง๋ง ๋จ๋ค์ด ๋ฌผ์ด๋ดค์ ๋ ์ด๋ฐ ์์ผ๋ก ๋๋ต์ด ๋์จ๋ค๋ฉด ๊ทธ๊ฑด ์๋๋, ์์ ๋ ์ฐธ ๊ณค๋ํ ์ํฉ์ผ ๊ฒ ๊ฐ๋ค.
๊ทธ๋ฐ ๋ถ์์ฌ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ํ๋ํ๋ ์ดํด๋ณด์.
JS ํ๋ก ํธ์๋ ํ๋ ์์ํฌ ์ฌ์ฉ๋(์ถ์ฒ: StateOfJS(2021))
๋ฆฌ์กํธ?
๋ฆฌ์กํธ๊ฐ ๋ญ์ผ?
์ถ์ฒ: ๋ฆฌ์กํธ ๊ณต์ ํํ์ด์ง
๋ฆฌ์กํธ๋ UI๋ฅผ ๋ง๋๋๋ฐ ๋์์ ์ฃผ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๋งํผ ๋ค๋ฅธ ํ๋ ์์ํฌ๋ค๋ณด๋ค ๊ธฐ๋ฅ์ด ์กฐ๊ธ ์ ์ง๋ง ํ์ฅ์ฑ์ด ๋ฐ์ด๋๋ค๊ณ ํ๋ค.
์์๋ก ๋ฆฌ์กํธ๋ SPA(Single Page Application) ๊ฐ๋ฐ ์ค์ ์ด๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ๋ผ์ฐํ ์ ์ํด react-router ํจํค์ง๋ฅผ ์ด์ฉํ๋ค.
์ฅ์ ?
์ธ๊ณ์์ ์ ์ผ ์ ๋๊ฐ๋ ๋๊ตฌ๋ผ๋ฉด ๋๋ ทํ ์ฅ์ ์ด ์๊ฒ ์ง?
๋ฆฌ์กํธ ๊ณต์ ํํ์ด์ง์ ๋ค์ด๊ฐ๋ฉด ์ ์ธํ๊ณผ ์ปดํฌ๋ํธ๋ผ๋ ๋จ์ด๊ฐ ๋ณด์ธ๋ค. ๋ค์ํ ์ฅ์ ๋ค์ด ์๊ฒ ์ง๋ง ์ ์ธํ, ์ปดํฌ๋ํธ, ๊ทธ๋ฆฌ๊ณ Virtual DOM์ ๋ํด ์๊ธฐํด๋ณด๊ฒ ๋ค.
์ ์ธํ
- ์ ์ธํ(declarative) vs ๋ช ๋ นํ(imperative)
const arr = [1, 2, 3, 4, 5];
const imperative = (function getDoubledArr() {
const result = [];
for (let i = 0; i < arr.length; i++) {
result[i] = arr[i] * 2;
}
return result;
})(); // ๋ช
๋ นํ
const declarative = arr.map((data) => data * 2); // ์ ์ธํ
console.log(declarative); // [2, 4, 6, 8, 10]
console.log(imperative); // [2, 4, 6, 8, 10]
๋ช ๋ นํ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌ๋ ์ง, ์ ์ฐํ์ ๋ฌด์์ ํ ์ง์ ๋ํด ๊ฐ๊ฐ ์ค์ ์ ๋ง์ถ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ด๋ค.
๋ฆฌ์กํธ๋ ๊ณต์ ๋ฌธ์์ ๋น๋นํ๊ฒ ์ ์ธํ์ด๋ผ๊ณ ์ ์ด ๋์๋ค. ๋ฌด์จ ์๋ฏธ์ธ์ง ์ดํด๋ณด์.
// Without React
const root = document.querySelector(".root");
const container = document.createElement("div");
const counter = 9;
if (counter > 10) {
container.classList.add(".container");
} else {
container.classList.add(".box");
}
container.innerText = "Hello";
root.appendChild(container);
// With React
import React, { useState } from "react";
import ReactDOM from "react-dom/client";
const Container = () => {
const [counter, setCounter] = useState(9);
return <div className={counter > 10 ? 'container' : 'box'}>Hello</div>
}
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<Container />);
์์ ๊ฐ์ด ํจ์ฌ ๊ฐํธํ ๋ฐฉ์์ผ๋ก ๋ฌธ์๋ฅผ ์์ฑํ ์ ์๋ค.
์ปดํฌ๋ํธ
๋ฆฌ์กํธ ์ฑ์ ์ปดํฌ๋ํธ๋ผ๋ ๋จ์๋ก ์ด๋ฃจ์ด์ ธ์๋ค. ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ์๊ฒ์ ๋ฐ์ Props์ ์์ ์ด ๊ด๋ฆฌํ๋ State๋ฅผ ๊ฐ์ง๋๋ฐ, ์ด ๊ฐ๋ค์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๋ฆฌ์กํธ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋ง์ํจ๋ค.
์ปดํฌ๋ํธ๋ฅผ ์ด๋ป๊ฒ ๋๋๊ณ ๋ ์ด๋ป๊ฒ ์ปดํฌ๋ํธ์ State๋ฅผ ๊ด๋ฆฌํ๋์ ๋ฐ๋ผ ๋ฆฌ์กํธ ์ฑ์ ์ฑ๋ฅ์ด ์ข์ฐ๋๋ค.
Virtual DOM
Virtual DOM ์ด์ ์ DOM์ ๋ํด ๋งํด๋ณด์. DOM์ HTML ๋ฌธ์๋ฅผ ์ด๋ฃจ๋ ์์๋ฅผ ๊ตฌ์กฐํํด์ ๋ํ๋ธ ๊ฐ์ฒด๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ DOM์ ์ ๊ทผํ์ฌ ๋ฌธ์๋ฅผ ์กฐ์ํ ์ ์๋ค.
ํ์ง๋ง DOM์ ์กฐ์ํ๋ ํ์๋ ๋น์ฉ์ด ํฌ๋ค. Virtual DOM์ ์ด ๋น์ฉ์ ์ค์ฌ ์ฑ๋ฅ์ ์ต์ ํํ๋๋ฐ ๋ชฉ์ ์ด ์๋ค.
Virtual DOM์ ์ค์ DOM์ ์ถ์ํํ ๊ฐ์ฒด์ด๋ค. ๋ฆฌ์กํธ๋ ๋ณ๊ฒฝ๋ ๋ด์ฉ๋ค์ Virtual DOM์ ๋ฐ์ํ๊ณ ์ค์ DOM๊ณผ ๊ฐ์ ๋น๊ตํ๋ฉฐ ๋ฐ๊ฟ์ผ ํ ๋ถ๋ถ๋ง ๋ฐ๊ฟ์ค๋ค.
๋ผ๊ณ ์ค๋ช ์ ๋์ด์๋๋ฐ ๊ฐ์ด์ ์๋ฟ์ง๋ ์๋๋ค. ์ค์ ๋ก ์ด๋ป๊ฒ ๋์ํ๋์ง ์ฐพ์๋ณด๋ key์ value ํํ๋ก ๋งค์นญ์์ผ diffing ์๊ณ ๋ฆฌ์ฆ์ ๋ฐ๋ผ ์ฌ์กฐ์ ๊ณผ์ ์ ๊ฑฐ์น๋ค๊ณ ํ๋ค... (๋์ค์ ์์ธํ ๋ด์ฉ์ ๋ ์์๋ด์ผ๊ฒ ๋ค.)
Virtual DOM์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ถ๊ฐ๋ก ์ฌ์ฉํ๋ ๋งํผ ๋จ์ ๋ ์กด์ฌํ์ง๋ง ์ฌ๋ฐ๋ฅด๊ฒ ์ฌ์ฉ๋๋ค๋ฉด ์ฑ๋ฅ ์ธก๋ฉด์์ ํฐ ๋์์ด ๋ ๊ฒ ๊ฐ๋ค.
๋จ์ ์?
SPA ๋จ์
SPA๋ ๋ก๋ฉ ์ด๊ธฐ์ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ ๋ฐ์์์ผ ํ๊ธฐ ๋๋ฌธ์ ๋ก๋ฉ ์๋๊ฐ ๋๋ฆฌ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ HTML ๋ฌธ์๋ฅผ ์ฒ์๋ถํฐ ๊ทธ๋ฆฌ๋ ๊ฒ ์๋๊ธฐ ๋๋ฌธ์ ๊ฒ์ ์์ง์ ์ต์ ํ๋์ง ์๋๋ค.(์์ฆ์ ์์ง์ด ์ ๋์์ ๊ด์ฐฎ๋ค๊ณ ํ๊ธด ํจ)
SPA๋ฅผ ์ง์ํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ ๋ฆฌ์กํธ๋ ์ด๋ฐ ๋จ์ ์ ๊ทธ๋๋ก ๊ฐ๊ณ ์๋ค.
์ค๋ฒํค๋
๋ฆฌ์กํธ๋ ์์ฃผ ํ๋ฅญํ ๋๊ตฌ๋ค. ์ฆ์ ์ํ ๋ณํ๋ฅผ ๊ฐ์งํ๋ฉฐ ๊ทธ์ ๋ฐ๋ผ ๋ค์ ๋ ๋๋ง์ ํด์ผํ๋ ์ฑ์ด ์๋ค๋ฉด ๋ฆฌ์กํธ๋ ๊ทธ ์ญํ ์ ์ถฉ๋ถํ ์ ์ํํ ์ ์๋ค.
ํ์ง๋ง ๊ฐ๋จํ ์ฑ์ด๋ผ๋ฉด? ์คํ๋ ค ๋ฆฌ์กํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ ์ฑ๋ฅ ์ ํ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋ค. ๋ฆฌ์กํธ ์์ฒด๊ฐ ์ง๋ ์ค๋ฒํค๋ ๋ํ ํ๋ก์ ํธ์ ๊ณ ๋ คํด์ผํ๋ค.
์ฅ๋จ์ ์ ์๊ฒ ์ง๋ง...
์์ง ๋ฆฌ์กํธ์ ๋ํด ์์ธํ๊ฒ ๊ธ์ ์ ๊ธฐ์๋ ๊ทธ๋งํผ ๊น๊ฒ ์ฌ์ฉํด๋ณด์ง ์์๋ค๊ณ ์๊ฐํ๋ค. ๊ธ๋ก๋ง ์ ๋๋ค๊ณ ์๊ฒ ๋๋ ๊ฒ๋ ์๋๊ณ ์ง์ ๊ฒช์ด์ผ ๊ฐ์ด์ ๋จ์ง ์์๊น?
ํ๋ก ํธ์๋ ์์ฅ์ด ๊ธ์๋๋ก ๋ณํํ๋ค๊ณ ๋ ํ์ง๋ง ํ์ฌ ๋ฆฌ์กํธ๊ฐ ๋์ธ๋ผ๋ ์ฌ์ค์ ๋ถ์ ํ ์๋ ์๋ค. ์ผ๋จ ๋ฆฌ์กํธ๋ฅผ ์ถฉ๋ถํ ๊ณต๋ถํ๊ณ , ํ๋ก ํธ์๋ ์์ฒด์ ๋ํ ์ง์๋ ํ๋ถํ๊ฒ ์์๋ณด์.
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ React ์ ์จ์?), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@ja960508/React-์-์จ์์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค