๐Ÿงญ SvelteKit ์™„์ „ ์ดˆ๋ณด์ž ๊ฐ€์ด๋“œ (2025 ๋ฒ„์ „)

1๏ธโƒฃ SvelteKit์ด๋ž€?

SvelteKit์€ Svelte๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ์ฐจ์„ธ๋Œ€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋ ˆ์ž„์›Œํฌ์ž…๋‹ˆ๋‹ค.
React์˜ Next.js, Vue์˜ Nuxt.js์ฒ˜๋Ÿผ SSR(์„œ๋ฒ„์‚ฌ์ด๋“œ ๋ Œ๋”๋ง), SSG(์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ), SPA(Single Page App), API ๋ผ์šฐํŒ…, ๋™์  ํŽ˜์ด์ง€๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงƒ ํŠน์ง• ์š”์•ฝ

๊ธฐ๋Šฅ์„ค๋ช…
โœ… ์„œ๋ฒ„ ์‚ฌ์ด๋“œ ๋ Œ๋”๋ง(SSR)๊ฒ€์ƒ‰ ์—”์ง„ ์นœํ™”์ ์ธ ์•ฑ ์ œ์ž‘ ๊ฐ€๋Šฅ
โœ… ์ •์  ์‚ฌ์ดํŠธ ์ƒ์„ฑ(SSG)๋น ๋ฅด๊ณ  ์•ˆ์ „ํ•œ ์ •์  ๋ฐฐํฌ ์ง€์›
โœ… ํŒŒ์ผ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ๋กœ URL ์ž๋™ ์ƒ์„ฑ
โœ… API ๋ผ์šฐํŠธ ๋‚ด์žฅ๋ฐฑ์—”๋“œ ์—†์ด๋„ ์„œ๋ฒ„ ํ•จ์ˆ˜ ๊ตฌํ˜„ ๊ฐ€๋Šฅ
โœ… ๋น ๋ฅธ ๋ฒˆ๋“ค๋งVite ๊ธฐ๋ฐ˜ ์ดˆ๊ณ ์† ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‚ฌ์šฉ

2๏ธโƒฃ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ์„ธํŒ…

๐Ÿ“Œ Node.js ์„ค์น˜

๐Ÿ“ฆ SvelteKit ํ”„๋กœ์ ํŠธ ์ƒ์„ฑ

npx sv create my-app
cd my-app
npm install
npm run dev
  • npm run dev ๋ช…๋ น์œผ๋กœ ๊ฐœ๋ฐœ ์„œ๋ฒ„ ์‹คํ–‰
  • http://localhost:5173์—์„œ ์•ฑ ํ™•์ธ

ํ”„๋กœ์ ํŠธ ํ…œํ”Œ๋ฆฟ ์„ ํƒ ์‹œ

  • Skeleton Project (๊ธฐ๋ณธ ํ…œํ”Œ๋ฆฟ)
  • Demo App (์˜ˆ์ œ ํฌํ•จ, ๊ตฌ์กฐ ํŒŒ์•…์— ๋„์›€ ๋จ)

3๏ธโƒฃ ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ ์ดํ•ด

my-app/
โ”œโ”€โ”€ src/
โ”‚   โ”œโ”€โ”€ routes/           # ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…
โ”‚   โ”‚   โ””โ”€โ”€ +page.svelte  # "/" ๋ฉ”์ธ ํŽ˜์ด์ง€
โ”‚   โ”‚   โ””โ”€โ”€ about/+page.svelte
โ”‚   โ”œโ”€โ”€ lib/              # ๊ณตํ†ต ์ปดํฌ๋„ŒํŠธ ๋ฐ ์œ ํ‹ธ
โ”‚   โ”œโ”€โ”€ app.html          # HTML ํ…œํ”Œ๋ฆฟ
โ”œโ”€โ”€ static/               # ์ •์  ํŒŒ์ผ (favicon, ์ด๋ฏธ์ง€ ๋“ฑ)
โ”œโ”€โ”€ svelte.config.js      # ์„ค์ • ํŒŒ์ผ

๐Ÿ”ธ routes/ ํด๋”๊ฐ€ ๋ผ์šฐํŒ…์˜ ์ค‘์‹ฌ์ž…๋‹ˆ๋‹ค.
๐Ÿ”ธ +page.svelte, +page.ts, +server.ts, +layout.svelte ๋“ฑ์œผ๋กœ ๊ตฌ์„ฑ๋ฉ๋‹ˆ๋‹ค.


4๏ธโƒฃ ํŽ˜์ด์ง€ ๋ผ์šฐํŒ…

SvelteKit์€ ํŒŒ์ผ๊ณผ ํด๋” ์ด๋ฆ„๋งŒ์œผ๋กœ URL ๊ฒฝ๋กœ๋ฅผ ์ž๋™์œผ๋กœ ๋งคํ•‘ํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ผ ๊ตฌ์กฐ๋ธŒ๋ผ์šฐ์ € ๊ฒฝ๋กœ
/routes/+page.svelte/
/routes/about/+page.svelte/about
/routes/blog/[slug]/+page.svelte/blog/hello-world

๐Ÿงช ์˜ˆ์ œ

src/routes/about/+page.svelte

<script>
  let name = 'SvelteKit';
</script>

<h1>About {name}</h1>

5๏ธโƒฃ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ

SvelteKit์€ ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๋จผ์ € ๋ถˆ๋Ÿฌ์™€ ํŽ˜์ด์ง€์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿงพ ์˜ˆ์ œ: load ํ•จ์ˆ˜ ์‚ฌ์šฉ

