๐ [Recat] React๋ฅผ ์ฌ์ฉํ๋ ์ด์ : Vanilla JS์์ ๋น๊ต
![๐ [Recat] React๋ฅผ ์ฌ์ฉํ๋ ์ด์ : Vanilla JS์์ ๋น๊ต](/assets/img/thumbnail/react-thumbnail.jpg)
[React] React๋ฅผ ์ฌ์ฉํ๋ ์ด์ : Vanilla JS์์ ๋น๊ต
์น ๊ฐ๋ฐ์ ์ฒ์ ์์ํ์ ๋ ๋๋ถ๋ถ์ ์์ํ JavaScript๋ก DOM์ ์ ์ดํ๊ณ ์ด๋ฒคํธ๋ฅผ ๋ค๋ฃจ๋ฉฐ UI๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
์ด ๋ฐฉ์์ ํํ Vanilla JS๋ผ๊ณ ๋ถ๋ฅด์ฃ . ์ ์ญ์ ์ฒ์์๋ ์ด ๋ฐฉ์์ผ๋ก ์ถฉ๋ถํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ํ์ง๋ง ํ๋ก์ ํธ๊ฐ ์ ์ ๋ณต์กํด์ง๊ณ UI์ ๋์ ์์๊ฐ ๋ง์์ง์๋ก ํ๊ณ๊ฐ ๋๋ฌ๋ฌ์ต๋๋ค.
๊ทธ ๊ณผ์ ์์ ์ ๊ฐ ์ ํํ ๋๊ตฌ๊ฐ ๋ฐ๋ก React์
๋๋ค.
์ด ๊ธ์์๋ React๋ฅผ ์ ์ฌ์ฉํ๊ฒ ๋์๋์ง, Vanilla JS์ ๋น๊ตํ๋ฉด์ ์ ๋ฆฌํด ๋ณด๊ฒ ์ต๋๋ค.
๐ 1. DOM ์ ์ด ๋ฐฉ์์ ์ฐจ์ด
Vanilla JS๋ HTML ์์๋ฅผ ์ ํํด์ ์ง์ ์กฐ์ํฉ๋๋ค.
document.getElementById('title').innerText = 'Hello World';
์ด ๋ฐฉ์์ ๊ฐ๋จํ์ง๋ง, ์ํ๊ฐ ์์ฃผ ๋ฐ๋๋ UI์๋ ๊ต์ฅํ ๋นํจ์จ์ ์ ๋๋ค. ๋งค๋ฒ DOM์ ์ฐพ์์ ๋ฐ๊พธ๋ ๋ฐ๋ณต์ด ํ์ํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
React๋ Virtual DOM์ ์ฌ์ฉํ์ฌ ๋ณ๊ฒฝ๋ ๋ถ๋ถ๋ง ํจ์จ์ ์ผ๋ก ๊ฐฑ์ ํฉ๋๋ค.
const [title, setTitle] = useState('Hello World');
return
์ํ๊ฐ ๋ฐ๋๋ฉด ํด๋น ์ปดํฌ๋ํธ๊ฐ ์๋์ผ๋ก ๋ฆฌ๋ ๋๋ง๋๋ฉฐ, ์ค์ DOM์๋ ํ์ํ ๋ถ๋ถ๋ง ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
๐งฉ 2. ์ปดํฌ๋ํธ ๊ธฐ๋ฐ์ ๊ตฌ์กฐํ
Vanilla JS์์๋ UI์ ๊ฐ ๋ถ๋ถ์ ํจ์๋ก ๋ถ๋ฆฌํ๊ฑฐ๋ ์ฌ์ฌ์ฉํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋ฐ๋ณต๋๋ HTML ๊ตฌ์กฐ๋ฅผ ๋ณต๋ถํ๊ฑฐ๋, ๋ฌธ์์ด๋ก innerHTML์ ์ฒ๋ฆฌํ๊ฒ ๋ฉ๋๋ค.
React์์๋ UI๋ฅผ ์ปดํฌ๋ํธ ๋จ์๋ก ์ชผ๊ฐ๊ณ ์ฌ์ฌ์ฉํ ์ ์์ต๋๋ค.
function Button({ text }) {
return <button>{text}</button>;
}
์ด๋ฐ ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ตฌ์กฐ๋ ์ ์ง๋ณด์์ ํ์ฅ์ ๋งค์ฐ ์ ๋ฆฌํฉ๋๋ค.
๐ 3. ์ํ ๊ด๋ฆฌ์ ํธ์์ฑ
Vanilla JS๋ก ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด ์ ์ญ ๋ณ์์ ๋ณต์กํ ์ด๋ฒคํธ ์ฒ๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
let count = 0;
function increment() {
count++;
document.getElementById('counter').innerText = count;
}
React์์๋ useState๋ฅผ ์ฌ์ฉํ์ฌ ์ํ๋ฅผ ๊ฐ๋จํ๊ฒ ๊ด๋ฆฌํ ์ ์์ต๋๋ค.
const [count, setCount] = useState(0);
return (
<div>
<p>{count}</p>
<button onClick={() => setCount(count + 1)}>์ฆ๊ฐ</button>
</div>
);
๋ณ์ ๊ด๋ฆฌ, ํ๋ฉด ๊ฐฑ์ , ์ด๋ฒคํธ ์ฐ๊ฒฐ ๋ชจ๋ ํ๋์ ๊ตฌ์กฐ ์์์ ๊น๋ํ๊ฒ ๊ด๋ฆฌ๋ฉ๋๋ค.
๐ 4. UI ๋ณต์ก์ฑ ๋์
์น ์ฑ์ ๊ท๋ชจ๊ฐ ์ปค์ง๋ฉด ํ์ด์ง๋ง๋ค ์์ญ, ์๋ฐฑ ๊ฐ์ DOM ์์์ ์ด๋ฒคํธ๊ฐ ๋ค์์ด๊ฒ ๋ฉ๋๋ค. Vanilla JS์์๋ ๊ฐ ์ํ์ ์์๋ฅผ ์ฐ๊ฒฐํ๊ณ ์ถ์ ํ๋ ๋ฐ ๋ง์ ์ฝ๋์ ๋ณต์ก๋๊ฐ ํ์ํฉ๋๋ค.
React๋ ์ํ ๊ธฐ๋ฐ ๋ ๋๋ง๊ณผ ์ปดํฌ๋ํธ ๊ตฌ์กฐ ๋๋ถ์ UI๊ฐ ๋ณต์กํด์ ธ๋ ๋ช ํํ ๊ตฌ์กฐ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
๐ 5. ์ํ๊ณ์ ํ์ฅ์ฑ
React๋ ๋จ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์ด์ ํ๋ถํ ์ํ๊ณ๋ฅผ ์๋ํฉ๋๋ค.
- Next.js โ ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง, SEO ์ง์
- React Router โ ํด๋ผ์ด์ธํธ ์ฌ์ด๋ ๋ผ์ฐํ
- Redux, Zustand โ ๋ณต์กํ ์ํ ๊ด๋ฆฌ
- Tailwind, styled-components โ ๋ค์ํ ์คํ์ผ๋ง ๋ฐฉ๋ฒ
- ๋ฐ๋ฉด, Vanilla JS๋ก๋ ์ด๋ฐ ๊ธฐ๋ฅ์ ์ง์ ๊ตฌํํ๊ฑฐ๋ ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋งค๋ฒ ๋ฐ๋ก ์ฐ๋ํด์ผ ํฉ๋๋ค.
๐ ๋ช ๋ นํ๊ณผ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ์ฐจ์ด
๋ช ๋ นํ(Imperative)๊ณผ ์ ์ธํ(Declarative) ํ๋ก๊ทธ๋๋ฐ์ ์ฐจ์ด๋ โ์ด๋ป๊ฒ(How) ์ฒ๋ฆฌํ ์ง๋ฅผ ์ง์ ๋ช ์ํ๋๋(๋ช ๋ นํ)โ vs โ๋ฌด์(What)์ ํ ์ง๋ฅผ ์ ์ธํ๋๋(์ ์ธํ)โ๋ก ์์ฝ๋ฉ๋๋ค.
์ค์ํ๋ก ์์
- ๋ช ๋ นํ : ๊ฐ๋จ์ญ ์งํ์ฒ ์์ ๋ด๋ ค์ 500m ์ง์งํด์ ์ฌ๊ฑฐ๋ฆฌ์์ ์ขํ์ 50m ์ง์ง
- ์ ์ธํ : ์์ธํน๋ณ์ ์์ด๊ตฌ ๊ฐ๋จ๋๋ก 444๊ธธ
React๋ ๋ํ์ ์ธ ์ ์ธํ ํ๋ก๊ทธ๋๋ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ์๋์ ๊ฐ์ ๋์์ ๋ช ๋ นํ vs ์ ์ธํ์ผ๋ก ๊ตฌํํ ์์๋ฅผ ๋ณด์ฌ๋๋ฆด๊ฒ์.
โ ์์: ๋ฒํผ ํด๋ฆญ ์ ๋ฆฌ์คํธ์ ์์ดํ ์ถ๊ฐํ๊ธฐ
๐ป ๋ช ๋ นํ ๋ฐฉ์ (Vanilla JS)
<!DOCTYPE html>
<html>
<body>
<ul id="list"></ul>
<button onclick="addItem()">Add Item</button>
<script>
let count = 1;
function addItem() {
const ul = document.getElementById('list');
const li = document.createElement('li');
li.textContent = 'Item ' + count++;
ul.appendChild(li);
}
</script>
</body>
</html>
โก๏ธ ์ด๋ป๊ฒ DOM์ ์กฐ์ํ ์ง ํ๋ํ๋ ์ง์ํ๋ ๋ฐฉ์์ ๋๋ค.
๐บ ์ ์ธํ ๋ฐฉ์ (React)
import { useState } from 'react';
function ItemList() {
const [items, setItems] = useState([]);
const addItem = () => {
setItems([...items, `Item ${items.length + 1}`]);
};
return (
<div>
<ul>
{items.map((item, i) => <li key={i}>{item}</li>)}
</ul>
<button onClick={addItem}>Add Item</button>
</div>
);
}
โก๏ธ ๋ฆฌ์คํธ๊ฐ ์ด๋ค ์ํ์ฌ์ผ ํ๋์ง๋ง ์ ์ธํ๊ณ , React๊ฐ UI๋ฅผ ๊ด๋ฆฌํฉ๋๋ค.
- ๋ช ๋ นํ: ๋ฆฌ์คํธ๋ฅผ ๋ง๋ค๊ณ , ์์๋ฅผ ๋ง๋ค๊ณ , ๊ทธ๊ฑธ DOM์ ์ถ๊ฐํ๋ ๊ณผ์ ์ ์ง์ ์์๋๋ก ์ง์ํจ.
- ์ ์ธํ: โ๋ฆฌ์คํธ๋
items
์ํ๋ก ํํ๋๊ณ , ๋ฒํผ์ ๋๋ฅด๋ฉด ํญ๋ชฉ์ ์ถ๊ฐํ๋คโ๊ณ ์ํ๋ง ์ ์ธํจ.
๐ง ์ฐจ์ด ์์ฝ
๊ตฌ๋ถ | ๋ช ๋ นํ (Imperative) | ์ ์ธํ (Declarative) |
---|---|---|
ํต์ฌ ์ง๋ฌธ | ์ด๋ป๊ฒ ๋์ํ ์ง๋ฅผ ์ค๋ช ํ๋ค | ๋ฌด์์ด ํ์ํ์ง๋ฅผ ์ค๋ช ํ๋ค |
๊ฐ๋ฐ์๊ฐ ํ๋ ์ผ | DOM ์กฐ์์ ์ง์ ํจ (์ ์ฐจ ์ค์ฌ) | ์ํ๋ง ์ ์ธํ๋ฉด React๊ฐ ์์์ ์ฒ๋ฆฌํจ |
์: ๋ฒํผ ํด๋ฆญ ์ ๋ฆฌ์คํธ ์ถ๊ฐ | createElement , appendChild ๋ฑ ์ง์ ์ฌ์ฉ | useState ๋ก ์ํ ์ ์ธ, JSX๋ก UI ํํ |
๐ ์ ๋ฆฌ
ํญ๋ชฉ | Vanilla JS | React |
---|---|---|
DOM ์ ์ด | ์ง์ ์๋ ์ ์ด | Virtual DOM ์๋ ์ฒ๋ฆฌ |
UI ๊ตฌ์ฑ | HTML ์กฐ๊ฐ ๋ณต๋ถ | ์ปดํฌ๋ํธ ๊ธฐ๋ฐ ๊ตฌ์กฐํ |
์ํ ๊ด๋ฆฌ | ๋ณ์์ DOM ์๋ ์ฐ๋ | useState๋ก ๊น๋ํ ์ํ ์ฒ๋ฆฌ |
์ฌ์ฌ์ฉ์ฑ | ๊ฑฐ์ ์์ | ๋์ |
์ ์ง๋ณด์ | ์ด๋ ต๊ณ ์ฝ๋ ์ค๋ณต ๋ง์ | ๊ตฌ์กฐํ ์ฌ์ |
ํ์ต ๋์ด๋ | ์ฌ์ | ์ค๊ฐ |
ํ์ฅ์ฑ | ์ ํ์ | ๋งค์ฐ ๋์ |
๋ฐฉ์ | ๋ช ๋ นํ | ์ ์ธํ |
โ๏ธ ๋ง๋ฌด๋ฆฌ
์ฒ์์๋ Vanilla JS๋ก๋ ์ถฉ๋ถํ๋ค๊ณ ์๊ฐํ์ง๋ง,
React๋ฅผ ์ ํ ์ดํ๋ก ๊ฐ๋ฐ ํจ์จ, ์ ์ง๋ณด์, ์ฌ์ฉ์ ๊ฒฝํ ๋ชจ๋์์ ํฐ ์ฐจ์ด๋ฅผ ๋๊ผ์ต๋๋ค.
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ๊ด์ฌ์ด ์๋ค๋ฉด React๋ ๊ผญ ์ตํ์ผ ํ ๋๊ตฌ๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์์ผ๋ก JSX, ํ
(Hooks), ๋ผ์ฐํ
, ์ํ ๊ด๋ฆฌ ๋ฑ React์ ๋ค์ํ ์ฃผ์ ๋ก ๊ธ์ ์ด์ด๊ฐ ๋ณด๊ฒ ์ต๋๋ค.
๐ Reference
- React ๊ณต์ ์ฌ์ดํธ
- https://milooy.github.io/dev/220810-abstraction-and-declarative-programming/
- [React] ๋ฆฌ์กํธ vs ๋ฐ๋๋ผ ์๋ฐ์คํฌ๋ฆฝํธ (์ ํ๋ ์์ํฌ๋ฅผ ์ฐ๋๊ฑฐ์ง?)
- ์ด๋ฏธ์ง ์ถ์ Freepik | ์ฌ์ธ์ AI ํฌ๋ฆฌ์์ดํฐ๋ธ ํด