로컬 개발
이 가이드는 Elftia 로컬 개발 환경을 빠르게 설정하고 코딩을 시작하는 데 도움을 줍니다.
사전 요구 사항
Node.js
이 프로젝트는 Node.js v24가 필요합니다 (프로젝트 루트의 .nvmrc 참조). 버전 관리에는 nvm 또는 fnm 사용을 권장합니다:
nvm install
nvm use
네이티브 빌드 도구
이 프로젝트는 better-sqlite3와 같은 네이티브 Node.js 모듈에 의존하며, C/C++ 컴파일 환경이 필요합니다:
| 플랫폼 | 필요한 도구 | 설치 방법 |
|---|---|---|
| Windows | Visual Studio Build Tools 2022 | npm install -g windows-build-tools 또는 VS 공식 사이트에서 설치 |
| macOS | Xcode Command Line Tools | xcode-select --install |
| Linux | build-essential, python3 | sudo apt install build-essential python3 (Debian/Ubuntu) |
기타 의존성
- Git >= 2.30
- ripgrep (rg) —
postinstall스크립트에 의해 자동으로 다운로드되거나, 수동으로 설치 가능
프로젝트 초기화
# 1. 저장소 클론
git clone <repo-url> elftia
cd elftia
# 2. 의존성 설치
npm install
npm install이 실행하는 postinstall 스크립트는 자동으로 다음을 수행합니다:
- 현재 Electron 버전에 맞게 네이티브 모듈(
better-sqlite3,node-pty등)을 재컴파일 - 플랫폼별
ripgrep바이너리 다운로드
# 3. 환경 변수 파일 생성
cp .env.example .env
.env를 필요에 따라 편집하여 API 키 및 기타 설정을 입력합니다.
개발 모드 시작
npm run dev
이 명령은 electron-vite dev를 시작하여 세 가지 타겟의 코드 변경을 동시에 감시합니다:
| 타겟 | 디렉토리 | 핫 리로드 |
|---|---|---|
| Main Process | packages/desktop/app/main/ | 메인 프로세스 재시작 |
| Preload Script | packages/desktop/app/preload/ | 메인 프로세스 재시작 |
| Renderer | packages/renderer/src/ | Vite HMR (포트 5375) |
처음 시작 시 네이티브 모듈 오류가 발생하면, npm run rebuild를 실행하여 재컴파일해 보세요.
모든 개발 명령어
| 명령어 | 설명 |
|---|---|
npm run dev | Electron + Vite 개발 모드 시작 (main + preload + renderer) |
npm run dev:web | Renderer만 시작 (웹 모드, Electron 없음) |
npm run dev:server | Fastify 웹 서버 시작 (선택 사항) |
npm run build | 모든 패키지 빌드 (renderer + desktop) |
npm run build:renderer | 프론트엔드만 빌드 (Vite 프로덕션 모드) |
npm run build:desktop | Electron 메인 프로세스만 빌드 (tsup) |
npm run build:official | 공식 릴리스 빌드 (서명 포함) |
npm run build:steam | Steam 버전 빌드 |
npm run lint | ESLint + TypeScript 타입 검사 실행 |
npm run lint:eslint | ESLint만 실행 |
npm run typecheck | TypeScript 컴파일 검사만 실행 |
npm run test | Vitest 테스트 실행 |
npm run format | 전체 코드 Prettier 형식화 |
npm run format:file <path> | 단일 파일 Prettier 형식화 |
npm run verify:build | 빌드 아티팩트 크기 검증 (4개 핵심 지표) |
npm run analyze:build | 번들 구성 분석 (청크 통계) |
디버깅
메인 프로세스 디버깅
방법 1: --inspect 플래그
# package.json의 dev 스크립트에 --inspect 추가
# 또는 직접 실행:
electron --inspect=9229 .
그런 다음 Chrome에서 chrome://inspect를 열고 메인 프로세스에 연결합니다.
방법 2: VS Code
.vscode/launch.json에 다음 설정을 추가합니다:
{
"type": "node",
"request": "attach",
"name": "Attach to Main Process",
"port": 9229,
"skipFiles": ["<node_internals>/**"]
}
렌더러 프로세스 디버깅
Ctrl+Shift+I (Windows/Linux) 또는 Cmd+Option+I (macOS)를 눌러 DevTools를 엽니다.
DevTools 지원 기능:
- React DevTools — 해당 브라우저 확장을 설치하면 자동으로 로드됨
- Network — IPC 호출 모니터링 (
invoke요청으로 표시됨) - Performance — 렌더링 성능 분석
로깅
Elftia는 로그 관리에 Winston을 사용합니다.
| 환경 변수 | 설명 | 기본값 |
|---|---|---|
LOG_LEVEL | 로그 레벨 (debug / info / warn / error) | info |
로그 파일 위치:
| 플랫폼 | 경로 |
|---|---|
| Windows | %APPDATA%/elftia/logs/ |
| macOS | ~/Library/Application Support/elftia/logs/ |
| Linux | ~/.config/elftia/logs/ |
개발 vs 프로덕션 차이
| 항목 | 개발 모드 | 프로덕션 모드 |
|---|---|---|
| 프론트엔드 서비스 | Vite Dev Server (HMR) | 정적 파일 (file://) |
| 소스 맵 | 활성화 | 비활성화 |
| 압축 | 없음 | Terser (console.log 제거) |
| 코드 분할 | 전체 로드 | 라우트별 React.lazy |
| CSP | 완화 | 엄격 |
| DevTools | 자동으로 열림 | 기본적으로 숨김 (개발자 모드에서 활성화 가능) |
| 데이터베이스 | 개발 사용자 데이터 디렉토리 | 프로덕션 사용자 데이터 디렉토리 |
| 로그 레벨 | debug | info |
Worker 스레드
Elftia는 IPC 차단을 방지하기 위해 메인 프로세스에서 여러 Worker 스레드를 생성합니다:
| Worker | 파일 | 역할 |
|---|---|---|
db.worker | workers/db/ | SQLite 읽기/쓰기 작업 |
fileSearch.worker | workers/fileSearch/ | 파일 내용 검색 (ripgrep) |
fileWatcher.worker | workers/fileWatcher/ | 파일 시스템 변경 모니터링 |
mcp.worker | workers/mcp/ | MCP 서버 통신 |
diagnostics.worker | workers/diagnostics/ | 시스템 진단 수집 |
project.worker | workers/project/ | 프로젝트 디렉토리 인덱싱 |
개발 모드에서 Worker는 ts-node를 통해 TypeScript 소스를 직접 실행하고, 프로덕션 모드에서 Worker는 tsup에 의해 독립적인 JS 파일로 컴파일됩니다.
일반적인 문제
네이티브 모듈 컴파일 실패
# 정리 후 재설치
rm -rf node_modules
npm install
# 또는 네이티브 모듈만 재컴파일
npm run rebuild
포트가 이미 사용 중
Vite Dev Server는 기본적으로 포트 5375를 사용합니다. 사용 중인 경우:
# 포트를 사용하는 프로세스 찾기
lsof -i :5375 # macOS/Linux
netstat -ano | findstr :5375 # Windows
데이터베이스 잠금
"database is locked" 오류가 발생하면 두 개 이상의 Elftia 인스턴스가 실행되지 않는지 확인합니다. 개발 중에는 진단 API를 사용하여 데이터베이스 상태를 내보낼 수 있습니다:
window.api.diagnostics.dump()