문서로 돌아가기
아키텍처

기술적 결정과 트레이드오프

Tauri, SQLite, 전용 LLM 프록시를 선택한 이유와 그 비용.

10분 읽기

모든 아키텍처는 트레이드오프를 수반합니다. 이 문서는 PlanToCode의 주요 기술 선택, 그것이 제공하는 이점, 그리고 도입하는 비용이나 제한을 설명합니다.

트레이드오프 매트릭스

기술 선택과 그 이점 및 비용의 시각적 비교.

기술 트레이드오프 매트릭스
Click to expand
기술 스택 결정을 보여주는 시스템 아키텍처 개요.

데스크톱을 위한 Tauri v2

Tauri는 웹 기반 프론트엔드와 함께 Rust 백엔드를 제공하여, 네이티브 성능과 작은 바이너리 크기로 크로스 플랫폼 데스크톱 앱을 가능하게 합니다.

Benefits

  • 작은 바이너리 크기 (~15MB vs Electron의 200MB+)
  • 파일 작업과 작업 처리를 위한 네이티브 Rust 성능
  • 세분화된 권한이 있는 기능 기반 보안 모델
  • macOS, Windows, Linux를 위한 단일 코드베이스
  • 시스템 API 액세스 (PTY, 키체인, 알림)

Tradeoffs

  • Electron보다 작은 생태계
  • 백엔드 개발을 위한 Rust 학습 곡선
  • 플랫폼 간 WebView 렌더링 차이
  • IPC 이슈 디버깅을 위한 덜 성숙한 도구

로컬 영속을 위한 SQLite

SQLite는 세션, 작업, 터미널 출력, 설정을 포함한 모든 로컬 상태를 저장합니다. 이것은 오프라인 작업과 빠른 쿼리를 가능하게 합니다.

Benefits

  • 구성이 필요 없는 임베디드 데이터베이스
  • 로컬 데이터에 대한 빠른 쿼리
  • 오프라인 작업 가능
  • 단일 파일 백업 및 복원
  • 동시 액세스를 위한 WAL 모드

Tradeoffs

  • 내장된 복제 또는 동기화 없음
  • 큰 터미널 로그가 데이터베이스를 증가시킬 수 있음
  • 수동 스키마 마이그레이션 필요
  • 단일 라이터 제한 (WAL로 완화)

Implementation: ~10개 테이블이 있는 consolidated_schema.sql의 스키마. 리포지토리가 rusqlite로 타입화된 액세스를 제공합니다.

전용 LLM 프록시 서버

모든 LLM 요청은 API 키를 관리하고, 요청을 정규화하고, 사용량을 추적하고, 청구를 처리하는 서버 프록시를 통해 라우팅됩니다.

Benefits

  • API 키가 서버를 떠나지 않음
  • 모든 프로바이더에 대한 단일 요청 형식
  • 중앙화된 사용량 추적과 청구
  • 클라이언트 업데이트 없이 프로바이더 페일오버
  • 콘텐츠 필터링과 속도 제한

Tradeoffs

  • 서버 인프라 필요
  • 요청에 네트워크 지연 추가
  • 서버가 단일 실패 지점이 됨
  • 프로바이더 통합 유지 필요

Implementation: server/src/handlers/proxy/의 핸들러가 있는 Actix-Web 서버. provider_transformers/의 변환기가 요청을 정규화합니다.

모바일을 위한 WebSocket 릴레이

데스크톱과 모바일 클라이언트는 디바이스 연결, 터미널 스트리밍, 작업 동기화를 위해 WebSocket 릴레이를 통해 연결합니다.

Benefits

  • 실시간 양방향 통신
  • 직접적인 P2P 네트워킹 필요 없음
  • NAT와 방화벽을 통해 작동
  • 여러 연결된 디바이스 지원

Tradeoffs

  • 지속적인 서버 연결 필요
  • 대규모 페이로드에 대한 릴레이 지연 추가
  • 연결 관리 복잡성
  • 재연결 및 하트비트 로직 필요

Implementation: device_link_ws.rs가 세션 추적, 하트비트, 터미널 출력을 위한 PTC1 바이너리 프레이밍으로 릴레이를 구현합니다.

운영상의 결과

  • Tauri: 각 플랫폼에 대한 별도 빌드 필요. CI/CD가 크로스 컴파일하거나 플랫폼 특화 러너를 사용해야 함.
  • SQLite: 데이터베이스 파일이 터미널 출력과 함께 증가. 장기 실행 인스턴스에 대한 주기적 정리 필요 가능.
  • LLM 프록시: 서버 다운타임이 모든 LLM 작업을 차단. 프로덕션을 위한 모니터링과 중복성 필요.
  • WebSocket: 재연결 로직이 복잡성 추가. 클라이언트가 연결 끊김을 우아하게 처리해야 함.

보안 경계

아키텍처는 노출을 제한하는 명확한 보안 경계를 만듭니다:

  • API 키는 서버 볼트에 저장, 클라이언트에 전송되지 않음
  • JWT 토큰은 JWKS 순환과 함께 모든 요청에서 검증
  • 기능 기반 권한이 파일 시스템 액세스 제한
  • LLM에 전송되는 콘텐츠는 명시적 사용자 승인 필요
  • 감사 로그가 사용자 컨텍스트와 함께 모든 LLM 요청 추적

재고할 때

요구사항이 크게 변경되면 이러한 결정을 다시 검토해야 할 수 있습니다:

  • 브라우저 전용 액세스가 필요한 경우, Tauri 대신 웹 기반 대안 고려
  • 멀티 디바이스 동기화가 중요한 경우, 서버 측 작업 저장 고려
  • 프로바이더 락인이 허용되는 경우, 직접 API 호출이 지연을 줄일 수 있음
  • 모바일이 주요인 경우, 디바이스 연결 대신 네이티브 앱 고려