본문 바로가기
웹 개발/Front End

스벨트(Svelte)가 미래다?

by L3m0n S0ju 2025. 2. 9.

Svelte란?

 

Svelte는 2016년 출시된 차세대 프론트엔드 프레임워크로, 다른 프레임워크(예: React, Vue)와는 달리 컴파일 단계에서 작업을 수행하여 더 빠르고 효율적인 웹 애플리케이션을 개발할 수 있게 해주는 프론트엔드 프레임워크 입니다.

 

인터넷을 찾아보면

“리액트는 끝났다. 스벨트가 미래다”

라는 말이 있지만

 

현실은.. 결론부터 말하면 아직 갈길이 멀다... 입니다.

 

스벨트를 지원해주는 기업도 없고 사용하는 사례가 거의 없어서 "스벨트가 미래다"라는 말은 아직 현실성이 없는 것 같습니다.

 

어쨌든 왜 스벨트가 리엑트나 Vue에 비해서 차세대 프론트엔드 프레임워크로 불리는지 한번 알아보겠습니다.

 

 

 

 


React/Vue와 Svelte의 핵심 차이

특징 React/Vue Svelte

DOM 업데이트 방식 Virtual DOM 생성 → 비교 → 업데이트 변경된 부분만 직접 DOM에 업데이트
작업 시점 런타임에서 처리 컴파일 타임에 최적화된 코드 생성
성능 추가 작업(비교, 생성)으로 약간 느림 더 빠르고 가벼움
빌드 시 파일크기 상대적으로 큼 더 작음

 

 

 

 


1. 상태변경 시 작동 방식 비교

런타임 코드 생성 (React/Vue)

작동방식: 상태 변경 → Virtual DOM 생성 → Diffing → DOM 업데이트

상태가 변경되면 프레임워크가:

  • 새로운 Virtual DOM을 생성하고,
  • 기존 Virtual DOM과 비교(Diffing)하여,
  • 변경된 부분만 DOM에 업데이트합니다.

이 모든 과정이 런타임에 수행됩니다.

 

결론: Virtual DOM 생성, Diffing, 업데이트 과정에서 추가적인 오버헤드가 발생.

 

 

 

 


컴파일 타임 코드 생성 (Svelte)

작동방식: 컴파일 타임에 DOM 조작 코드 생성 → 상태 변경 시 바로 DOM 업데이트

 

Svelte는 컴파일 시:

  • 상태 변경에 따라 DOM을 어떻게 조작할지 미리 결정하고,
  • 이를 최적화된 JavaScript 코드로 변환합니다.

상태가 변경되면 Virtual DOM이 아닌 직접 DOM을 조작하는 코드가 실행되므로 런타임 오버헤드가 없습니다.

  • 장점:
    • 빠르고 효율적, 불필요한 런타임 작업 제거.
  • 단점:
    • 컴파일 시점에 모든 것을 미리 결정하기 때문에, 동적인 UI 관리에 유연성이 떨어질 수 있음.

 

예시 코드

<script>
  let isVisible = true;
</script>

