์ ์ดํ Luvit ํ ๋ฌ ์คํฐ๋

๐Svelte
์น ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์ ์ฌ์ฉ๋๋ ์คํ์์ค ํ๋ก ํธ์๋ ํ๋ ์์ํฌ
Svelte๋ React๋ Vue์๋ ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์ ๊ทผํ๋ ํ๋ก ํธ์๋ ๋๊ตฌ๋ค. ํ๋ ์์ํฌ๊ฐ ์๋ ์ปดํ์ผ๋ฌ๋ผ๊ณ ๋ ํ๋ Svelte๋ React๋ Vue์ฒ๋ผ ๋ธ๋ผ์ฐ์ ์์ ์ฝ๋๋ฅผ ํด์ํ๊ณ ์คํํ๋ ๋ฐํ์ ๋ฐฉ์(๊ฐ์ DOM)์ ๋ฐ๋ฅด์ง ์๋๋ค. ๋์ , ๊ฐ๋ฐ์๊ฐ ์์ฑํ ํ์ผ์ ๋น๋ ์์ ์ ๋ถ์ํด ์ต์ ํ๋ ์์ JavaScript ์ฝ๋๋ก ๋ณํํ๋ค.
๋๋ถ์ ์ต์ข ๊ฒฐ๊ณผ๋ฌผ์๋ ํ๋ ์์ํฌ ์์ฒด์ ์ฝ๋๊ฐ ๊ฑฐ์ ํฌํจ๋์ง ์๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ๋ํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ์ฝ๋๋ง ๋จ๋๋ค. ์ด๋ก ์ธํด ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์๊ณ ์ด๊ธฐ ๋ก๋ฉ ์๋๊ฐ ๋น ๋ฅด๋ฉฐ, ๋ฐํ์ ์ฑ๋ฅ๋ ๋ ๋ฐ์ด๋๋ค.
Svelte ํน์ง
โ No Virtual DOM
React ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ๊ฐ์ DOM(Virtual DOM)์ด๋ผ๋ ๋ฉ๋ชจ๋ฆฌ์์ UI ํํ์ ์๋ก ๋ง๋ค๊ณ , ์ด์ ๋ฒ์ ๊ณผ ๋น๊ต(diffing)ํ์ฌ ์ค์ DOM์ ๋ณ๊ฒฝ ์ฌํญ์ ์ ์ฉํ๋ค. ์ด ๋ฐฉ์์ ํจ์จ์ ์ด์ง๋ง, ๋ชจ๋ ๋น๊ต์ ์ ๋ฐ์ดํธ๊ฐ ๋ฐํ์์ ์ํ๋๊ธฐ ๋๋ฌธ์ ์ผ์ ํ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ค.
Svelte๋ ์ด ๊ณผ์ ์ ์ปดํ์ผ ์์ ์ผ๋ก ์ฎ๊ฒผ๋ค. ์๋ฅผ ๋ค์ด count๋ผ๋ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด, Svelte ์ปดํ์ผ๋ฌ๋ count์ ์์กดํ๋ DOM ๋
ธ๋๋ฅผ ๋ฏธ๋ฆฌ ํ์
ํด๋๊ณ , ํด๋น ๋
ธ๋์ ํ
์คํธ๋ฅผ ์ง์ ๊ฐฑ์ ํ๋ ์ต์ ํ๋ JavaScript ์ฝ๋๋ฅผ ์์ฑํ๋ค. ๋ฐ๋ผ์ ๋ณ๋์ ๊ฐ์ DOM์ด ํ์ ์์ผ๋ฉฐ, ๋ฐํ์ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ ์ ์๋ค.
โ Truly Reactive
Svelte์ ๋ฐ์์ฑ ์์คํ ์ $: ๋ ์ด๋ธ ๊ตฌ๋ฌธ์ ํตํด ๊ตฌํ๋๋ค. ์ด๋ JavaScript์ ๊ธฐ์กด ๋ ์ด๋ธ ๋ฌธ๋ฒ์ ์ฐฝ์์ ์ผ๋ก ์ฌํด์ํ ๊ฒ์ผ๋ก, Svelte ์ปดํ์ผ๋ฌ์๊ฒ ํด๋น ์ฝ๋๊ฐ ๋ฐ์ํ์ผ๋ก ๋์ํด์ผ ํจ์ ์๋ ค์ฃผ๋ ์ ํธ ์ญํ ์ ํ๋ค.
๊ฐ๋ฐ์๋ ์ด๋ค ์ํ๊ฐ ๋ณํ ๋ ์ด๋ค ์ฝ๋๊ฐ ์คํ๋ผ์ผ ํ๋์ง๋ฅผ ๋ณ๋๋ก ์ ์ธํ๊ฑฐ๋, React์ useEffect์ฒ๋ผ ์์กด์ฑ ๋ฐฐ์ด์ ๊ด๋ฆฌํ ํ์๊ฐ ์๋ค. Svelte ์ปดํ์ผ๋ฌ๊ฐ ๋ณ์ ๊ฐ ์์กด์ฑ์ ์ ์ ๋ถ์ํ์ฌ, ์ํ ๋ณ๊ฒฝ ์ ํ์ํ ์ฝ๋๋ง ์๋์ผ๋ก ์คํ๋๋๋ก ๋ณด์ฅํ๋ค. ์ด ๋๋ถ์ ์์กด์ฑ ๋ฐฐ์ด ๊ด๋ฆฌ์ ๋ณต์ก์ฑ๊ณผ ๊ทธ๋ก ์ธํ ์ ์ฌ์ ๋ฒ๊ทธ์์ ์์ ๋ก์์ง๋ค.
โ Less Code
Svelte๋ ๋ถํ์ํ ๋ณด์ผ๋ฌํ๋ ์ดํธ(boilerplate) ์ฝ๋๋ฅผ ์ค์ด๋ ๋ฐ ์ด์ ์ ๋ง์ท๋ค. ์ํ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด useState ํ ์ ์ฌ์ฉํ๊ฑฐ๋, ์ํ ๋ณ๊ฒฝ์ ์ํด setCount ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ ํ์๊ฐ ์๋ค. ๋์ ์ผ๋ฐ JavaScript ๋ณ์์ ๊ฐ์ ํ ๋นํ๋ ๊ฒ๋ง์ผ๋ก ์ํ๊ฐ ๊ด๋ฆฌ๋๊ณ UI๊ฐ ๊ฐฑ์ ๋๋ค.
์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ฝ๋๋์ ํฌ๊ฒ ์ค์ด๊ณ , ๊ฐ๋
์ฑ์ ๋์ด๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๋น์ฆ๋์ค ๋ก์ง์ ๋ ์ง์คํ ์ ์๋๋ก ๋๋๋ค. ๋ํ HTML, CSS, JavaScript๊ฐ ํ๋์ ํ์ผ(.svelte)์ ์์ฐ์ค๋ฝ๊ฒ ํตํฉ๋๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ ๋จ์์ ์ ์ง๋ณด์์ ์์ฐ์ฑ์ด ๋๋ค.
๐Svelte ๊ฐ๋ฐ ํ๊ฒฝ ์ค์
Svelte๋ Git ์ ์ฅ์ ๋ณต์ ๋๊ตฌ์ธ degit์ ์ฌ์ฉํ๋ค. degit์ git ํ์คํ ๋ฆฌ๋ฅผ ์ ์ธํ๊ณ ์ต์ ๋ฒ์ ์ ํ์ผ๋ง ๊ฐ์ ธ์จ๋ค.
# Svelte ๊ณต์ ํ
ํ๋ฆฟ์ผ๋ก 'my-svelte-app' ํ๋ก์ ํธ ์์ฑ
npx degit sveltejs/template my-svelte-app
# ์์ฑ๋ ํด๋๋ก ์ด๋ํ์ฌ ์์กด์ฑ ์ค์น
cd my-svelte-app
npm install
# ๊ฐ๋ฐ ์๋ฒ ์คํ
npm run dev
degit์ผ๋ก ํ ํ๋ฆฟ์ ๋ฐ๋ค์ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก svelte 3.x.x ๋ฒ์ ์ด ์ค์น๋๋ค. ์ต์ ๋ฉ์ด์ ๋ฒ์ ์ 6์ด์ง๋ง, ๋ฒ์ 5๋ถํฐ๋ SvelteKit์ด๋ผ๋ ํ์คํ ํ๋ ์์ํฌ ๊ฐ๋ ์ด ํตํฉ๋์๋ค. ์ผ๋ฐ ์ค๋ฒจํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ v4๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
# ํ๋ก์ ํธ ๋ฃจํธ์์ ์คํ
npx svelte-migrate@latest svelte-4
CLI์์ ๋ช ๊ฐ์ง ์ธ๋ถ ์ค์ ์ ๋ฌผ์ด๋ณด๋ฉด ์ ํํ ํ ๋ง์ด๊ทธ๋ ์ด์ ์ ์๋ฃํ๋ฉด ๋๋ค.
ํด๋๊ตฌ์กฐ
์์ฑ๋ ํ๋ก์ ํธ์ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์กฐ๋ ๋ฆฌ์กํธ์ ์ ์ฌํ๋ค.
my-svelte-app/
โโโ public/ # ์ ์ ํ์ผ (favicon, ์ด๋ฏธ์ง ๋ฑ)
โ โโโ index.html
โโโ src/ # Svelte ์ปดํฌ๋ํธ ์์ค
โ โโโ App.svelte # ๋ฃจํธ ์ปดํฌ๋ํธ
โ โโโ main.js # ์ฑ ์ง์
์
โโโ package.json # ์์กด์ฑ ์ ๋ณด
โโโ rollup.config.js # ๋ฒ๋ค๋ง ์ค์ (Rollup)
Svelte 4๋ ๊ธฐ๋ณธ ๋ฒ๋ค๋ฌ๋ก Rollup์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์, rollup.config.js๊ฐ ํฌํจ๋์ด ์๋ค. ์ฌ๊ธฐ์ ๋น๋ ์ค์ ์ ํ์ธํ๊ณ ๋ณ๊ฒฝํ ์ ์๋ค.
๐Svelte ์ปดํฌ๋ํธ ๊ตฌ์กฐ
svelte์ ๋ชจ๋ ์ปดํฌ๋ํธ๋ .svelte ํ์ฅ์๋ฅผ ๊ฐ์ง ํ๋์ ํ์ผ๋ก ์กด์ฌํ๋ค. ์คํฌ๋ฆฝํธ ์์ญ, ๋งํฌ์ ์์ญ, ์คํ์ผ ์์ญ์ผ๋ก ๊ตฌ์ฑ๋๋ค.
<!-- App.svelte -->
<script>
// 1. ์คํฌ๋ฆฝํธ ์์ญ: JS ๋ก์ง
let name = "Svelte";
</script>
<!-- 2. ๋งํฌ์
์์ญ: HTML ๊ตฌ์กฐ -->
<h1>Hello {name}!</h1>
<!-- 3. ์คํ์ผ ์์ญ: CSS -->
<style>
/* ์ฌ๊ธฐ์ ์์ฑ๋ ์คํ์ผ์ ์ด ์ปดํฌ๋ํธ์๋ง ์ ์ฉ๋๋ค! */
h1 {
color: royalblue;
}
</style>
๐Svelte ๋ฌธ๋ฒ
์ํ ๊ด๋ฆฌ
Svelte์ ์ํ ๊ด๋ฆฌ๋ `useState` ๊ฐ์ ํน๋ณํ API ์์ด, ์ผ๋ฐ์ ์ธ JavaScript ๋ณ์ ์ ์ธ(`let`)์ผ๋ก ์์
๋จ์ ์ํ๊ฐ
<script>
let name = 'Svelte';
</script>
<h1>Hello, {name}!</h1>
์ด๋ฒคํธ๋ก ์ํ๊ฐ ๋ณ๊ฒฝ
์ด๋ฒคํธ๋ฅผ ํตํด ๋ณ์์ ์๋ก์ด ๊ฐ์ ํ ๋นํ๋ฉด Svelte๊ฐ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ํ๋ฉด์ ์๋์ผ๋ก ๋ ๋๋งํ๋ค.
<script>
let count = 0;
function increment() {
count = count + 1;
}
</script>
<p>Count: {count}</p>
<button on:click={increment}>Increment</button>
๊ฐ์ฒด ์์ฑ์ ์ํ๊ฐ์ผ๋ก ์ฌ์ฉ
๊ฐ์ฒด ๋ํ ์ํ๊ฐ์ด ๋ ์ ์๋ค. ๊ฐ์ฒด์ ์์ฑ์ ๋ณ๊ฒฝํ ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ํ ๋น(`=`)์ ์ฌ์ฉํด์ผ Svelte๊ฐ ๋ณํ๋ฅผ ๊ฐ์งํ๋ค.
<script>
let user = {
name: '์ค๋ฒจํธ',
isLoggedIn: false,
};
function login() {
user = { ...user, isLoggedIn: true };
}
</script>
{#if user.isLoggedIn}
<p>{user.name}๋ ํ์ํฉ๋๋ค.</p>
{:else}
<button on:click={login}>๋ก๊ทธ์ธ</button>
{/if}
๊ฐ์ฒด๋ก ์ด๋ฃจ์ด์ง ๋ฐฐ์ด๋ก ์ํ๊ฐ ํ์
<script>
let todos = [
{ id: 1, text: 'Svelte ๊ณต๋ถํ๊ธฐ', done: true },
{ id: 2, text: '์ด๋ํ๊ธฐ', done: false },
];
function addTodo() {
const newTodo = { id: Date.now(), text: '์๋ก์ด ํ ์ผ', done: false };
// ๋ฐฐ์ด์ push ํ ํ, ์๊ธฐ ์์ ์๊ฒ ๋ค์ ํ ๋นํฉ๋๋ค.
todos.push(newTodo);
todos = todos;
}
</script>
<button on:click={addTodo}>ํ ์ผ ์ถ๊ฐ</button>
<ul>
{#each todos as todo (todo.id)}
<li class:done={todo.done}>{todo.text}</li>
{/each}
</ul>
<style>
.done { text-decoration: line-through; color: #aaa; }
</style>
๋ฐ์์ฑ
๋ฐ์์ฑ์ ํน์ ์ํ๊ฐ ๋ณํ ๋ ๋ค๋ฅธ ๊ฐ์ด๋ UI๊ฐ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋๋ ๊ฒ
์ผํญ ์ฐ์ฐ์๋ฅผ ํตํ ๋งํฌ์
์์์ ๋ฐ์์ฑ
์คํฌ๋ฆฝํธ ๋ก์ง ์์ด๋ ๋งํฌ์
๋ด์์ ๊ฐ๋จํ ๋ฐ์์ฑ์ ๊ตฌํํ ์ ์๋ค.
<script>
let loggedIn = false;
</script>
<button on:click={() => loggedIn = !loggedIn}>
{loggedIn ? '๋ก๊ทธ์์' : '๋ก๊ทธ์ธ'}
</button>
์คํฌ๋ฆฝํธ ๋ฐ์์ฑ ์ฝ๋ (`$:`)
Svelte์ ํต์ฌ ๊ธฐ๋ฅ. $: ๋ ์ด๋ธ์ ์์กดํ๋ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ํด๋น ๋ผ์ธ์ ์ฝ๋๋ฅผ ๋ค์ ์คํ์ํจ๋ค.
<script>
let count = 0;
$: doubled = count * 2;
$: message = `ํ์ฌ ์นด์ดํธ ${count}์ ๋ ๋ฐฐ๋ ${doubled}์
๋๋ค.`;
// $: ๋ค์ ๋ก์ง ๋ธ๋ก๋ ๊ฐ๋ฅํฉ๋๋ค.
$: if (count >= 5) {
console.log('์นด์ดํธ๊ฐ 5 ์ด์์
๋๋ค!');
}
</script>
<button on:click={() => count += 1}>
Count: {count}
</button>
<p>{message}</p>
Svelte ์ด๋ฒคํธ
์ด๋ฒคํธ ๋ฌธ๋ฒ
on: ์ง์์ด๋ฅผ ์ฌ์ฉํ์ฌ HTML ์์์ ์ด๋ฒคํธ๋ฅผ ์ฐ๊ฒฐํ๋ค.
<script>
function handleClick() {
alert('๋ฒํผ์ด ํด๋ฆญ๋์์ต๋๋ค!');
}
</script>
<button on:click={handleClick}>ํด๋ฆญ</button>
| ์์ฃผ ์ฐ๋ ์ด๋ฒคํธ | ์ค๋ช |
| on:click | ์์๋ฅผ ํด๋ฆญํ์ ๋ |
| on:mouseover | ๋ง์ฐ์ค ํฌ์ธํฐ๊ฐ ์์ ์๋ก ์ฌ๋ผ์์ ๋ |
| on:input | input, textarea ๋ฑ์ ๊ฐ์ด ๋ณ๊ฒฝ๋ ๋ |
| on:submit | <form>์ด ์ ์ถ๋ ๋ |
| on:keydown` | ํค๋ณด๋๋ฅผ ๋๋ ์ ๋ |
์ด๋ฒคํธ ์์์ด
| ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฒคํธ์ ๋์์ ์ ์ดํ๋ ์์์ด๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
<form on:submit|preventDefault={handleSubmit}>
<button on:click|once>ํ ๋ฒ๋ง ํด๋ฆญ ๊ฐ๋ฅ</button>
</form>
| ์์ฃผ ์ฐ๋ ์์์ด | ์ค๋ช |
| preventDefault | ์ด๋ฒคํธ์ ๊ธฐ๋ณธ ๋์์ ๋ง๋๋ค. |
| stopPropagation | ์ด๋ฒคํธ๊ฐ ์์ ์์๋ก ์ ํ(๋ฒ๋ธ๋ง)๋๋ ๊ฒ์ ๋ง๋๋ค. |
| once | ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ์ต์ด ํ ๋ฒ๋ง ์คํํ๋ค. |
| self | event.target์ด ์๊ธฐ ์์ ์ผ ๋๋ง ํธ๋ค๋ฌ๋ฅผ ์คํํ๋ค. |
Svelte Props
props๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ
Props ๊ธฐ๋ณธ ๋ฌธ๋ฒ
์์ ์ปดํฌ๋ํธ์ <script> ๋ธ๋ก ์์์ export let์ผ๋ก ๋ณ์๋ฅผ ์ ์ธํ๋ฉด ํด๋น ๋ณ์๋ prop์ด ๋๋ค.
<!-- Child.svelte -->
<script>
export let userName;
</script>
<p>{userName}๋, ํ์ํฉ๋๋ค.</p>
<!-- Parent.svelte -->
<script>
import Child from './Child.svelte';
</script>
<Child userName="์ค๋ฒจํธ" />
Props ๊ธฐ๋ณธ๊ฐ ์ค์
prop์ ์ ์ธํ ๋ ๊ฐ์ ํ ๋นํ๋ฉด ๊ธฐ๋ณธ๊ฐ์ด ๋๋ค. ๋ถ๋ชจ์์ ํด๋น prop์ ์ ๋ฌํ์ง ์์ผ๋ฉด ์ด ๊ธฐ๋ณธ๊ฐ์ด ์ฌ์ฉ๋๋ค.
<!-- Child.svelte -->
<script>
export let userName = '๋ฐฉ๋ฌธ์'; // ๊ธฐ๋ณธ๊ฐ ์ค์
</script>
์คํ๋ ๋ Props
๊ฐ์ฒด์ ๋ชจ๋ ์์ฑ์ ํ ๋ฒ์ props๋ก ์ ๋ฌํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
<script>
import InfoCard from './InfoCard.svelte';
const userInfo = {
name: '๊น์ค๋ฒจํธ',
age: 10,
country: 'ํ๊ตญ',
};
</script>
<InfoCard {...userInfo} />
Svelte ๋ก์ง
ํ ํ๋ฆฟ ์์์ ๋์ ์ธ UI๋ฅผ ๊ทธ๋ฆฌ๊ธฐ ์ํ ์ ์ด๋ฌธ
๋
ผ๋ฆฌ ๋ก์ง: if ๋ธ๋ก
์กฐ๊ฑด์ ๋ฐ๋ผ ๋ค๋ฅธ ๋งํฌ์
์ ๋ ๋๋งํ๋ค.
{#if status === 'loading'}
<p>๋ก๋ฉ ์ค...</p>
{:else if status === 'error'}
<p>์ค๋ฅ ๋ฐ์!</p>
{:else}
<p>๋ก๋ฉ ์๋ฃ.</p>
{/if}
๋ฐ๋ณต ๋ก์ง: each ๋ธ๋ก
๋ฐฐ์ด์ ๊ฐ ํญ๋ชฉ์ ์ํํ๋ฉฐ ๋ ๋๋งํ๋ค. (item.id)์ ๊ฐ์ด ๊ณ ์ ํ ํค๋ฅผ ์ง์ ํด์ฃผ๋ฉด ์ฑ๋ฅ ์ต์ ํ์ ๋์์ด ๋๋ค.
<ul>
{#each items as item (item.id)}
<li>{item.name}</li>
{:else}
<li>ํ์ํ ํญ๋ชฉ์ด ์์ต๋๋ค.</li>
{/each}
</ul>
๐๋์ ํ๊ธฐ

1์ฃผ์ฐจ์๋ 2๋ถ๊น์ง ๊ณต๋ถํ๋ค. ์ด 512ํ์ด์ง ์ค 2๋ถ๋ 91ํ์ด์ง๊น์ง์๊ณ , Svelte ๊ฐ๋ฐ ํ๊ฒฝ ์ธํ ๊ณผ ๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ๋ค๋ฃจ๋ ๋ด์ฉ์ด๋ผ ํฐ ์ด๋ ค์์ ์์๋ค. ์ฝ์ผ๋ฉด์ ๊ถ๊ธํ ์ ์ ์ฐพ์๋ณด๊ณ ์ ๋ฆฌํ๋ ๋ฐ๊น์ง 2์๊ฐ์ด ์ฑ ๊ฑธ๋ฆฌ์ง ์์๋ค.
์ง๊ธ๊น์ง ๋๋ ์ ์ ์ค๋ช ์ด ์ ๋ง ์ฝ๋ค๋ ๊ฒ์ด๋ค. ๊ธฐ๋ณธ์ ์ธ ๋ด์ฉ์ด๋ผ ๊ทธ๋ ๊ฒ ๋๊ปด์ง๋ ๊ฑธ ์๋ ์๊ฒ ์ง๋ง, ์ฑ ์์ฒด๊ฐ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ์ฝํ๋ ๋์ด๋๋ค. (๋ฌผ๋ก JavaScript์ ๋ํ ๊ธฐ๋ณธ ์ง์์ด ์๋ค๋ ์ ์ ํ์) ํ๋ก ํธ์๋ ํ๋ ์์ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๊ฒฝํ์ด ์๋ ์ฌ๋๋ ์ด ์ฑ ์ผ๋ก๋ผ๋ฉด ๊ฝค ๋น ๋ฅด๊ฒ ๋ฐฐ์ธ ์ ์์ ๊ฒ ๊ฐ๋ค.
์ฑํฐ๋ง๋ค ํด์ฆ์ ์ค์ต ๋ฌธ์ ๊ฐ ํฌํจ๋์ด ์๊ณ , ๋ชฉ์ฐจ๊ฐ ๊ต์ฅํ ์ธ๋ถํ๋์ด ์๋ค๋ ์ ๋ ๋ง์์ ๋ค์๋ค. ์์์ ์ ๋ฆฌํ ๋ฌธ๋ฒ๋ค์ด ์ฌ์ค ๋ชฉ์ฐจ๋ฅผ ๊ทธ๋๋ก ์ฎ๊ธด ์์ค์ธ๋ฐ, ๊ทธ๋งํผ ๋ฌธ๋ฒ ํ๋ํ๋๊ฐ ๋ ๋ฆฝ๋ ์์ฃผ์ ๋ก ์ ๋ฆฌ๋ผ ์์ด ํ์ํ ๋ ๋ค์ ์ด๊ธฐ ์ข์๋ค.
React์ ๋ค๋ฅธ ์ ์ด ๋ง์์ ์กฐ๊ธ ํท๊ฐ๋ฆฌ๋ฉด์๋, ์ฌ๋ฏธ์๋ค. ๋ค์์ฃผ๋ถํฐ ์ค์ต ํํธ ๊ณต๋ถํ ํ ๋ฐ ๋๋ฌด ๊ธฐ๋๋๋ค.