SolidJS 완벽 가이드 | 고성능 반응형 프레임워크·Signals·JSX·실전 활용
이 글의 핵심
SolidJS로 초고속 웹 앱을 개발하는 완벽 가이드입니다. Signals, JSX, Stores, SolidStart, TypeScript까지 실전 예제로 정리했습니다.
실무 경험 공유: React에서 SolidJS로 전환하면서, 성능이 3배 향상되고 번들 크기가 60% 감소한 경험을 공유합니다.
들어가며: “React가 느려요”
실무 문제 시나리오
시나리오 1: 불필요한 리렌더링이 많아요
React는 컴포넌트 전체를 리렌더링합니다. SolidJS는 변경된 부분만 업데이트합니다.
시나리오 2: 성능 최적화가 어려워요
useMemo, useCallback이 복잡합니다. SolidJS는 자동으로 최적화됩니다.
시나리오 3: 번들 크기가 커요
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 사용
같이 보면 좋은 글
- React 완벽 가이드
- Svelte 완벽 가이드
- 성능 최적화 가이드
이 글에서 다루는 키워드
SolidJS, Signals, Reactivity, Performance, JSX, TypeScript, Frontend
자주 묻는 질문 (FAQ)
Q. React와 비교하면 어떤가요?
A. SolidJS가 훨씬 빠릅니다. React는 생태계가 더 큽니다.
Q. 학습 곡선은 어떤가요?
A. React 경험이 있으면 쉽습니다. JSX가 비슷합니다.
Q. Hooks를 사용하나요?
A. 아니요, Signals를 사용합니다. 더 간단하고 빠릅니다.
Q. 프로덕션에서 사용해도 되나요?
A. 네, 점점 더 많은 프로젝트에서 사용하고 있습니다.