{#if isVisible}
  <ChildComponent />
{/if}

<button on:click={() => (isVisible = !isVisible)}>Toggle</button>

<!-- ChildComponent.svelte -->
<script>
  let count = 0;
</script>

<p>Count: {count}</p>
<button on:click={() => count++}>Increment</button>

 

 

 

ChildComponent가 숨겨졌다가 다시 나타나면, count 값이 0으로 초기화됩니다. Svelte는 DOM을 완전히 제거했다가 새로 생성하기 때문입니다.

 

 

해결방안 - 상태를 외부에서 관리

<script>
  let isVisible = true;
  let count = 0; // 상태를 외부에서 관리
</script>

{#if isVisible}
  <p>Count: {count}</p>
  <button on:click={() => count++}>Increment</button>
{/if}

<button on:click={() => (isVisible = !isVisible)}>Toggle</button>

 

 

 

 

 


2. React, Vue, Svelte 상태관리

 

React

React는 **상태(state)**를 통해 UI를 관리합니다.

컴포넌트의 상태가 변경되면, 해당 컴포넌트가 전체가 다시 렌더링됩니다.

 

특징

  • 상태 변경은 반드시 useState 또는 useReducer와 같은 훅을 통해 이루어져야 합니다.
  • React는 Virtual DOM을 사용하여 변경된 부분을 찾아서 DOM에 반영합니다.

 

예시 코드

import React, { useState } from 'react';

function Counter() {
  const [count, setCount] = useState(0); // 상태 선언

  return (
    <div>
      <p>Count: {count}</p>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </div>
  );
}

 

 

  • 단점:
    • 상태 변경 시 전체 컴포넌트가 다시 렌더링되므로, 최적화를 위해 React.memo나 useMemo를 사용하는 경우가 많습니다.
    • useState로 개발자가 직접 상태를 관리해야 하므로 상대적으로 복잡할 수 있습니다.

 

 

 


Vue

Vue도 리액트와 마찬가지로 반응형 데이터 객체를 사용합니다.

데이터가 변경되면 Vue가 이를 감지하고 자동으로 UI를 업데이트합니다.

 

특징

  • ref 또는 **reactive**를 사용해 데이터를 반응형으로 만듭니다.
  • 리액트와 다르게 컴포넌트가 부분적으로만 다시 렌더링되므로 효율적입니다.

 

예시 코드

<template>
  <div>
    <p>Count: {{ count }}</p>
    <button @click="increment">Increment</button>
  </div>
</template>

<script>
import { ref } from 'vue';

export default {
  setup() {
    const count = ref(0); // 반응형 데이터
    const increment = () => count.value++;
    return { count, increment };
  },
};
</script>

 

 

  • 장점:
    • 데이터가 변경되면 해당 UI만 업데이트되어 효율적입니다.
  • 단점:
    • ref나 reactive를 사용해야 하므로 개발자가 반응형 데이터를 직접 관리해야합니다.

 

 

 


Svelte

Svelte는 반응성 시스템이 내장되어 있으며, 별도의 API 없이 상태 관리가 가능합니다.

단순히 변수를 선언하고 값을 변경하면 UI가 자동으로 업데이트됩니다.

 

특징

  • Virtual DOM 없이 상태가 변경되면 DOM에 바로 업데이트됩니다.
  • 예시 코드
    1. 스벨트 기본 문법
    <script>
      let count = 0; // 반응형 변수
    </script>
    
    <p>Count: {count}</p>
    <button on:click={() => count++}>Increment</button>
    
  • 장점:
    • 문법이 가장 간결하고 직관적입니다.
    • 별도의 상태 관리 API 없이 자동 반응성 제공.
  • 단점:
    • 스토어 관리의 어려움: 상태가 많아질수록 전역 상태 관리를 체계적으로 설계해야 합니다.
    • 확장성 부족: 대규모 애플리케이션에서 체계적인 상태 관리 도구가 부족합니다.

 

 

 


3. 초기 학습 곡선

  • React:
    • JSX 문법, useState, useEffect와 같은 훅의 개념, 상태 관리 라이브러리(Redux, Zustand 등)를 배우는 데 시간이 필요합니다.
    • 상태 관리와 라이프사이클 관리 방식이 배워야하므로 학습 곡선이 높을 수 있습니다.
  • Vue:
    • SFC(Single File Component) 구조와 ref, reactive와 같은 반응성 API를 배우면 비교적 빠르게 시작할 수 있습니다.
    • 하지만, Vuex 같은 상태 관리 도구나 디렉티브(v-for, v-if) 사용법을 익히는 데 시간이 걸릴 수 있습니다.
  • Svelte:
    • 가장 직관적이며, JavaScript와 HTML에 익숙하면 바로 사용할 수 있습니다.
    • 별도의 훅, 상태 관리 API 없이 변수를 선언하고 사용하는 방식이 간단합니다.

 

 

 


4. 런타임 의존성 및 번들 크기

  • React/Vue:
    • Virtual DOM, 반응성, 상태 관리 등 프레임워크 기능을 제공하기 위해 런타임 라이브러리가 필요.
    • 번들 크기가 상대적으로 큼.
  • Svelte:
    • Svelte는 런타임 종속성이 없습니다.
    • 컴파일 타임에 모든 코드를 JavaScript로 변환하여 가볍고 독립적인 번들을 생성합니다.

Svelte의 장점:

런타임 종속성이 없으므로 번들 크기가 작고, 브라우저 초기 로드 속도가 빠름.

 

 

 

 

 


5. 의존성 관리

  • React:
    • 상태나 UI 변경 시 useEffect와 같은 훅을 사용해 의존성을 관리합니다.
    • useEffect를 사용할 때 ****의존성 배열을 명시적으로 관리해야하므로 의존성 관리가 다소 복잡할 수 있습니다.
  • Vue:
    • 명시적 관리: watch로 특정 변수에 의존하는 동작을 명시적으로 정의 가능.
    • 자동 추적: watchEffect로 참조된 변수를 자동으로 추적하여, 의존성을 명시할 필요가 없습니다.
    • 혼용 가능성: 자동 추적과 명시적 설정(watch)을 혼용하면 코드가 복잡해질 수 있습니다.
  • Svelte:
    • Svelte는 $: 블록을 통해 의존성을 자동으로 관리합니다. $: 블록 내부에서 참조된 변수들은 컴파일 시점에 분석되어, 해당 변수의 변경에 따라 실행됩니다.
    • 의존성 배열을 명시할 필요없이 자동으로 추적해줍니다.
    • React나 Vue에 비해 더 간단하고 직관적입니다.

 

예시 코드

ex) 리액트 의존성 관리

useEffect(() => {
  console.log('API 호출');
  userId++;
  departmentId++;
}, [userId]); // userId가 변경될 때만 실행

 

 

ex) 스벨트 $: 문법

<script>
  let input = 1; // 초기값
  let total = 0; // 초기값

  $: {
    total += input ; // total 업데이트
  }
</script>

<p>{total}</p>

<button on:click={() => input++}>Increase total </button>

 

 

 

 


결론

Svelte는 React와 Vue에 비해:

 

장점

  • 성능이 뛰어나고 가볍다 (Virtual DOM 없이 직접 DOM 조작).
  • 문법이 간결하고 직관적이다 (초보자도 쉽게 배울 수 있음).

단점

  • 영세한 커뮤니티 규모 - 리액트와 다르게 커뮤니티가 작고 기술지원이 부족합니다.
  • 스벨트의 운영주체는 기업이 아니다 - 언제 지원이 종료될 지 예측 불가능
  • 스벨트는 대규모 웹에 적합하지 않다 - 외부의 다양한 유스 케이스를 지원하려면 더 많은 지원과 사례가 필요합니다.

 

따라서 Svelte는 작고 성능이 중요한 프로젝트빠른 프로토타이핑에 특히 강점이 있지만, 대규모 애플리케이션이나 복잡한 생태계가 필요한 프로젝트에서 적합하지 않습니다.

'웹 개발 > Front End' 카테고리의 다른 글

새해 덕담 카드 만들기  (0) 2024.12.01
검색 카테고리 여러 개 동시 선택  (0) 2024.06.15
Vue3 조직도 만들기  (0) 2024.06.06
vue3-excel-editor 사용법  (0) 2024.06.01
Javascript를 이용한 Todo list  (0) 2022.03.16

댓글