TrendShift · 2026.05.22 · 2위

cc-switch 딥다이브
— Claude Code·Codex·Gemini CLI 등 7개 도구를 하나로 묶는 데스크탑 매니저

AI 코딩 CLI 도구 7개(Claude Code·Claude Desktop·Codex·Gemini CLI·OpenCode·OpenClaw·Hermes Agent)의 공급자(provider)·MCP·스킬·세션을 한 곳에서 관리하는 Tauri 2 + Rust + React 18 기반 크로스 플랫폼 데스크탑 앱. 50+개 공급자 프리셋, 시스템 트레이 즉시 전환, 로컬 프록시 핫스위치, SQLite 원자적 쓰기로 설정 손상 방지. MIT 라이선스.
목차
  1. 한줄 요약
  2. 왜 지금 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 하드웨어/시스템 요구사항
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1한줄 요약

무엇을 하는 프로젝트인가
ONE LINER

"Claude Code·Claude Desktop·Codex·Gemini CLI·OpenCode·OpenClaw·Hermes Agent의 설정 파일을 손으로 편집하지 말고, GUI에서 클릭 한 번으로 공급자를 전환하자."

cc-switch는 7개의 AI 코딩 CLI 도구가 각자 다른 포맷(JSON·TOML·.env)으로 들고 있는 설정·API 키·MCP·스킬·프롬프트를 하나의 데스크탑 앱에서 통합 관리한다. 50+개의 공급자(provider) 프리셋이 내장돼 있어서 AWS Bedrock·NVIDIA NIM·커뮤니티 릴레이까지 클릭 한 번에 갈아끼울 수 있다.

핵심은 단순한 "GUI 설정 편집기"가 아니라는 점이다. 로컬 프록시 모드로 포맷 변환·자동 페일오버·서킷 브레이커를 제공하고, 시스템 트레이에서 메인 창을 열지 않고도 즉시 공급자 전환이 가능하며, SQLite 원자적 쓰기로 설정 파일이 깨지지 않는다.

TERM
Provider (공급자)
AI 모델을 실제로 호스팅·서빙하는 회사 또는 엔드포인트. 같은 Claude 모델이라도 Anthropic 직결, AWS Bedrock, Google Vertex, 커뮤니티 릴레이가 모두 다른 공급자다. 각각 endpoint URL · API key · 인증 방식이 다르고, 가격·속도·안정성도 다르다. cc-switch는 이 "공급자"를 한 단위로 관리한다.
TERM
MCP (Model Context Protocol)
Anthropic이 2024년에 표준화한 "LLM ↔ 외부 도구" 연결 규약. Slack·Gmail·DB 같은 외부 서비스를 LLM이 호출할 수 있게 해주는 어댑터 표준. Claude Code·Codex·Gemini CLI가 각자 따로 등록하던 MCP 서버 목록을 cc-switch는 하나의 패널에서 통합 관리하고 양방향 동기화한다.
비유

여러 SIM 카드를 한 폰에서 굴리는 듀얼 SIM 매니저를 떠올려 보자. SK텔레콤·KT·해외 로밍 SIM을 매번 폰을 분해해 끼우는 대신, 듀얼 SIM 슬롯이 있으면 화면에서 토글 한 번에 갈아끼울 수 있다.

cc-switch는 그 듀얼 SIM의 AI 코딩 CLI 버전이다. Claude Code의 ANTHROPIC_API_KEY, Codex의 ~/.codex/config.toml, Gemini CLI의 GOOGLE_API_KEY, OpenCode의 .env — 매번 손으로 편집하는 대신 GUI에서 "Anthropic 공식 → AWS Bedrock → PackyCode 릴레이"를 클릭 한 번에 전환한다.

2왜 지금 주목받는가

트렌딩 이유와 경쟁 제품 대비 강점

① AI 코딩 CLI 폭증 → 멀티 도구 시대가 왔다

2025~2026년에 AI 코딩 CLI 도구가 한꺼번에 쏟아졌다. Anthropic의 Claude Code, OpenAI의 Codex CLI, Google의 Gemini CLI, 오픈소스 OpenCode·OpenClaw·Hermes Agent — 각자 강점이 다르다. Claude는 긴 컨텍스트에서 강하고, Codex는 빠르고, Gemini는 무료 할당량이 크다. 개발자들은 여러 개를 동시에 깔고 상황에 따라 골라 쓴다.

문제는 각 도구가 자기 설정 포맷을 고집한다는 점. Claude Code는 환경 변수, Codex는 TOML, Gemini는 JSON, OpenCode는 .env — 공급자를 갈아끼울 때마다 7개 파일을 손으로 편집해야 한다. cc-switch는 이 "멀티 코딩 CLI 시대의 SIM 매니저"로 정확히 시장 빈틈을 찔렀다.

② 50+개 공급자 프리셋 — 클릭 한 번에 끝

Anthropic 공식, OpenAI 공식, AWS Bedrock, Google Vertex, NVIDIA NIM, 그리고 PackyCode·AIGoCode·DMXAPI·Crazyrouter 같은 중국·글로벌 릴레이 서비스까지 50+개의 공급자가 기본 내장돼 있다. 사용자가 키만 붙여넣으면 끝이다. 직접 endpoint URL을 입력하거나 인증 헤더를 만들 필요가 없다.

경쟁 옵션방식한계
수동 편집vim ~/.codex/config.toml7개 도구 × N개 공급자 = 손목 부상
dotfiles 매니저chezmoi, stow버전 관리는 되지만 즉시 전환 불가
direnv + per-folder .envrc폴더 진입 시 자동 적용MCP·스킬 동기화 안 됨
cc-switchGUI + 트레이 + SQLite7개 도구 통합 + 프록시 + 동기화

③ MCP·스킬·프롬프트 통합 패널

Claude Code·Claude Desktop·Codex·Gemini CLI·OpenCode·OpenClaw·Hermes Agent는 모두 MCP 서버를 따로 등록한다. Slack MCP를 7번 등록해야 지원 도구(7개) 전체에서 다 쓸 수 있다. cc-switch는 한 패널에서 MCP 서버를 추가하면 자동으로 지원 도구(7개)의 설정 파일에 양방향 동기화한다. 라이브 파일에서 직접 편집한 변경도 다시 빨아들인다.

스킬도 마찬가지. GitHub 레포 URL 하나 붙여넣으면 심볼릭 링크 또는 파일 복사 모드로 지원 도구(7개)의 skills 디렉터리에 동시 설치된다. 프롬프트는 CLAUDE.md / AGENTS.md / GEMINI.md를 마크다운 에디터에서 편집하고 활성화 시 라이브 파일에 동기화된다. "backfill protection" — 라이브 파일에서 외부 도구가 수정한 내용도 다시 cc-switch DB로 빨아들여서 손실을 막는다.

④ 로컬 프록시 모드 — 핫스위치, 자동 페일오버, 서킷 브레이커

이게 진짜 차별점이다. cc-switch는 로컬에서 HTTP 프록시 서버를 띄울 수 있다. CLI 도구가 cc-switch 프록시에 요청을 보내면, cc-switch가 진짜 공급자에게 중계한다.

⑤ 사용량 대시보드 + 세션 매니저

지출·요청 수·토큰 사용량을 트렌드 차트로 보여주고 모델별 커스텀 가격을 입력해서 정확한 청구 추정이 가능하다. 세션 매니저는 지원 도구(7개)의 대화 히스토리를 통합 검색·복원할 수 있다. Claude Code에서 어제 한 작업을 Codex에서 이어서 할 수 있다는 뜻이다.

⑥ 클라우드 동기화 — Dropbox / OneDrive / iCloud / WebDAV

설정 디렉터리를 클라우드 동기화 폴더에 두면 여러 PC에서 같은 공급자·MCP·스킬·프롬프트를 공유한다. WebDAV 서버도 지원해서 셀프호스팅 NAS(Synology·QNAP)에 동기화할 수 있다.

⑦ Tauri 2 — 가벼움 + 코드사이닝

Electron 대안인 Tauri 2.8로 만들어서 설치 용량이 ~10MB 수준, 메모리 사용량도 Electron의 1/3~1/5. macOS는 Apple 코드사이닝·공증 완료여서 다운로드 후 바로 실행된다 — "확인되지 않은 개발자" 경고 우회 절차가 필요 없다. Homebrew Cask(brew install --cask cc-switch)와 AUR(paru -S cc-switch-bin)도 지원.

DIFFERENTIATOR
"제거해도 CLI는 계속 동작" 원칙

cc-switch는 "minimal intrusion" 설계 원칙을 따른다. 앱을 삭제해도 마지막에 활성화된 설정은 라이브 파일에 그대로 남아서 Claude Code·Codex는 정상 동작한다. 그래서 현재 활성 공급자는 삭제할 수 없다 — 모든 공급자가 사라지면 CLI가 못 쓰게 되니까. 이 원칙 덕분에 사용자가 안심하고 도입할 수 있다.

3기술 스택 전체 지도

백엔드 · 프론트엔드 · 인프라 한 눈에

백엔드 (Rust · Tauri 2)

라이브러리버전역할
tauri2.8+크로스 플랫폼 데스크탑 프레임워크. Electron 대안, 시스템 웹뷰 사용
rust1.95 (toolchain) / MSRV 1.85백엔드 언어. 메모리 안전 + 빠른 네이티브 성능
tokio비동기 런타임. HTTP 프록시·DB I/O·시스템 트레이 이벤트 처리
serdeJSON·TOML 직렬화/역직렬화. 7개 CLI의 다양한 설정 포맷 처리
thiserror커스텀 에러 타입 정의. ? 연산자로 에러 전파 단순화
tauri-plugin-updater자동 업데이트 — 새 버전 다운로드 + 백그라운드 설치
tauri-plugin-process외부 프로세스 실행 — CLI 도구 버전 확인 등
tauri-plugin-dialog네이티브 파일 선택 다이얼로그
tauri-plugin-store키-밸류 영구 저장소 (device-level UI 설정용)
tauri-plugin-log구조화된 로그 출력 + 파일 회전
SQLite (rusqlite 0.31, bundled/backup/hooks)SSOT 데이터베이스. ~/.cc-switch/cc-switch.db

프론트엔드 (React 18 · TypeScript)

라이브러리버전역할
react18UI 렌더링 — concurrent features 활용
typescript타입 안전 — Tauri IPC 명령 시그니처를 타입으로 보장
vite번들러 · HMR(Hot Module Reload) · 빠른 개발 서버
tailwindcss3.4유틸리티 우선 CSS — 빠른 스타일링
@tanstack/react-queryv5서버 상태 캐시 · 동기화 — Tauri IPC 응답을 자동 캐시
react-i18next다국어(zh / zh-TW / en / ja) — 키-밸류 번역 + 폴백
react-hook-form폼 상태 관리 — 재렌더링 최소화로 큰 폼도 빠름
zod스키마 검증 — 공급자 설정 입력값 런타임 검증 + TS 타입 추론
shadcn/uiRadix UI + TailwindCSS 기반 컴포넌트 모음. 복사-붙여넣기형, 의존성 0
@dnd-kit드래그앤드롭 정렬 — 공급자 순서 변경에 사용

테스트

도구역할
vitestVite 친화 테스트 러너. Jest 대안, 더 빠름
MSW (Mock Service Worker)Tauri IPC API 모킹 — 백엔드 없이 프론트엔드 단독 테스트 가능
@testing-library/react컴포넌트 테스트 — 사용자 관점 인터랙션 검증
cargo testRust 백엔드 단위 테스트 — --features test-hooks로 테스트 전용 hook 활성

빌드 · 배포 · 패키징

도구역할
pnpmNode 패키지 매니저 — npm/yarn보다 디스크 효율 좋음 (심볼릭 링크 기반)
tauri-cli2.8+ — tauri build가 OS별 인스톨러까지 만들어줌
Windows.msi 인스톨러 + Portable.zip
macOS.dmg + Homebrew Cask (brew install --cask cc-switch) — Apple 공증 완료
Linux.deb + .rpm + .AppImage + AUR (paru -S cc-switch-bin)
Flatpak공식 릴리스에는 없음 — .deb에서 자체 빌드 가능 (가이드 제공)

외부 통합 대상

대상역할
Claude CodeAnthropic 공식 CLI. 환경 변수 + ~/.claude/ 설정
Codex CLIOpenAI 공식. ~/.codex/config.toml + Plus·Team 다중 계정
Gemini CLIGoogle 공식. ~/.gemini/ + GEMINI.md 프롬프트
OpenCode오픈소스 코딩 에이전트 (anomalyco/opencode)
OpenClaw또 다른 오픈소스 코딩 도구. workspace 에디터(AGENTS.md / SOUL.md) 별도 제공
Hermes AgentNousResearch의 에이전트
50+ 공급자 프리셋Anthropic·OpenAI·AWS Bedrock·NVIDIA NIM·Google Vertex·PackyCode·AIGoCode·DMXAPI·Crazyrouter·MiniMax·SiliconFlow·BytePlus·… 등
클라우드 스토리지Dropbox · OneDrive · iCloud · WebDAV (Synology·QNAP NAS 대응)

4아키텍처 심화 분석

시스템 구조도 + 핵심 설계 패턴

전체 시스템 구조

┌─────────────────────────────────────────────────────────────┐ │ 사용자 (개발자) │ │ "Claude Code를 Bedrock으로 갈아끼우고 싶다" │ └────────────┬────────────────────────────┬───────────────────┘ │ GUI 클릭 │ CLI 도구 실행 ▼ ▼ ┌────────────────────────────┐ ┌──────────────────────────┐ │ cc-switch 데스크탑 앱 │ │ Claude Code / Codex / │ │ ┌────────────────────┐ │ │ Gemini CLI / OpenCode / │ │ │ React 18 + TS UI │ │ │ OpenClaw │ │ │ TanStack Query v5 │ │ └──────────┬───────────────┘ │ │ TailwindCSS · i18n │ │ │ │ └─────────┬──────────┘ │ │ HTTP 요청 │ │ Tauri IPC │ ▼ │ ┌─────────▼──────────┐ │ ┌──────────────────────────┐ │ │ Rust 백엔드 │ │ │ cc-switch 로컬 프록시 │ │ │ ┌────────────────┐ │ │ │ (선택적 활성화) │ │ │ │ Commands │ │ │ │ ・포맷 변환 │ │ │ │ ↓ │ │ │ │ ・자동 페일오버 │ │ │ │ Services │◀┼───┼───┤ ・서킷 브레이커 │ │ │ │ ↓ │ │ │ │ ・요청 보정기 │ │ │ │ DAO │ │ │ └──────────┬───────────────┘ │ │ │ ↓ │ │ │ │ │ │ │ SQLite │ │ │ │ 변환된 HTTP │ │ └────────────────┘ │ │ ▼ │ └────────────────────┘ │ ┌──────────────────────────┐ │ ┌────────────────────┐ │ │ 실제 LLM 공급자 │ │ │ Tray Icon │ │ │ Anthropic · OpenAI · │ │ │ Auto-updater │ │ │ Google · AWS Bedrock · │ │ │ Deep Link Handler │ │ │ NVIDIA NIM · 릴레이 │ │ └────────────────────┘ │ └──────────────────────────┘ └────────────┬───────────────┘ │ 양방향 동기화 (Dual-way Sync) ▼ ┌─────────────────────────────────────────────────────────────┐ │ 라이브 설정 파일 (각 CLI 도구의 표준 경로) │ │ ・~/.claude/ │ │ ・~/.codex/config.toml │ │ ・~/.gemini/ │ │ ・~/.opencode/.env │ │ ・~/.openclaw/AGENTS.md SOUL.md │ └─────────────────────────────────────────────────────────────┘

핵심 설계 패턴 6가지

PATTERN 1

SSOT (Single Source of Truth)

모든 동기화 가능한 데이터는 ~/.cc-switch/cc-switch.db (SQLite) 단일 파일에 저장된다. 라이브 설정 파일(~/.claude/ 등)은 출력 캐시일 뿐이고 권위 있는 데이터는 DB 안에 있다. 그래서 클라우드 동기화도 DB 파일 하나만 동기화하면 끝이다.

PATTERN 2

Dual-layer Storage (이중 저장소)

"동기화돼야 하는 데이터"와 "이 기기에만 적용되는 UI 설정"을 분리했다. 동기화 데이터(공급자·MCP·스킬·프롬프트)는 SQLite로, 이 기기 UI 환경설정(테마·창 크기·언어)은 ~/.cc-switch/settings.json으로. 클라우드 동기화 시 settings.json은 빠지므로 PC마다 다른 UI 환경을 유지할 수 있다.

PATTERN 3

Dual-way Sync (양방향 동기화)

공급자를 활성화하면 cc-switch가 라이브 파일에 쓴다. 사용자가 외부 에디터로 라이브 파일을 수정하면, cc-switch가 다음에 그 공급자를 열 때 자동으로 변경을 backfill(역흡수)해서 DB에 저장한다. 즉 라이브 파일과 DB가 한쪽이 권위적이지 않고 서로 동기화된다.

PATTERN 4

Atomic Writes (원자적 쓰기)

"temp 파일 + rename" 패턴. 새 설정을 ~/.claude/config.json.tmp에 먼저 쓰고, 완전히 다 쓴 후에 rename(config.json.tmp, config.json)으로 교체한다. POSIX에서 rename은 원자적 연산이라 중간에 프로세스가 죽어도 파일이 반쪽짜리로 깨지지 않는다. AppData·.codex·.gemini 모두 이 패턴 적용.

PATTERN 5

Concurrency Safe (동시성 안전)

SQLite 연결 객체를 Mutex로 감싸서 동시 접근을 직렬화한다. 시스템 트레이 클릭 + GUI 동시 조작 같은 동시 이벤트에서도 race condition이 발생하지 않는다. Rust 컴파일러가 데이터 경쟁을 컴파일 타임에 잡아주는 것과 결합돼 매우 견고하다.

PATTERN 6

Layered Architecture (계층 분리)

Commands(API) → Services(비즈니스) → DAO(데이터 접근) → Database로 명확히 4계층 분리. 프론트엔드가 Tauri IPC로 부르는 것은 Commands 레이어뿐, 그 아래는 모두 내부 모듈. 테스트도 각 레이어 단독으로 작성 가능하다.

핵심 서비스 모듈

서비스책임
ProviderService공급자 CRUD · 전환 · backfill · 정렬
McpServiceMCP 서버 관리 · import/export · 라이브 파일 동기화
ProxyService로컬 프록시 모드 · 핫스위치 · 포맷 변환 · 페일오버
SessionManager지원 도구(7개) 대화 히스토리 통합 검색·복원
ConfigService설정 import/export · 자동 백업 회전 (최근 10개 유지)
SpeedtestServiceAPI 엔드포인트 지연 시간 측정 — 공급자 선택 시 빠른 곳 추천

Deep Link 처리 흐름 (ccswitch:// 스킴)

사용자가 웹에서 "Add to CC Switch" 버튼 클릭 │ ▼ 브라우저가 ccswitch://provider/import?data=eyJ... 호출 │ ▼ OS가 ccswitch 스킴을 cc-switch 앱에 라우팅 │ ▼ Rust 백엔드의 DeepLink Handler가 URL 파싱 │ ▼ data 파라미터(base64 JSON) 디코드 → 공급자 객체 │ ▼ 프론트엔드에 "import 확인" 다이얼로그 띄움 │ ▼ 사용자 승인 → ProviderService.create() → DB 저장

같은 메커니즘으로 MCP 서버·프롬프트·스킬도 URL로 공유 가능. "클릭 한 번에 설정 공유"의 핵심.

5디렉토리 구조 해부

중요한 폴더와 파일이 각각 하는 일

전체 트리

cc-switch/
├── src/                        # 프론트엔드 (React + TypeScript)
│   ├── components/
│   │   ├── providers/          # 공급자 관리 UI
│   │   ├── mcp/                # MCP 패널
│   │   ├── prompts/            # 프롬프트 관리 (CLAUDE.md / AGENTS.md)
│   │   ├── skills/             # 스킬 관리 (GitHub 레포 설치)
│   │   ├── sessions/           # 세션 매니저 (대화 히스토리)
│   │   ├── proxy/              # 로컬 프록시 모드 패널
│   │   ├── openclaw/           # OpenClaw 전용 워크스페이스 에디터
│   │   ├── settings/           # 설정 (터미널·백업·About)
│   │   ├── deeplink/           # Deep Link 임포트 다이얼로그
│   │   ├── env/                # 환경 변수 관리
│   │   ├── universal/          # 크로스 앱 통합 설정
│   │   ├── usage/              # 사용량 통계 대시보드
│   │   └── ui/                 # shadcn/ui 컴포넌트 라이브러리
│   ├── hooks/                  # 커스텀 훅 (비즈니스 로직 분리)
│   ├── lib/
│   │   ├── api/                # Tauri API 래퍼 (타입 안전 IPC)
│   │   └── query/              # TanStack Query 설정
│   ├── i18n/locales/           # 다국어 번역 (zh / zh-TW / en / ja)
│   ├── config/                 # 프리셋 (50+ 공급자 · MCP 템플릿)
│   └── types/                  # TypeScript 타입 정의
├── src-tauri/                  # 백엔드 (Rust)
│   └── src/
│       ├── commands/           # Tauri 명령 레이어 (도메인별 분리)
│       ├── services/           # 비즈니스 로직 (ProviderService 등)
│       ├── database/           # SQLite DAO 레이어
│       ├── proxy/              # 프록시 모듈 (핫스위치 + 페일오버)
│       ├── session_manager/    # 세션 관리 (대화 히스토리)
│       ├── deeplink/           # Deep Link 핸들러
│       └── mcp/                # MCP 동기화 모듈
├── tests/                      # 프론트엔드 테스트 (vitest + MSW)
├── docs/                       # 사용자 매뉴얼 (다국어)
├── flatpak/                    # Flatpak 빌드 가이드 (커뮤니티용)
└── assets/                     # 스크린샷 · 스폰서 자산

핵심 파일별 역할

경로역할
src/lib/api/*.tsTauri IPC 래퍼. 백엔드 명령을 타입 안전한 함수로 노출 — invoke('add_provider', {...})addProvider({...})
src/hooks/useProvider.tsTanStack Query를 활용한 공급자 상태 관리 — 자동 캐시·재검증
src/config/providers.ts50+ 공급자 프리셋 정의 (Anthropic, OpenAI, Bedrock, …)
src-tauri/src/commands/providers.rs공급자 관련 Tauri 명령 (add_provider, switch_provider 등)
src-tauri/src/services/provider_service.rs공급자 CRUD 비즈니스 로직 — DB·라이브 파일 동시 갱신
src-tauri/src/database/dao.rsSQLite 쿼리 (Mutex 보호 연결)
src-tauri/src/proxy/server.rs로컬 HTTP 프록시 서버 (tokio + hyper)
src-tauri/tauri.conf.jsonTauri 설정 — 윈도우 크기·아이콘·번들·업데이트 채널
pnpm-lock.yamlpnpm 의존성 잠금 — CI 재현성 보장

사용자 데이터 저장 위치

경로내용
~/.cc-switch/cc-switch.dbSSOT SQLite — 공급자·MCP·프롬프트·스킬 메타데이터
~/.cc-switch/settings.json기기별 UI 환경설정 (테마·언어 등 — 동기화 제외)
~/.cc-switch/backups/자동 백업 (회전식, 최근 10개 유지)
~/.cc-switch/skills/설치된 스킬 — 지원 도구(7개)에 symlink로 노출
~/.cc-switch/skill-backups/스킬 제거 전 자동 백업 (최근 20개)

6학습 포인트 (기술별)

이 레포에서 무엇을 배울 수 있는가

① Tauri 2 — Electron의 가벼운 대안

cc-switch는 Tauri 2를 진지하게 다루는 좋은 레퍼런스다. Electron이 Chromium을 통째로 번들하는 반면, Tauri는 시스템 웹뷰(macOS WebKit, Windows WebView2, Linux WebKitGTK)를 쓴다. 결과: 설치 용량 10MB vs 150MB, 메모리 1/3.

배울 것: Tauri IPC 패턴#[tauri::command] 데코레이터로 Rust 함수를 프론트에 노출하고, 프론트에서 invoke()로 호출하는 흐름. 플러그인 시스템 — updater · process · dialog · store · log 같은 공식 플러그인을 조합. 시스템 트레이SystemTray::new()로 트레이 아이콘에 메뉴 매다는 법.

실습 아이디어: "내 노트 매니저 데스크탑 앱" — 마크다운 노트를 Tauri 2 + React로 만들어 보기. 트레이 아이콘에서 빠른 메모 추가.

② TanStack Query v5 — 서버 상태 캐시

일반 React 앱에서는 fetch + useState 조합으로 데이터 받아오는데, 그러면 캐시·재검증·로딩·에러 상태를 다 수동으로 짜야 한다. TanStack Query v5는 그걸 1줄로 해결한다:

const { data, isLoading } = useQuery({
  queryKey: ['providers'],
  queryFn: () => invoke('list_providers'),
});

cc-switch는 Tauri IPC 응답을 캐시 키로 자동 관리한다. 공급자 추가 → queryClient.invalidateQueries(['providers']) 한 줄이면 화면 전체가 자동 새로고침.

배울 것: 쿼리 키 설계, mutation + optimistic update, staleTime / gcTime 튜닝, 서버 상태와 클라이언트 상태의 분리.

③ shadcn/ui — 복사-붙여넣기형 컴포넌트

shadcn/ui는 라이브러리가 아니다. CLI로 컴포넌트 코드를 자기 프로젝트에 복사해 넣는 방식이다(npx shadcn add button). 결과: 외부 의존성 0, 마음대로 수정 가능, 트리 쉐이킹 최적.

배울 것: Radix UI 프리미티브 위에 Tailwind로 스타일링하는 패턴. 헤드리스 컴포넌트(접근성·키보드 내비게이션 기본 제공) + 디자인 토큰 분리.

④ Rust + SQLite + Atomic Writes

설정 파일은 깨지면 안 된다. cc-switch는 "temp + rename"으로 깨짐을 막는다. Rust 코드 패턴:

let tmp = path.with_extension("tmp");
std::fs::write(&tmp, content)?;       // 1. 임시 파일에 쓰기
std::fs::rename(&tmp, path)?;         // 2. 원자적 교체
// 중간에 죽어도 원본은 그대로!

배울 것: 파일 시스템 원자성 개념 (POSIX rename = 원자적, write = 비원자적). SQLite WAL 모드. Mutex로 동시성 보호.

⑤ 로컬 HTTP 프록시 서버

cc-switch 안에서 tokio + hyper로 작은 프록시를 띄운다. 들어온 요청의 헤더·본문을 변환해서 진짜 LLM 공급자에게 보낸다. 응답 스트리밍도 그대로 통과시켜야 한다(SSE 기반 LLM 응답).

배울 것: HTTP 프록시 기본기 (Host 헤더, X-Forwarded-For), 스트리밍 응답 패스스루, 서킷 브레이커 패턴 (실패 N회 → open 상태로 빠르게 거절 → half-open으로 복구 시도), OpenAI/Anthropic API 포맷 차이 이해.

⑥ Deep Link · 커스텀 URL 스킴

ccswitch:// 같은 커스텀 스킴은 어떻게 OS에 등록될까? Tauri는 tauri.conf.jsondeepLinkProtocols로 등록하고, 핸들러를 Rust에서 받는다. macOS는 Info.plist의 CFBundleURLTypes, Windows는 레지스트리, Linux는 .desktop 파일 — Tauri가 다 처리해 준다.

⑦ react-i18next — 다국어 패턴

zh/zh-TW/en/ja 4개 언어를 어떻게 깔끔하게 관리할까. src/i18n/locales/{lang}/translation.json에 키-밸류로 저장하고, useTranslation() 훅으로 가져온다.

const { t } = useTranslation();
return <button>{t('provider.add')}</button>;

배울 것: 네임스페이스 분리, 변수 보간, 복수형 처리, 날짜·숫자 포맷.

⑧ MCP (Model Context Protocol)

MCP는 2024년 말 Anthropic이 표준화한 "LLM과 외부 도구의 어댑터 규약"이다. JSON-RPC 기반, stdio 또는 SSE 트랜스포트. cc-switch는 MCP 서버를 등록·실행·상태 모니터링·라이브 파일 동기화까지 한다.

배울 것: MCP 서버 작성법 (Python/TypeScript SDK), 도구 정의(tools), 리소스(resources), 프롬프트(prompts) 3대 프리미티브 — 자기만의 MCP 서버를 만들어보면 LLM에 자기 데이터를 연결하는 능력이 생긴다.

7하드웨어/시스템 요구사항

어떤 환경에서 돌아가는가
플랫폼최소 요구사항비고
WindowsWindows 10 이상.msi 인스톨러 또는 Portable.zip
macOSmacOS 12 (Monterey) 이상.dmg + Apple 공증, Homebrew Cask
Linux (Debian/Ubuntu)Ubuntu 22.04+ / Debian 11+.deb 패키지
Linux (Fedora/RHEL)Fedora 34+ / openSUSE.rpm 패키지
Linux (Arch)최신 Arch / Manjaroparu -S cc-switch-bin AUR
Linux (범용)libwebkit2gtk-4.1 보유 배포판.AppImage

리소스 사용량

Tauri 기반이라 매우 가볍다. 대략 추정:

개발 환경 (기여하려면)

도구버전
Node.js18+
pnpm8+
Rust1.95+ (toolchain) / MSRV 1.85
Tauri CLI2.8+
OSWebView 의존성 있는 OS — Linux는 webkit2gtk-4.1 추가 패키지 필요

8직접 해볼 수 있는 실습 과제

난이도별 5개

🟢 초급 — 30분 안에

EXERCISE 1

cc-switch 설치 후 공급자 3개 등록 → 트레이에서 전환

1. 자기 OS에 맞게 설치 (Homebrew/AUR/MSI).
2. Claude Code에 Anthropic 공식 키와 임의의 릴레이 키 두 개를 등록한다.
3. 시스템 트레이 메뉴에서 한 번씩 전환하고 claude 명령으로 동작 확인.
4. ~/.cc-switch/cc-switch.db를 SQLite Browser로 열어서 어떻게 저장됐는지 본다.

목표: SSOT가 어떻게 라이브 파일과 동기화되는지 눈으로 확인.

🟢 초급 — 1시간

EXERCISE 2

두 PC에서 클라우드 동기화 설정

1. 메인 PC에서 cc-switch의 설정 디렉터리를 Dropbox 폴더로 옮긴다(--config-dir 옵션 또는 심볼릭 링크).
2. 다른 PC에 cc-switch 설치 후 같은 디렉터리를 가리키게 한다.
3. 메인 PC에서 새 공급자 추가 → 다른 PC에서 자동으로 보이는지 확인.
4. 충돌이 발생하면 어떻게 되는지 실험.

🟡 중급 — 반나절

EXERCISE 3

cc-switch 로컬 빌드 후 새 공급자 프리셋 추가

1. git clonepnpm installpnpm dev로 개발 모드 실행.
2. src/config/providers.ts를 열어서 기존 프리셋이 어떻게 정의됐는지 본다.
3. 한국 서비스(예: 네이버 클로바 X)나 사내 LLM 게이트웨이를 위한 새 프리셋을 추가한다.
4. pnpm typecheck + pnpm test:unit으로 검증.
5. GUI에서 새 프리셋이 보이고 선택 가능한지 확인.

목표: 오픈소스 컨트리뷰션 워크플로 체험 — PR을 보내볼 수도 있다.

🟡 중급 — 1~2일

EXERCISE 4

Mini cc-switch — Claude Code 전용 공급자 스위처를 Python으로 직접 작성

cc-switch의 핵심 아이디어를 200줄 안에 재현해 보자. PyQt6 또는 Textual로 작은 GUI를 만들고:
- ~/.cc-switch-mini/providers.json에 공급자 N개 저장
- 선택하면 ~/.claude/settings.jsonANTHROPIC_API_KEY + ANTHROPIC_BASE_URL 갱신 (atomic write로!)
- 트레이 아이콘에서도 전환 가능하게 (pystray)
- 변경 후 claude --help 실행해서 정상 동작 확인

목표: cc-switch의 본질이 "JSON 한 파일 교체"임을 체득하고, atomic write의 중요성을 직접 느껴본다.

🔴 상급 — 1주

EXERCISE 5

cc-switch에 "한국어 i18n + 새 CLI 도구 통합" 기여

cc-switch는 zh/zh-TW/en/ja 4개 언어만 지원한다. 한국어(ko) 추가를 PR로 보내자:
1. src/i18n/locales/ko/translation.json 생성 → 모든 키 번역.
2. src/lib/i18n.ts에 ko 언어 등록.
3. 설정 화면 언어 선택에 "한국어" 추가.
4. 동시에, 아직 통합 안 된 새 CLI 도구(예: aidercontinue) 어댑터를 backend에 추가. src-tauri/src/services/ 아래 ProviderService 패턴을 따라 새 서비스 작성. 라이브 파일 경로·포맷을 분석해서 동기화 로직 구현.
5. 테스트 작성, PR 제출.

목표: 실전 오픈소스 기여 + Tauri 백엔드 깊이 이해 + 한국 사용자에게 직접 도움 되는 기능 제공.

9관련 기술 심화 학습 로드맵

cc-switch를 토대로 6주 학습 플랜

Week 1 — Tauri 2 기본기

Week 2 — Rust 비동기 + tokio

Week 3 — React 18 + TanStack Query v5

Week 4 — SQLite + 영구 저장 패턴

Week 5 — MCP (Model Context Protocol)

Week 6 — 종합: 자기만의 데스크탑 도구 만들기

10핵심 키워드 사전

프로젝트에 등장하는 기술 용어 풀이
TERM
Tauri 2
Rust 백엔드 + 시스템 웹뷰 기반 데스크탑 앱 프레임워크. Electron 대안. macOS는 WebKit, Windows는 WebView2, Linux는 WebKitGTK를 그대로 쓰므로 번들이 매우 작다(10MB대).
TERM
Tauri IPC (Inter-Process Communication)
프론트엔드(JS)와 백엔드(Rust) 사이의 통신 채널. #[tauri::command]로 Rust 함수를 노출하고, 프론트에서 invoke('name', args)로 호출. 직렬화는 JSON.
TERM
SSOT (Single Source of Truth)
"진실의 단일 출처". 같은 데이터를 여러 곳에 중복 저장하지 말고, 한 곳을 권위 있는 출처로 정하라는 원칙. cc-switch에서는 SQLite DB가 SSOT이고, 라이브 설정 파일은 출력 캐시일 뿐.
TERM
Atomic Write
파일 쓰기가 "전부 또는 전무"로 끝나도록 보장하는 기법. temp 파일에 먼저 쓰고 rename으로 교체. POSIX rename은 같은 파일 시스템 안에서 원자적이라 중간에 죽어도 깨지지 않는다.
TERM
MCP (Model Context Protocol)
Anthropic 표준 LLM-도구 어댑터 프로토콜. JSON-RPC 기반, stdio 또는 SSE 트랜스포트. tools/resources/prompts 3대 프리미티브. Slack·Gmail·DB 같은 외부 서비스를 LLM이 호출하게 해준다.
TERM
Provider (공급자)
같은 모델이라도 어디서 호스팅되는지가 다르면 다른 공급자. Claude를 Anthropic 직결로 쓰는 것과 AWS Bedrock으로 쓰는 것은 endpoint·인증·가격이 모두 다르다.
TERM
Circuit Breaker (서킷 브레이커)
분산 시스템 패턴. 어떤 서비스에 연속으로 실패하면 일정 시간 동안 호출을 빠르게 거절(open) → 시간 지나면 시험 호출(half-open) → 성공하면 정상화(closed). 죽은 서비스에 매번 타임아웃까지 기다리는 낭비를 막는다.
TERM
Deep Link / Custom URL Scheme
웹 링크를 클릭하면 특정 앱이 열리도록 OS에 등록한 커스텀 URL 스킴. ccswitch://provider/import?data=... 같은 형태. 모바일에서 익숙하지만 데스크탑에서도 작동한다.
TERM
TanStack Query v5
React 서버 상태 관리 라이브러리. fetch 결과를 키 기반으로 캐시하고, 자동 재검증·refetch·낙관적 업데이트를 처리한다. 이전 이름은 React Query.
TERM
shadcn/ui
컴포넌트 라이브러리지만 npm 패키지가 아니다. CLI로 컴포넌트 소스를 자기 프로젝트에 복사해 넣는다. Radix UI(헤드리스) + TailwindCSS 조합. 자유롭게 수정 가능.
TERM
Backfill (역흡수)
cc-switch 용어. 사용자가 라이브 설정 파일을 외부 에디터로 직접 수정한 경우, 그 변경을 다시 cc-switch DB로 가져오는 과정. 데이터 손실을 막는다.
TERM
pnpm
Node 패키지 매니저. npm/yarn과 달리 의존성을 글로벌 store에 한 번만 저장하고 프로젝트에는 심볼릭 링크로 노출 → 디스크 절약 + 설치 속도 향상.
TERM
vitest
Vite 친화 테스트 러너. Jest API 호환이지만 ESM 네이티브 지원, 더 빠른 워치 모드. cc-switch가 채택.
TERM
MSW (Mock Service Worker)
네트워크 요청을 Service Worker 수준에서 가로채는 모킹 라이브러리. 실제 fetch/axios 코드를 안 바꾸고 응답만 가짜로 반환. cc-switch는 Tauri IPC 호출을 MSW로 모킹해서 백엔드 없이 프론트 테스트.
TERM
Homebrew Cask
macOS 패키지 매니저 Homebrew의 GUI 앱 전용 서브시스템. brew install --cask cc-switch로 .dmg 다운로드·드래그·실행을 한 줄에 끝낸다.
TERM
AUR (Arch User Repository)
Arch Linux 사용자 커뮤니티 패키지 저장소. paruyay 같은 헬퍼로 설치. cc-switch는 cc-switch-bin 패키지로 등록돼 있다.
TERM
WebDAV
HTTP 위에 파일 시스템 연산을 얹은 프로토콜. Nextcloud·Synology·OwnCloud가 지원. cc-switch는 WebDAV로 셀프호스팅 NAS에 설정을 동기화할 수 있다.

11참고 링크

더 깊이 파보고 싶다면