// src/routes/+page.ts
export function load() {
  return {
    name: 'Yeongjin',
    age: 30
  };
}
<script>
  export let data;
</script>

<h1>{data.name} ๋‹˜์˜ ๋‚˜์ด๋Š” {data.age}์„ธ์ž…๋‹ˆ๋‹ค</h1>

load() ํ•จ์ˆ˜๋Š” SSR, CSR ํ™˜๊ฒฝ ๋ชจ๋‘์—์„œ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.


6๏ธโƒฃ API ๋ผ์šฐํŠธ ๋งŒ๋“ค๊ธฐ

๋ฐฑ์—”๋“œ ์—†์ด๋„ REST API๋ฅผ SvelteKit์œผ๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์–ด์š”.

// src/routes/api/hello/+server.ts
export function GET() {
  return new Response('์•ˆ๋…•ํ•˜์„ธ์š”, ์ง„์ด์ž…๋‹ˆ๋‹ค!');
}
  • /api/hello ๊ฒฝ๋กœ๋กœ GET ์š”์ฒญ โ†’ ์œ„ ์‘๋‹ต์„ ๋ฐ˜ํ™˜
  • JSON ์‘๋‹ต๋„ ๊ฐ€๋Šฅ: return json({ message: "Hi" })

7๏ธโƒฃ ํผ ์ฒ˜๋ฆฌ: Actions

์„œ๋ฒ„์—์„œ ํผ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ธฐ๋Šฅ๋„ ๋งค์šฐ ๊ฐ„ํŽธํ•ฉ๋‹ˆ๋‹ค.

<!-- src/routes/contact/+page.svelte -->
<form method="POST">
  <input name="message" />
  <button type="submit">๋ณด๋‚ด๊ธฐ</button>
</form>
// src/routes/contact/+page.server.ts
export const actions = {
  default: async ({ request }) => {
    const formData = await request.formData();
    const message = formData.get('message');
    console.log('์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€:', message);
    return { success: true };
  }
};

8๏ธโƒฃ ์Šคํƒ€์ผ๋ง

๊ธฐ๋ณธ CSS ๊ฐ€๋Šฅ

<style>
  h1 {
    color: red;
  }
</style>

Tailwind CSS ์—ฐ๋™ (๋งŽ์ด ์”€)

npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init tailwind.config.cjs -p

tailwind.config.cjs:

content: ["./src/**/*.{html,js,svelte,ts}"],

src/app.css:

@tailwind base;
@tailwind components;
@tailwind utilities;

svelte.config.js์— ์ถ”๊ฐ€:

preprocess: [
  import('svelte-preprocess')({ postcss: true })
],

9๏ธโƒฃ ๋นŒ๋“œ์™€ ๋ฐฐํฌ

์ •์  ์‚ฌ์ดํŠธ๋กœ ๋นŒ๋“œ

npm run build
npm run preview

Node ์„œ๋ฒ„๋กœ ์‹คํ–‰

npm run build
node build

Vercel์— ๋ฐฐํฌ

npm i -g vercel
vercel

๐Ÿ”Ÿ ์ถ”์ฒœ ํ•™์Šต ์ž๋ฃŒ

  • ๐Ÿ“˜ ๊ณต์‹ ํŠœํ† ๋ฆฌ์–ผ: https://learn.svelte.dev
  • ๐Ÿ“˜ SvelteKit ๋ฌธ์„œ: https://kit.svelte.dev/docs
  • ๐Ÿ“บ ์œ ํŠœ๋ธŒ: The Net Ninja์˜ SvelteKit ๊ฐ•์ขŒ
  • ๐Ÿงช ์‹ค์Šต ์˜ˆ์ œ: Todo ์•ฑ, ๋ธ”๋กœ๊ทธ, ํฌํŠธํด๋ฆฌ์˜ค ๋“ฑ

๐ŸŽ ์ถ”๊ฐ€ ํŒ

ํŒ์„ค๋ช…
๐Ÿ”„ hot reload๊ฐœ๋ฐœ ์ค‘ ์ž๋™ ๋ฐ˜์˜
๐Ÿ” DevToolsSvelte for Chrome ์„ค์น˜ ์ถ”์ฒœ
๐Ÿ“ ๊ตฌ์กฐํ™”/lib/components, /lib/stores ๋“ฑ ํด๋”๋กœ ์ปดํฌ๋„ŒํŠธ ๊ด€๋ฆฌ

โœ… ๋งˆ๋ฌด๋ฆฌ: ์–ด๋–ค ์•ฑ ๋งŒ๋“ค๊ณ  ์‹ถ์œผ์‹ ๊ฐ€์š”?

SvelteKit์€ ์ •๋ง ์ง๊ด€์ ์ด๊ณ  ๋น ๋ฆ…๋‹ˆ๋‹ค.
๊ฐ„๋‹จํ•œ ํฌํŠธํด๋ฆฌ์˜ค ์‚ฌ์ดํŠธ๋ถ€ํ„ฐ ๋ธ”๋กœ๊ทธ, ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€, ์ฑ—๋ด‡ ์ธํ„ฐํŽ˜์ด์Šค, AI ๊ธฐ๋ฐ˜ ํ”„๋ก ํŠธ์—”๋“œ๊นŒ์ง€ ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”.


๋‹ต๊ธ€ ๋‚จ๊ธฐ๊ธฐ

์ด๋ฉ”์ผ ์ฃผ์†Œ๋Š” ๊ณต๊ฐœ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•„์ˆ˜ ํ•„๋“œ๋Š” *๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค