Skip to content

feat(electron): Nextron + SQLite 아키텍처로 전환#113

Open
rookedsysc wants to merge 7 commits intomainfrom
feat/nextron-sql-lite
Open

feat(electron): Nextron + SQLite 아키텍처로 전환#113
rookedsysc wants to merge 7 commits intomainfrom
feat/nextron-sql-lite

Conversation

@rookedsysc
Copy link
Owner

관련 자료

어떤 작업인가요?

  • Next.js + PostgreSQL 기반 웹앱을 Nextron(Electron + Next.js) + SQLite 아키텍처로 전환하는 마이그레이션

어떻게 해결했나요?

Electron Main Process 구축

  • main/ 디렉토리에 Electron main process 코드 구성 (background, preload, IPC 핸들러)
  • esbuild 기반 빌드 스크립트로 main process 번들링

SQLite 전환

  • TypeORM + PostgreSQL에서 better-sqlite3 기반 SQLite로 DB 전환
  • 단일 마이그레이션 파일로 스키마 재구성

IPC 통신 레이어 구축

  • Server Action을 IPC 핸들러로 전환 (kanban, project, diff, settings, paneLayout)
  • src/lib/ipc.ts에 타입 안전한 IPC 클라이언트 래퍼 제공
  • contextBridge를 통한 안전한 main-renderer IPC 브릿지

기존 서버 코드 제거

  • server.ts, boot.js, docker-compose.yml 등 서버 관련 코드 삭제
  • API 라우트, Server Action, 인증 관련 코드 삭제
  • PostgreSQL 마이그레이션 파일 전체 삭제

중요한 변경 사항은 무엇인가요?

Electron Main Process

IPC 핸들러 체계

  • 변경 이유: Server Action → Electron IPC로 통신 방식 전환
  • 수정 파일: main/ipc/kanban.ts, main/ipc/project.ts, main/ipc/diff.ts, main/ipc/appSettings.ts, main/ipc/paneLayout.ts, main/ipc/hooks.ts, main/ipc/terminal.ts

프로덕션 감지 방식

  • 변경 이유: esbuild define이 NODE_ENV를 하드코딩하여 dev 모드에서도 production 경로를 타는 문제 수정
  • 수정 파일: main/background.ts (app.isPackaged 사용), scripts/build-main.mjs (define 제거)

렌더러 IPC 클라이언트

IPC 래퍼 및 타이밍 방어

  • 변경 이유: 모든 Server Action 호출을 IPC invoke로 전환하고, preload 로드 타이밍 이슈 방어
  • 수정 파일: src/lib/ipc.ts, src/components/FolderSearchInput.tsx

DB 전환

SQLite 마이그레이션

  • 변경 이유: PostgreSQL 의존성 제거, 로컬 데스크톱 앱에 적합한 SQLite 채택
  • 수정 파일: main/database.ts, src/migrations/0001-InitialSqliteSchema.ts

라우트 구조 변경

동적 라우트 제거

  • 변경 이유: Next.js static export(output: "export")와 호환되도록 [id] 동적 세그먼트 제거
  • 수정 파일: src/app/[locale]/task/page.tsx, src/app/[locale]/task/diff/page.tsx (쿼리 파라미터 기반으로 전환)

fetch('/api/directories')를 ipcProject.listSubdirectories()로 교체
esbuild define이 process.env.NODE_ENV를 "production"으로 하드코딩하여
dev 모드에서도 isProd=true가 되어 app://./home 프로토콜로 로드하는 문제를 수정한다.
app.isPackaged를 사용하여 패키징 여부로 정확히 감지한다.
window.ipc가 준비되기 전에 invoke 호출이 발생할 수 있는 타이밍 이슈를 방어한다.
최대 3초간 폴링으로 대기하며, SSR 환경에서는 즉시 reject한다.
preload 실행 확인 로그와 IPC 에러 로깅도 함께 추가한다.
동적 라우트 [id] 제거 후 쿼리 파라미터 기반(?id=)으로 전환했으나
5곳의 네비게이션 링크가 이전 /task/${id} 패턴을 사용하여 404 발생
@rookedsysc rookedsysc self-assigned this Mar 2, 2026
hiddenInset/titleBarOverlay 방식 대신 nativeTheme.themeSource를
light로 설정하여 시스템 다크 모드에서도 네이티브 타이틀 바가
앱 테마와 일치하도록 변경
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant