๐ŸŽจ ํ”„๋ก ํŠธ์—”๋“œ ๐ŸŒฑ ์ž…๋ฌธ

Svelte ์ž…๋ฌธ

Svelte๋กœ ๋น ๋ฅธ ์›น์•ฑ ๊ฐœ๋ฐœ

โฑ๏ธ 8์‹œ๊ฐ„ ๐Ÿ‘๏ธ 41 ์กฐํšŒ
๐Ÿ“– ๊ฐ•์ขŒ ๋‚ด์šฉ
# Svelte ์ž…๋ฌธ ๊ฐ€์ด๋“œ

## ํ•™์Šต ๋ชฉํ‘œ
์ปดํŒŒ์ผ ํƒ€์ž„ ํ”„๋ ˆ์ž„์›Œํฌ Svelte๋กœ ๋น ๋ฅธ ์›น์•ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

## 1. Svelte๋ž€?
์ปดํŒŒ์ผ ํƒ€์ž„์— ์ตœ์ ํ™”๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
- ๊ฐ€์ƒ DOM ์—†์ด ์ง์ ‘ DOM ์กฐ์ž‘
- ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ์ž‘์Œ
- ๊ฐ„๊ฒฐํ•œ ๋ฌธ๋ฒ•
- ๋›ฐ์–ด๋‚œ ์„ฑ๋Šฅ

## 2. ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

```bash
npm create svelte@latest myapp
cd myapp
npm install
npm run dev
```

## 3. ์ปดํฌ๋„ŒํŠธ ๊ธฐ์ดˆ

```svelte
<script>
let name = "World";
</script>

<h1>Hello {name}!</h1>

<style>
h1 {
color: purple;
}
</style>
```

## 4. ๋ฐ˜์‘์„ฑ (Reactivity)

```svelte
<script>
let count = 0;

// ๋ฐ˜์‘ํ˜• ์„ ์–ธ
$: doubled = count * 2;

// ๋ฐ˜์‘ํ˜• ๊ตฌ๋ฌธ
$: console.log("count changed:", count);

$: if (count > 10) {
alert("Too high!");
}
</script>

<button on:click={() => count++}>
Clicked {count} times
</button>
<p>Doubled: {doubled}</p>
```

## 5. Props

```svelte
<!-- Child.svelte -->
<script>
export let name;
export let age = 0; // ๊ธฐ๋ณธ๊ฐ’
</script>

<p>{name} is {age} years old</p>

<!-- Parent.svelte -->
<script>
import Child from "./Child.svelte";
</script>

<Child name="Kim" age={25} />
```

## 6. ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

```svelte
<script>
function handleClick(event) {
alert("Clicked!");
}

function handleInput(event) {
console.log(event.target.value);
}
</script>

<button on:click={handleClick}>Click me</button>
<button on:click|preventDefault={handleClick}>No default</button>
<input on:input={handleInput} />
```

## 7. ๋ฐ”์ธ๋”ฉ

```svelte
<script>
let name = "";
let checked = false;
let selected = "a";
</script>

<!-- ํ…์ŠคํŠธ -->
<input bind:value={name} />
<p>Hello {name}</p>

<!-- ์ฒดํฌ๋ฐ•์Šค -->
<input type="checkbox" bind:checked />
<p>{checked ? "Yes" : "No"}</p>

<!-- ์…€๋ ‰ํŠธ -->
<select bind:value={selected}>
<option value="a">A</option>
<option value="b">B</option>
</select>
```

## 8. ์กฐ๊ฑด๋ฌธ๊ณผ ๋ฐ˜๋ณต๋ฌธ

```svelte
<script>
let show = true;
let items = ["Apple", "Banana", "Cherry"];
</script>

<!-- ์กฐ๊ฑด๋ฌธ -->
{#if show}
<p>Visible!</p>
{:else}
<p>Hidden</p>
{/if}

<!-- ๋ฐ˜๋ณต๋ฌธ -->
<ul>
{#each items as item, index}
<li>{index + 1}. {item}</li>
{/each}
</ul>

<!-- ํ‚ค ์ง€์ • -->
{#each items as item (item.id)}
<li>{item.name}</li>
{/each}
```

## 9. ์Šคํ† ์–ด (์ „์—ญ ์ƒํƒœ)

```javascript
// stores.js
import { writable, readable, derived } from "svelte/store";

export const count = writable(0);
export const time = readable(new Date(), set => {
const interval = setInterval(() => set(new Date()), 1000);
return () => clearInterval(interval);
});
export const doubled = derived(count, $count => $count * 2);
```

```svelte
<script>
import { count, doubled } from "./stores.js";
</script>

<p>Count: {$count}</p>
<p>Doubled: {$doubled}</p>
<button on:click={() => $count++}>+1</button>
```

## 10. ๋ผ์ดํ”„์‚ฌ์ดํด

```svelte
<script>
import { onMount, onDestroy, beforeUpdate, afterUpdate } from "svelte";

onMount(() => {
console.log("Component mounted");
return () => console.log("Cleanup on unmount");
});

onDestroy(() => {
console.log("Component destroyed");
});
</script>
```

## 11. SvelteKit ๋ผ์šฐํŒ…

```
src/routes/
+page.svelte # /
about/+page.svelte # /about
blog/[slug]/+page.svelte # /blog/:slug
+layout.svelte # ๊ณตํ†ต ๋ ˆ์ด์•„์›ƒ
```

```svelte
<!-- src/routes/blog/[slug]/+page.svelte -->
<script>
export let data;
</script>

<h1>{data.post.title}</h1>
```

```javascript
// src/routes/blog/[slug]/+page.js
export async function load({ params }) {
const post = await fetchPost(params.slug);
return { post };
}
```

## ์ถ”์ฒœ ํ•™์Šต ์ˆœ์„œ
1. ๊ธฐ๋ณธ ๋ฌธ๋ฒ•๊ณผ ๋ฐ˜์‘์„ฑ
2. ์ปดํฌ๋„ŒํŠธ์™€ Props
3. ์ด๋ฒคํŠธ์™€ ๋ฐ”์ธ๋”ฉ
4. ์Šคํ† ์–ด๋กœ ์ƒํƒœ ๊ด€๋ฆฌ
5. SvelteKit์œผ๋กœ ํ’€์Šคํƒ ์•ฑ