๐ ๊ฐ์
React(๋ฆฌ์กํธ)๋ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๊ธฐ ์ํ ์๋ฐ์คํฌ๋ฆฝํธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- React๋ ์ ์ธ์ ์ด๊ณ , ํจ์จ์ ์ด๊ณ , ์ ์ฐํ๋ค.
- ์ปดํฌ๋ํธ(Component)๋ผ๋ ์์๋ฅผ ์ด์ฉํ๋ฉด ๋ณต์กํ UI๋ฅผ ๋ ๋ฆฝ์ ์ธ ๋จ์๋ก ์ชผ๊ฐ์ด ๊ตฌํํ ์ ์๋ค.
๐ก React๋ฅผ ์ ์ฌ์ฉํ ๊น ?
๋ฌด์๋ณด๋ค, ๋์ (Dynamic)์ธ ์นํ์ด์ง๋ฅผ ๋ง๋ค๊ธฐ ์ํด์์ด๋ค.
์น ํ์ด์ง๋ ๊ฐ ํ์ด์ง๋ง๋ค ํ์ด์ง๋ฅผ ๊ด๋ฆฌํด์ค์ผ ํ๊ณ , ์ฌ์ฉ์์ ์๋ต์ ๋ฐ๋ผ ์ธํฐํ์ด์ค๊ฐ ์ง์์ ์ผ๋ก ๋ณํด์ผ ํ๋ค.
ํ ๋ง๋๋ก, React๋ฅผ ์ฌ์ฉํ๋ ์ด์ ๋ฅผ ์ ๋ฆฌํ์๋ฉด,,
" ์ฌ์ฉ์(User)์์ ์ํต์ UI๋ก ์ฝ๊ฒ ๊ตฌํํ๊ณ ๋๊ท๋ชจ์ ์นํ์ด์ง๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค. "
- React์ Virtual DOM์ ์ฌ์ฉ์ ๊ฒฝํ์ ํฅ์ํ๊ณ ๊ฐ๋ฐ์์ ์์
์๋๋ฅผ ๋์ธ๋ค.
Virtual DOM์ด๋ ๊ฐ์์ ์ธ ํํ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๊ณ ReactDOM๊ณผ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด ์ค์ DOM๊ณผ ๋๊ธฐํํ๋ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ ์ด๋ค. - React ์ปดํฌ๋ํธ์ ์ฌ์ฌ์ฉ์ ๊ฐ๋ฐ ์๊ฐ์ ํฌ๊ฒ ์ ์ฝํ๋ค.
- ๋จ๋ฐฉํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ํตํด ์์ ์ ์ธ ์ฝ๋๋ฅผ ์ ๊ณตํ๋ค.
๋จํฅํฅ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ฐ์ดํฐ๋ ํญ์ ์ผ์ ํ ์ฅ์์ ์๊ณ , ๊ทธ ์ฅ์์์๋ง ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ ๊ฒ์ ์๋ฏธํ๋ค. - ์คํ์์ค์ด๋ฉฐ, ํ์ด์ค๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ด๊ธฐ ๋๋ฌธ์ ์ง์ํด์ ๊ฐ๋ฐ๋๊ณ ์ปค๋ฎค๋ํฐ์ ๊ณต๊ฐ๋๋ค.
- Hooks ์ด๋ ๊ฒ์ ์ด์ฉํด, ์ปดํฌ๋ํธ์ ์ํ(State)๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ ์ ์๋ค.
๐ก React ํ์ผ ๊ตฌ์กฐ
๐ React ์ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ฐจ์ด์
React๋ ์ฑ ์์ฑ ๋ฐฉ์์ ์ ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ค. ์ด๋ ๋ฐ์ดํฐ๊ฐ ์ฑ์ ์ฌ์ฉ๋๋ ๋ฐฉ์๊ณผ ๊ทธ ๋ฐ์ดํฐ๊ฐ ๋ณํํ๋ ๊ฒฐ๊ณผ์ ๋ฐ๋ฅธ UI ๋ณ๊ฒฝ ๋ฐฉ๋ฒ์ ๋ํด ๋ช ํํ ๊ท์น์ ์ค์ ํ์ฌ ์ํํ๋ค.
๋ฐ๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ ๊ท์น์ ์ค์ ํ์ง ์๋ ์คํฌ๋ฆฝํธ์ธ์ด์ด๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ฑ๋ ์ฑ์ ์์ ๋ก์ธ์๋ ์์ง๋ง, ๊ทธ๋งํผ ์ ํด์ง ๊ฒ์ด ์๊ธฐ ๋๋ฌธ์, ์ฝ๋๋ฅผ ์์ฑํ๋ค ๊ธธ์ ์์ด๋ฒ๋ฆฌ๊ธฐ ์ฝ๋ค.
์ด ๋์ ๋ํ์ ์ธ ์ฐจ์ด์ ์ ์ ๊น ์ ๋ฆฌํ์.
๐ก 1. ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ฒ์ ๋ง๋๋ ๋ฐฉ๋ฒ
- JS์์๋ ๋ณดํต ๋ค์๊ณผ ๊ฐ์ด HTML์ ์์๋ฅผ ๊ตฌํํ๋ค. ๋ฐ๋ก ์ถ๊ฐ์ ์ธ ์ฝ๋๊ฐ ํ์ํ์ง ์๋๋ค.
<div>
<h1>Grocery List</h1>
<ul>
<li>Milk</li>
<li>Bread</li>
<li>Eggs</li>
</ul>
</div>
- ๋ฐ๋ฉด React๋ JSX๋ก ๋ฐํ๋๋ ์ปดํฌ๋ํธ๋ฅผ ํตํด UI๋ฅผ ์ ์ํ๋ค.
- JSX๋ HTML ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ค์ ๋ก๋, ์๋ฐ์คํฌ๋ฆฝํธ๋ค.
/*
๋ค์์ GroceryList ๋ผ๋ ์ปดํฌ๋ํธ๋
์ดํ React DOM ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ํด "๋๋๋ง(Rendering)"๋์ด ํ๋ฉด์ ์ถ๋ ฅ๋ ์ ์๋ค.
*/
function GroceryList(props) {
return (
<div>
<h1>Grocery List</h1>
<ul>
<li>Milk</li>
<li>Bread</li>
<li>Eggs</li>
</ul>
</div>
)
};
๐ก ์ฑ์์ ๊ธฐ๋ฅ์ด ๋ถํ ๋๋ ๋ฐฉ์
- JS๋ ์ฑ์ ๊ธฐ๋ฅ ๋๋ UI์ ์์๋ฅผ ๋ถํ ํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํน๋ณํ ์๊ตฌ์ฌํญ์ด ์๋ค.
๊ธฐ๋ณธ์ ์ธ ์ถ๋ ฅ์ HTML ํ์ผ์ ์ ์ํ๋ค.
<div>
<h1>Grocery List</h1>
<ul id="grocery-list">
<li>Milk</li>
<li>Bread</li>
<li>Eggs</li>
</ul>
</div>
๊ทธ๋ฆฌ๊ณ ๋ชฉ๋ก์ ์ ๋ฐ์ดํธํ๋ ์ฝ๋๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ(.js)์ ๋ฃ์ด์ผ ํ๋ค.
function addItemToList() {
// Add item
}
์ด๋ ๊ฒ ์์ฑ๋์ด์ผ ํ๋ ์ด์ ๋ ๊ด์ฌ์ฌ ๋ถ๋ฆฌ ์์น์ ๋ฐ๋ผ, ํ๋ฉด์ ์ถ๋ ฅ์ ํ๋ HTML๊ณผ ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ถ๋ฆฌ๋๋๋ก ์ค๊ณํ์๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ง๋ง ์ด๋ฌํ ๋ฐฉ์์, ์ฑ์ด ์ ์ฐจ ๋ฐฉ๋ํด์ง๊ณ , ๋ณต์กํด์ง์ ๋ฐ๋ผ, ์ปจํธ๋กค ํ๊ธฐ ์ด๋ ค์ธ ์ ์๋ค.
- ๋ฐ๋ฉด, React๋ ์์ ๊ธฐ๋ฅ์ ๊ตฌํํ๋๋ฐ ํ์ํ ์ฝ๋๋ฅผ ํ๋์ ํ์ผ๋ก ์ ์ง๊ฐ ๊ฐ๋ฅํ๋ค.
function GroceryList(props) {
function addItem() {
// Add Item
}
return (
<div>
<h1>Grocery List</h1>
<ul>
<li>Milk</li>
<li>Bread</li>
<li>Eggs</li>
</ul>
</div>
)
};
์ด๋ ๊ฒ ์ฌ์ฉํ๋ฉด, ์ฑ์ด ๋ฐฉ๋ํด์ง๊ณ , ๋ณต์กํด์ ธ๋, ์ฝ๊ฒ ์ดํดํ ์ ์๊ณ , ๋ง๋ค์ด ๋์ ์ปดํฌ๋ํธ๋ฅผ ์ฑ ์ ์ฒด๊ฐ ๊ณต์ ํ ์ ์์ผ๋ฏ๋ก ์ฝ๋์ ์ฌ์ฌ์ฉ์ด ๊ฐ๋ฅํด์ง๋ค.
๐ก 3. ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๋ ๋ฐฉ๋ฒ
- JS์์๋ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ ์ผ๋ฐ์ ์ผ๋ก DOM์ ์ ์ฅ๋๋ค.
DOM์ ๋ธ๋ผ์ฐ์ ์์ฒด์์ ๋ง๋ค๊ณ , ์ ์ง ๊ด๋ฆฌํ๋ฉฐ, ์ ์ฒด HTML์ ๋ํ๋ธ๋ค.
์๋ฅผ ๋ค๋ฉด, ๋ค์๊ณผ ๊ฐ์ด ํ ์คํธ ๋ฐ์ค๋ฅผ ์ ์ํ๊ณ , ์ฌ์ฉ์๊ฐ ์ ๋ ฅํ๋ฉด, ํด๋น ๋ด์ฉ์ด ๋ธ๋ผ์ฐ์ ์ ์ ์ฅ๋๋ค.
<input type="text" placeholder="Enter an item" id="item-input" />
๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์๊ฐ ๊ฐ์ ์ ๋ ฅํ ๋, ๊ฐ๋ฐ์๊ฐ ๋จผ์ DOM์์ ๊ฐ์ ์ฐพ์ ๋ค์ ์ถ์ถํ์ฌ, ํด๋น ์ ๋ ฅ ์์์ ๊ฐ์ ์๋์ผ๋ก ์ ๋ ฅํด์ผ ํ๋ค.
const input = document.getElementById("item-input"); console.log(input.value);
์ง๊ธ์, ์์ ์๋ผ, ํธ๋ฆฌํด๋ณด์ด์ง๋ง, ์
๋ ฅ์ด ์ฌ๋ฌ ๊ฐ์ผ ๋ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค.
๋ง์ฝ id๊ฐ ๋ค๋ฅธ ์
๋ ฅ ํ
์คํธ ๋ฐ์ค๊ฐ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด, id ๋ณ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ชจ๋ ๊ด๋ฆฌํด์ผ ํ๋ค.
- ๋ฐ๋ฉด, React๋ ์ฌ์ฉ์์ ์ ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ์ ์ํ(State)๋ฅผ ๊ด๋ฆฌํ๊ณ , ์ ๋ฐ์ดํธ ํ๋ ์ ์ด ์ปดํฌ๋ํธ๋ฅผ ์ด์ฉํด ์ฌ์ฉ์ ์ ๋ ฅ ์, ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด์ ํ ์คํธ ๊ฐ์ ์ค์ ํ๋ค. ์ด๋ฅผ ์ํด ๋จผ์ ์ํ๋ฅผ ์ ์ํด์ผ ํ๋ค.
const [itemInput, setItemInput] = useState(""); // ํ์ ํ์ธํ๊ธฐ
์ ๋ ฅ์ด ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ค์ ์ด ๋์ด์ผ ํ๋ฏ๋ก, HTML ์ฝ๋๋ ์กฐ๊ธ ๋ณต์กํด์ง ์ ์๋ค.
<input type="text" placeholder="Enter an item" value={itemInput} onChange={e =>
setItemInput(e.target.value)} />
ํ์ง๋ง, ์๋ฐ์คํฌ๋ฆฝํธ์์๋ ๋ค์๊ณผ ๊ฐ์ด, ๊ฐ๋จํ๊ฒ ํ ์คํธ ๋ฐ์ค์ ํ์ฌ ๊ฐ์ ํจ์ฌ ์ฝ๊ฒ ์ ์ ์๋ค.
console.log(itemInput);
ํ์ฌ ์ฑ์ ์ํ(State)๋ฅผ ์ ์ฅํ๊ธฐ ์ํด DOM์ ์์กดํ์ง ์์์ผ๋ก์จ, React๊ฐ ์ฌ์ฉ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๋ ์ด์ ์ ์ฑ์ด ์ฑ์ฅํ ์๋ก(์ปค์ง์๋ก) ๊ทธ ํจ๊ณผ๋ ์ปค์ง๋ค.
์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์์ ์ฑ์ ์ํ๋ฅผ ์ ์ฅํ๋ ๊ฒ์ React๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋นํด ์ป์ ์ ์๋ ๊ฐ์ฅ ํฐ ์ด์ ์ค ํ๋์ด๋ฉฐ ์ฑ์ด ๋ณต์กํ ์๋ก ํด๋น ์ด์ ์ด ์ปค์ง๋ค.
๐ก 4. UI ์ ๋ฐ์ดํธ ๋ฐฉ๋ฒ
๋ง์ง๋ง์, ์ด๋ฒคํธ ๋ฐ์ ์, ์ฑ์ด ์ฌ์ฉ์์ ๋ฐ์ํ๋ ๋ฐฉ์๊ณผ ์๋ก์ด ๋ณ๊ฒฝ ์ฌํญ์ ๋ฐ์ํ๋ UI ์ ๋ฐ์ดํธ ๋ฐฉ์์ด๋ค.
- JS์์๋ ํ ์คํธ ๋ฐ์ค ์์ ๋ค์์ฒ๋ผ ๋ฒํผ์ ์ถ๊ฐํ ์ ์๋ค.
<input type="text" placeholder="Enter an item" id="item-input" /> <button id="add-button">Add</button>
๊ทธ๋ฐ ๋ค์, ํด๋น ๋ฒํผ์ ๋๋ฅธ ๊ฒ์ ์๋ตํ๊ธฐ ์ํด DOM์์ ๋ฒํผ์ ์ฐพ๋๋ค.
const addButton = document.getElementById("add-button");
๊ทธ๋ฆฌ๊ณ , ๊ทธ ๋ฒํผ์ click listener๋ฅผ ์ค์ ํ๋ค.
addButton.addEventListener("click", function() {
// Append item
})
๊ทธ๋ฐ ๋ค์, ๋ฆฌ์ค๋ ๋ด๋ถ์์, ๋จผ์ ์ด์ ๊ณผ ๋์ผํ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ, ์
๋ ฅ ์์์ ๊ฐ์ ๊ฐ์ ธ์ฌ ์ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ฐ ๋ค์, ์๋ฃํ ๋ชฉ๋ก์ ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ค๋ฉด, DOM์์ ๋ชฉ๋ก์ ์ฐพ๊ณ , ์ถ๊ฐ ํ ์ ํญ๋ชฉ์ ๋ง๋ ๋ค์, ๋ง์ง๋ง์ผ๋ก ๋ชฉ๋ก ๋์ ์ถ๊ฐํด์ผ ํ ๊ฒ์ด๋ค. ( ์ด๋ ๊ฒ๋ง ๋ด๋, ์๋นํ ๋ณต์กํจ์ ์ ์ ์๋ค. )
- ๋ฐ๋ฉด, React๋ ์๋ฐ์คํฌ๋ฆฝํธ ๋ณ์์ ์ ์ฒด ์ํ๋ฅผ ์ ์งํ๋ค.
const [items, setItems] = useState(["Milk", "Bread", "Eggs"]);
๊ทธ๋ฆฌ๊ณ ๋ณ์์ ๊ฐ ํญ๋ชฉ์ ๋งคํ(Mapping)ํ ํ, ๊ทธ์ ๋ํ ๋ชฉ๋ก ์์๋ฅผ ๋ฐํํ์ฌ JSX์ ํ์ํ๋ค.
// ํ์, ํ์ธํ๊ธฐ
<ul>
{items.map(item => (
<li key={item}>{item}</li>
))}
</ul>
๊ทธ๋ฐ ๋ค์, ๋ฒํผ์ ๋๋ฅด๋ ๊ธฐ๋ฅ์ ์ ์ํ๋ค. click listener๋ ํ์ํ์ง ์๊ณ , onClick ๋ฒํผ ์์ฒด์ ์์ฑ์ ์ถ๊ฐ ํ ์ ์๋ค.
<button onClick={addItem}>Add React</button>
์ด ํจ์์ ์ถ๊ฐํ ๊ฒ์ setItem ํจ์๋ฅผ ์ฌ์ฉํ์ฌ, ๊ธฐ์กด ํญ๋ชฉ์ ์ ํญ๋ชฉ์ ์ถ๊ฐํ๋ ๊ฒ์ด๋ค.
function addItem() { console.log(itemInput); setItems([...items, itemInput]); }
์ด๋ก์จ, React๋ ๋ชฉ๋ก์ด ๋ณ๊ฒฝ๋์์์ ์๋์ผ๋ก, ๋ฑ๋กํ๊ณ , UI๋ฅผ ์๋์ผ๋ก ์ ๋ฐ์ดํธํ๋ค.
์ด ์ ๋ฐ์ดํธ ๊ธฐ๋ฅ์ React๊ฐ ๊ฐ์ง, ์๋ํจ ์ค ํ๋์ด๋ค.
'WEB' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[React] ์ปดํฌ๋ํธ(Component) (0) | 2021.02.06 |
---|---|
[React] JSX ๋ฌธ๋ฒ ๋ฐ ๋ ๋๋ง (0) | 2021.02.06 |
[JS] DOM,Event,Node๊ฐ์ฒด (0) | 2021.02.03 |
[HTML] HTML ์์ ํ๊ทธ ์ ๋ฆฌ (0) | 2021.02.02 |
[HTML] ์๋งจํฑ ํ๊ทธ ์ ๋ฆฌ (0) | 2021.02.02 |