본문으로 건너뛰기 SolidJS 완벽 가이드 | 고성능 반응형 프레임워크·Signals·JSX·실전 활용

SolidJS 완벽 가이드 | 고성능 반응형 프레임워크·Signals·JSX·실전 활용

SolidJS 완벽 가이드 | 고성능 반응형 프레임워크·Signals·JSX·실전 활용

이 글의 핵심

SolidJS로 초고속 웹 앱을 개발하는 완벽 가이드. Signals, JSX, Stores, SolidStart, TypeScript까지 실전 예제로 정리. SolidJS·Signals·Reactivity 중심으로 설명합니다.

이 글의 핵심

SolidJS로 초고속 웹 앱을 개발하는 완벽 가이드입니다. Signals, JSX, Stores, SolidStart, TypeScript까지 실전 예제로 정리했습니다.

실무 경험 공유: React에서 SolidJS로 전환하면서, 성능이 3배 향상되고 번들 크기가 60% 감소한 경험을 공유합니다.

들어가며: “React가 느려요”

실무에서 마주치는 문제들

불필요한 리렌더링이 많아요

React는 컴포넌트 전체를 리렌더링합니다. SolidJS는 변경된 부분만 업데이트합니다. 성능 최적화가 어려워요

useMemo, useCallback이 복잡합니다. SolidJS는 자동으로 최적화됩니다. 번들 크기가 커요

React는 40KB입니다. SolidJS는 7KB입니다.

1. SolidJS란?

핵심 특징

SolidJS는 고성능 반응형 JavaScript 프레임워크입니다. 주요 장점

  • 초고속: Virtual DOM 없음
  • 작은 번들: 7KB
  • Signals: 세밀한 반응형
  • JSX: React와 유사
  • No Re-renders: 컴포넌트는 한 번만 실행

2. 설치 및 프로젝트 생성

Vite

npm create vite@latest my-app -- --template solid-ts
cd my-app
npm install
npm run dev

SolidStart

npm create solid@latest my-app

3. Signals

createSignal

import { createSignal } from 'solid-js';
function Counter() {
  const [count, setCount] = createSignal(0);
  return (
    <div>
      <p>Count: {count()}</p>
      <button onClick={() => setCount(count() + 1)}>Increment</button>
    </div>
  );
}

createEffect

import { createSignal, createEffect } from 'solid-js';
function App() {
  const [count, setCount] = createSignal(0);
  createEffect(() => {
    console.log('Count changed:', count());
  });
  return <button onClick={() => setCount(count() + 1)}>Increment</button>;
}

4. Derived Signals

import { createSignal, createMemo } from 'solid-js';
function App() {
  const [count, setCount] = createSignal(0);
  const doubled = createMemo(() => count() * 2);
  return (
    <div>
      <p>Count: {count()}</p>
      <p>Doubled: {doubled()}</p>
      <button onClick={() => setCount(count() + 1)}>Increment</button>
    </div>
  );
}

5. Control Flow

Show

import { createSignal, Show } from 'solid-js';
function App() {
  const [loggedIn, setLoggedIn] = createSignal(false);
  return (
    <div>
      <Show when={loggedIn()} fallback={<p>Please log in</p>}>
        <p>Welcome!</p>
      </Show>
      <button onClick={() => setLoggedIn(!loggedIn())}>Toggle</button>
    </div>
  );
}

For

import { For } from 'solid-js';
function TodoList() {
  const [todos] = createSignal([
    { id: 1, text: 'Learn SolidJS' },
    { id: 2, text: 'Build an app' },
  ]);
  return (
    <ul>
      <For each={todos()}>
        {(todo) => <li>{todo.text}</li>}
      </For>
    </ul>
  );
}

6. Stores

import { createStore } from 'solid-js/store';
function App() {
  const [state, setState] = createStore({
    user: { name: 'John', age: 30 },
    todos: [{ id: 1, text: 'Learn SolidJS', done: false }],
  });
  const addTodo = (text: string) => {
    setState('todos', (todos) => [...todos, { id: Date.now(), text, done: false }]);
  };
  const toggleTodo = (id: number) => {
    setState('todos', (todo) => todo.id === id, 'done', (done) => !done);
  };
  return (
    <div>
      <p>{state.user.name}</p>
      <ul>
        <For each={state.todos}>
          {(todo) => (
            <li onClick={() => toggleTodo(todo.id)}>
              {todo.text} {todo.done ? '✓' : '}
            </li>
          )}
        </For>
      </ul>
    </div>
  );
}

7. Context

import { createContext, useContext } from 'solid-js';
const CounterContext = createContext<[() => number, (v: number) => void]>();
function CounterProvider(props) {
  const [count, setCount] = createSignal(0);
  return (
    <CounterContext.Provider value={[count, setCount]}>
      {props.children}
    </CounterContext.Provider>
  );
}
function useCounter() {
  return useContext(CounterContext);
}
// 사용
function Counter() {
  const [count, setCount] = useCounter();
  return <button onClick={() => setCount(count() + 1)}>Count: {count()}</button>;
}

8. 실전 예제: 사용자 목록

import { createSignal, createResource, For, Show } from 'solid-js';
interface User {
  id: number;
  name: string;
  email: string;
}
async function fetchUsers(): Promise<User[]> {
  const response = await fetch('https://api.example.com/users');
  return response.json();
}
function UserList() {
  const [users] = createResource(fetchUsers);
  return (
    <div>
      <Show when={!users.loading} fallback={<p>Loading...</p>}>
        <Show when={!users.error} fallback={<p>Error: {users.error}</p>}>
          <ul>
            <For each={users()}>
              {(user) => (
                <li>
                  {user.name} - {user.email}
                </li>
              )}
            </For>
          </ul>
        </Show>
      </Show>
    </div>
  );
}

정리 및 체크리스트

핵심 요약

  • SolidJS: 고성능 반응형 프레임워크
  • Signals: 세밀한 반응형
  • 초고속: Virtual DOM 없음
  • 작은 번들: 7KB
  • JSX: React와 유사
  • No Re-renders: 한 번만 실행

구현 체크리스트

  • SolidJS 설치
  • Signals 사용
  • createEffect 활용
  • createMemo 사용
  • Control Flow
  • Stores 활용
  • Context 구현
  • SolidStart 사용

같이 보면 좋은 글


이 글에서 다루는 키워드

SolidJS, Signals, Reactivity, Performance, JSX, TypeScript, Frontend

자주 묻는 질문 (FAQ)

Q. React와 비교하면 어떤가요?

A. SolidJS가 훨씬 빠릅니다. React는 생태계가 더 큽니다.

Q. 학습 곡선은 어떤가요?

A. React 경험이 있으면 쉽습니다. JSX가 비슷합니다.

Q. Hooks를 사용하나요?

A. 아니요, Signals를 사용합니다. 더 간단하고 빠릅니다.

Q. 프로덕션에서 사용해도 되나요?

A. 네, 점점 더 많은 프로젝트에서 사용하고 있습니다.