|
| 1 | +--- |
| 2 | +layout: post |
| 3 | +title: Svelte biginner manual |
| 4 | +tags: [front-end,svelte,js,ts,vite] |
| 5 | +--- |
| 6 | + |
| 7 | +## 📘 Svelte 초보자 학습 매뉴얼 |
| 8 | + |
| 9 | +### 1.1 SvelteKit 설치 |
| 10 | + |
| 11 | +``` bash |
| 12 | +# 최신 SvelteKit 프로젝트 생성 |
| 13 | +npm create svelte@latest my-app |
| 14 | +cd my-app |
| 15 | +npm install |
| 16 | +npm run dev |
| 17 | +``` |
| 18 | + |
| 19 | +👉 **SvelteKit**은 Svelte 단독보다 권장.\ |
| 20 | +라우팅, SSR, API 핸들링까지 지원해서 초보자도 바로 실무 감각을 익힐 수 |
| 21 | +있음. |
| 22 | + |
| 23 | +------------------------------------------------------------------------ |
| 24 | + |
| 25 | +## 2. 기본 문법 |
| 26 | + |
| 27 | +### 2.1 데이터 바인딩 |
| 28 | + |
| 29 | +``` svelte |
| 30 | +<script> |
| 31 | + let name = "흙먹는거아"; |
| 32 | +</script> |
| 33 | +
|
| 34 | +<input bind:value={name} /> |
| 35 | +<p>안녕하세요, {name}님!</p> |
| 36 | +``` |
| 37 | + |
| 38 | +### 2.2 조건부 렌더링 |
| 39 | + |
| 40 | +``` svelte |
| 41 | +<script> |
| 42 | + let loggedIn = true; |
| 43 | +</script> |
| 44 | +
|
| 45 | +{#if loggedIn} |
| 46 | + <p>로그인 성공!</p> |
| 47 | +{:else} |
| 48 | + <p>로그인 필요</p> |
| 49 | +{/if} |
| 50 | +``` |
| 51 | + |
| 52 | +### 2.3 반복 렌더링 |
| 53 | + |
| 54 | +``` svelte |
| 55 | +<script> |
| 56 | + let items = ["사과", "바나나", "체리"]; |
| 57 | +</script> |
| 58 | +
|
| 59 | +<ul> |
| 60 | + {#each items as item} |
| 61 | + <li>{item}</li> |
| 62 | + {/each} |
| 63 | +</ul> |
| 64 | +``` |
| 65 | + |
| 66 | +------------------------------------------------------------------------ |
| 67 | + |
| 68 | +## 3. 상태 관리 (Svelte Store) |
| 69 | + |
| 70 | +### 3.1 Writable Store |
| 71 | + |
| 72 | +``` js |
| 73 | +// src/lib/stores/user.js |
| 74 | +import { writable } from "svelte/store"; |
| 75 | + |
| 76 | +export const user = writable({ name: "Guest", level: 0 }); |
| 77 | +``` |
| 78 | + |
| 79 | +### 3.2 사용하기 |
| 80 | + |
| 81 | +``` svelte |
| 82 | +<script> |
| 83 | + import { user } from "$lib/stores/user"; |
| 84 | +</script> |
| 85 | +
|
| 86 | +<h1>{$user.name}님 환영합니다</h1> |
| 87 | +{#if $user.level >= 2} |
| 88 | + <button>관리자 메뉴</button> |
| 89 | +{/if} |
| 90 | +``` |
| 91 | + |
| 92 | +------------------------------------------------------------------------ |
| 93 | + |
| 94 | +## 4. 라우팅 (SvelteKit) |
| 95 | + |
| 96 | +### 4.1 기본 구조 |
| 97 | + |
| 98 | + src/routes/ |
| 99 | + ├── +page.svelte // 메인 페이지 |
| 100 | + ├── about/+page.svelte // /about 페이지 |
| 101 | + └── dashboard/+page.svelte |
| 102 | + |
| 103 | +### 4.2 Layout 활용 |
| 104 | + |
| 105 | +- `src/routes/+layout.svelte` → 모든 페이지 공통 UI (예: 헤더/푸터)\ |
| 106 | +- `src/routes/dashboard/+layout.svelte` → 특정 하위 라우트 전용 레이아웃 |
| 107 | + |
| 108 | +------------------------------------------------------------------------ |
| 109 | + |
| 110 | +## 5. API 연동 |
| 111 | + |
| 112 | +### 5.1 클라이언트에서 호출 |
| 113 | + |
| 114 | +``` svelte |
| 115 | +<script> |
| 116 | + let posts = []; |
| 117 | +
|
| 118 | + onMount(async () => { |
| 119 | + const res = await fetch("/api/posts"); |
| 120 | + posts = await res.json(); |
| 121 | + }); |
| 122 | +</script> |
| 123 | +``` |
| 124 | + |
| 125 | +### 5.2 서버 엔드포인트 |
| 126 | + |
| 127 | +``` ts |
| 128 | +// src/routes/api/posts/+server.ts |
| 129 | +import type { RequestHandler } from '@sveltejs/kit'; |
| 130 | + |
| 131 | +export const GET: RequestHandler = async () => { |
| 132 | + return new Response(JSON.stringify([{ id: 1, title: "Hello" }])); |
| 133 | +}; |
| 134 | +``` |
| 135 | + |
| 136 | +------------------------------------------------------------------------ |
| 137 | + |
| 138 | +## 6. 세션 & 인증 |
| 139 | + |
| 140 | +- `hooks.server.ts`를 이용해 요청 시 쿠키/세션 검사 가능\ |
| 141 | +- 로그인된 사용자 정보를 `event.locals`에 저장\ |
| 142 | +- UI에서는 `store`와 연동해 권한 기반 조건부 렌더링 |
| 143 | + |
| 144 | +예: |
| 145 | + |
| 146 | +``` ts |
| 147 | +// src/hooks.server.ts |
| 148 | +export async function handle({ event, resolve }) { |
| 149 | + const token = event.cookies.get("auth"); |
| 150 | + event.locals.user = token ? { name: "흙먹는거아", level: 2 } : null; |
| 151 | + return resolve(event); |
| 152 | +} |
| 153 | +``` |
| 154 | + |
| 155 | +------------------------------------------------------------------------ |
| 156 | + |
| 157 | +## 7. 배포 전략 |
| 158 | + |
| 159 | +### 7.1 정적 사이트 |
| 160 | + |
| 161 | +``` bash |
| 162 | +npm install -D @sveltejs/adapter-static |
| 163 | +``` |
| 164 | + |
| 165 | +- `svelte.config.js`에서 adapter-static 적용\ |
| 166 | +- GitHub Pages, Netlify 등에 배포 |
| 167 | + |
| 168 | +### 7.2 Node.js 서버 |
| 169 | + |
| 170 | +``` bash |
| 171 | +npm install -D @sveltejs/adapter-node |
| 172 | +``` |
| 173 | + |
| 174 | +- PM2로 프로세스 관리 |
| 175 | + |
| 176 | +``` bash |
| 177 | +pm2 start build/index.js --name my-svelte-app |
| 178 | +``` |
| 179 | + |
| 180 | +------------------------------------------------------------------------ |
| 181 | + |
| 182 | +## 8. 자주 겪는 이슈 & 해결법 |
| 183 | + |
| 184 | +- **메인 화면이 안 뜸** → `vite.config.ts` 플러그인 충돌 → 최소화 후 |
| 185 | + 실행\ |
| 186 | +- **배포 시 adapter-auto 문제** → 반드시 `adapter-static` 또는 |
| 187 | + `adapter-node`로 변경\ |
| 188 | +- **UI 컴포넌트 부족** → `shadcn-svelte` 같은 검증된 UI Kit 활용 |
| 189 | + |
| 190 | +------------------------------------------------------------------------ |
| 191 | + |
| 192 | +## 9. 학습 로드맵 |
| 193 | + |
| 194 | +1. SvelteKit 프로젝트 생성 |
| 195 | +1. 기본 문법 (if/each/bind) |
| 196 | +1. Store 활용해 전역 상태 관리 |
| 197 | +1. 라우팅 & Layout 구조 이해 |
| 198 | +1. API 연동 (서버/클라이언트) |
| 199 | +1. 세션/권한 처리 |
| 200 | +1. 빌드 & 배포 |
0 commit comments