TRENDSHIFT 딥다이브 · 2026-06-27

mauriceboe/TREK 딥다이브
— 셀프호스팅 실시간 협업 여행 플래너의 풀스택 설계

여행 계획을 구글 시트나 노션에 흩뿌려 쓰다 지쳐 만든 프로젝트. 인터랙티브 지도 + 실시간 WebSocket 협업 + 예산/짐 관리 + MCP AI 연동을 하나의 Docker 컨테이너로 묶어 앱스토어 없이 PWA로 설치할 수 있다. 백엔드는 NestJS 11 + SQLite, 프론트는 React 19 + Vite, 지도는 Leaflet/Mapbox GL, 인증은 OIDC(Google·Keycloak 등). 저장소: mauriceboe/TREK · v3.1.2 · AGPL-3.0 · TrendShift Daily #4 · Docker Hub 다운로드 지속 증가. ※ 본 문서는 기술 학습용이며, 본인 서버에 배포할 경우 AGPL 라이선스 의무(소스 공개)를 반드시 확인하십시오.
목차
  1. 프로젝트 한줄 요약
  2. 왜 주목받는가
  3. 기술 스택 전체 지도
  4. 아키텍처 심화 분석
  5. 디렉토리 구조 해부
  6. 학습 포인트 (기술별)
  7. 시스템 요구사항 · 설치
  8. 직접 해볼 수 있는 실습 과제
  9. 관련 기술 심화 학습 로드맵
  10. 핵심 키워드 사전
  11. 참고 링크

1프로젝트 한줄 요약

TREK이 무엇을 하는 물건인가.

핵심 메시지

"구글 여행 플래너 + 스플릿와이즈 + 낫수 + 네이버 지도를 한 Docker 컨테이너로 직접 운영하는 것"

TREK은 셀프호스팅 여행 플래너 올인원 앱이다. 지도 위에 일정을 드래그하고, 팀원들과 실시간으로 동시 편집하며, 예산을 N빵 정산하고, 짐 체크리스트를 관리하는 모든 기능이 자신의 서버 위에서만 돌아간다. 데이터는 구글도 노션도 모르는 내 서버 SQLite 파일 하나에 저장된다.

여기에 AI MCP 서버까지 내장되어, Claude나 다른 AI 어시스턴트가 OAuth 2.1로 인증해 여행 일정을 직접 생성·수정할 수 있다. "앱스토어 없이 PWA로 폰에 설치"가 가능한 것도 특징이다.

용어
셀프호스팅 (Self-Hosting)
앱을 클라우드 서비스사 대신 자신의 서버(VPS, 홈서버, NAS 등)에 직접 설치·운영하는 방식. 구독료 없음, 데이터 완전 소유, 하지만 서버 유지보수는 직접 해야 한다. TREK은 Docker 한 줄로 설치되므로 진입 장벽이 낮다.
용어
PWA (Progressive Web App)
앱스토어를 거치지 않고 브라우저에서 바로 설치되는 웹앱. Service Worker가 오프라인 캐싱, 푸시 알림, 홈 화면 아이콘을 담당한다. TREK은 iOS/Android 모두 브라우저에서 "홈에 추가"로 설치된다.
용어
MCP (Model Context Protocol)
AI 모델이 외부 도구·데이터소스에 표준 방식으로 연결하는 Anthropic 제안 프로토콜. TREK은 150개 이상의 MCP 도구를 OAuth 2.1 인증으로 노출한다. Claude가 "아이슬란드 여행 3일차 일정 만들어줘"라고 하면 MCP를 통해 실제 TREK 데이터를 읽고 쓴다.

2왜 주목받는가

트렌딩 이유와 기존 솔루션 대비 차별점.

TREK이 TrendShift 상위권을 차지한 배경에는 세 가지 흐름이 맞물려 있다. 첫째, 데이터 주권 의식 — 구글·노션에 여행 데이터를 맡기기 싫다는 사람이 늘었다. 둘째, AI 여행 플래너 수요 — ChatGPT/Claude로 일정을 짜는 흐름이 커지면서, AI가 직접 앱 데이터를 읽고 쓸 수 있는 MCP 연동이 매력적이다. 셋째, Docker 셀프호스팅 생태계 — Unraid, TrueNAS, Proxmox 사용자들이 찾는 '올인원 여행 앱' 공백이 있었다.

솔루션지도 + 일정실시간 협업예산 정산셀프호스팅AI 연동오프라인
TREK✅ Leaflet/Mapbox✅ WebSocket✅ Splitwise식✅ Docker 1줄✅ MCP 150+✅ Workbox
구글 Maps + 여행제한적제한적제한적
노션❌ 지도 없음AI 블록
TripIt제한적제한적
Wanderlog❌ 클라우드만
Splitwise
함정 · 한계
AGPL-3.0 라이선스 의무

TREK은 AGPL-3.0이다. 소스를 수정해 네트워크로 서비스하면 수정본 소스도 공개해야 한다. 개인 사용·사내 사용은 괜찮지만 상업 서비스로 제공하려면 반드시 법률 검토가 필요하다.

SQLite 단일 파일 DB는 대규모 동시 쓰기에 한계가 있다. 수십 명 이상의 팀이 동시에 편집하는 엔터프라이즈 환경에는 부적합하다.

해결 · 강점
단일 컨테이너, 단일 DB, 제로 의존성

서버·클라이언트·DB가 하나의 Docker 이미지에 내장되어 있어 외부 서비스(Redis, Postgres 등) 없이 운영된다. 백업은 ./data/ 폴더 하나만 복사하면 끝. 마이그레이션도 자동 처리된다.

3기술 스택 전체 지도

프론트엔드 / 백엔드 / DB / 인프라 각각 상세.

프론트엔드

기술버전역할
React19.2.6UI 컴포넌트 트리. React 19의 새 Concurrent 기능(Suspense, Actions) 활용
Vite최신번들러 + 개발 서버. ESM 기반으로 HMR이 빠름
React Routerv6SPA 클라이언트 라우팅. 중첩 라우트 패턴
Zustandv4전역 상태 관리. Redux 없이 경량 스토어로 여행/사용자 상태 유지
Leaflet + react-leaflet1.9.4 / 5.0OSM 기반 인터랙티브 지도. 클러스터링, 사진 마커, 경로 표시
Mapbox GLv33D 빌딩/지형 렌더링. API 키 필요 (선택)
Workbox (Service Worker)내장PWA 오프라인 캐싱 — 지도 타일, API 응답, 업로드 큐
Dexiev4IndexedDB 래퍼. 클라이언트 측 오프라인 DB
@react-pdf/rendererv4여행 일정 PDF 내보내기
@simplewebauthn/browserv13패스키(WebAuthn) 로그인 클라이언트 측
lucide-react최신SVG 아이콘 라이브러리
Axiosv1REST API 클라이언트
topojson-clientv3Atlas 기능 — 세계 지도 국가 방문 시각화

백엔드

기술버전역할
Node.js22 LTS런타임. Docker 이미지 기반
NestJS11Express 위 DI 프레임워크. 모듈/컨트롤러/서비스 패턴
Expressv4NestJS 하부 HTTP 어댑터
TypeScriptv6전체 코드베이스 타입 안전성
ws (WebSocket)v8실시간 협업 채널. 여행 편집 이벤트 브로드캐스트
jsonwebtokenv9JWT 세션 토큰 발급 / 검증
@simplewebauthn/serverv13패스키(WebAuthn) 서버 측 처리
otplibv12TOTP 2단계 인증 코드 생성/검증
nodemailerv9이메일 알림 발송 (SMTP)
node-cronv4자동 백업, 환율 업데이트 등 스케줄 작업
@modelcontextprotocol/sdkv1.28AI MCP 서버 내장 — 150+ 도구 노출
Zodv4런타임 스키마 검증 (공유 스키마는 shared/ 패키지)
helmetv8HTTP 보안 헤더 자동 설정
better-sqlite3v12동기 SQLite 드라이버 (Node.js Native Addon)
undiciv7고성능 HTTP 클라이언트 (Fetch API 대체, 외부 API 호출)
fast-xml-parserv5KML/GPX 파일 파싱 (지도 파일 가져오기)
jimpv1이미지 리사이징 / 썸네일 생성

DB / 인프라 / 공유

기술역할
SQLite (better-sqlite3)메인 DB. WAL 모드로 동시 읽기 성능 향상. 파일 하나(data/trek.db)로 운영
Docker (단일 이미지)서버+클라이언트+DB 모두 내장. Alpine 기반 멀티스테이지 빌드
Helm ChartKubernetes 배포용 차트 (charts/ 폴더)
@trek/shared클라이언트-서버 공유 타입·Zod 스키마·유틸리티 (npm workspace)
Vitest단위/통합/e2e 테스트 (서버+클라이언트 공통)
PlaywrightE2E 브라우저 테스트
Open-Meteo API날씨 예보 (16일). 무료, API 키 불필요
Google Places API장소 검색 (선택). 무료 대안: OpenStreetMap/Nominatim
KDE Itinerary예약 확인 이메일/PDF에서 항공편·숙박 자동 추출

4아키텍처 심화 분석

시스템 구조도와 핵심 설계 패턴 3가지.

전체 시스템 구조

┌────────────────────────────────────────────────────────────┐ │ Docker Container │ │ │ │ ┌──────────────┐ ┌──────────────────────────────┐ │ │ │ Vite Build │ │ NestJS Server │ │ │ │ (정적 파일) │ │ │ │ │ │ React 19 SPA│ │ ┌─────────┐ ┌────────────┐ │ │ │ │ PWA SW │ │ │ REST API│ │ WebSocket │ │ │ │ └──────┬───────┘ │ │ /api/* │ │ /ws │ │ │ │ │ serve │ └────┬────┘ └─────┬──────┘ │ │ │ └─────────────┤ │ │ │ │ │ │ ┌────▼─────────────▼──────┐ │ │ │ ┌──────────┐ │ │ Service Layer │ │ │ │ │ MCP │◄────────┤ │ tripService / auth │ │ │ │ │ Server │ OAuth │ │ weatherService / etc │ │ │ │ │ (150+ │ 2.1 │ └────────────┬────────────┘ │ │ │ │ tools) │ │ │ │ │ │ └──────────┘ │ ┌────────────▼────────────┐ │ │ │ │ │ better-sqlite3 │ │ │ │ ┌──────────┐ │ │ trek.db (WAL mode) │ │ │ │ │ Addon │ │ └─────────────────────────┘ │ │ │ │ Manager │ └──────────────────────────────┘ │ │ │ Atlas │ │ │ │ Journey │ volumes: │ │ │ Vacay │ ./data/ ← DB + 백업 │ │ │ Collab │ ./uploads/ ← 사진·첨부파일 │ │ └──────────┘ │ └────────────────────────────────────────────────────────────┘ │ │ [브라우저/PWA] [AI 어시스턴트] React + Dexie Claude / 기타 (IndexedDB 오프라인) MCP 클라이언트

핵심 설계 패턴 1 — 실시간 협업 (WebSocket)

TREK의 실시간 협업은 ws 라이브러리 기반 단순 WebSocket으로 구현된다. OT(Operational Transformation)나 CRDT 같은 복잡한 알고리즘 없이, 이벤트 브로드캐스트 방식을 사용한다.

사용자 A가 장소를 이동할 때: A 브라우저 ─────────── 1. REST PUT /api/trips/:id/places/:placeId ← 먼저 DB에 저장 2. 서버: DB 업데이트 완료 3. 서버: 같은 trip을 구독 중인 WebSocket 연결에 이벤트 발송 │ ├──► B 브라우저 수신: { type: "PLACE_MOVED", payload: {...} } └──► C 브라우저 수신: { type: "PLACE_MOVED", payload: {...} } B, C는 수신한 이벤트로 로컬 상태(Zustand store)를 업데이트 → 즉시 UI 반영
비유

이 방식은 구글 독스의 CRDT 방식과 다르다. 구글 독스는 두 사람이 동시에 같은 글자를 수정해도 충돌 없이 합쳐진다. TREK은 "마지막으로 저장한 사람이 이긴다(Last Write Wins)" 방식이다 — 두 사람이 동시에 같은 장소를 이동하면 한 쪽이 덮어씌운다. 여행 플래너 정도의 협업에는 충분하다.

핵심 설계 패턴 2 — 지도 이중화 전략

TREK은 두 가지 지도 엔진을 병렬로 지원한다. API 키 없이 쓸 수 있는 Leaflet(OSM)과, 3D 빌딩/지형이 필요할 때 쓰는 Mapbox GL이다. 사용자가 관리자 패널에서 선택하며, 지도 타일 소스도 직접 설정 가능하다.

엔진비용3D 지원API 키사용 시나리오
Leaflet + OSM무료불필요기본 지도, 루트 표시, 핀 클러스터링
Mapbox GL v3유료(무료 한도)✅ 3D 빌딩/지형필요몰입형 여행 계획, 3D 지형 탐색

핵심 설계 패턴 3 — 인증 레이어 (OIDC + 2FA + 패스키)

로그인 흐름 (OIDC SSO 예시): 사용자 → TREK 로그인 페이지 │ ├─[비밀번호 로그인]─► bcryptjs 해시 검증 → JWT 발급 │ │ │ [2FA 활성화?] → TOTP 코드 확인 │ [패스키?] → WebAuthn 챌린지 │ └─[SSO 버튼 클릭]─► OIDC Discovery URL 조회 → 사용자를 IdP(Google/Keycloak 등)로 리다이렉트 → 인증 완료 후 콜백 URL로 돌아옴 → TREK이 id_token 검증 (oidcService.ts) → 내부 사용자 생성/매핑 → JWT 발급
용어
OIDC (OpenID Connect)
OAuth 2.0 위에 얹은 신원 확인 레이어. Google "구글로 로그인", Keycloak, Authentik, Apple 등이 OIDC 제공자다. TREK은 OIDC_ISSUEROIDC_CLIENT_ID 환경변수만 설정하면 어떤 OIDC 제공자와도 연동된다. 회사 SSO를 그대로 쓸 수 있다는 의미.

5디렉토리 구조 해부

npm workspace 모노레포 구조와 각 폴더의 역할.

TREK/ ← npm workspace 루트 ├── package.json ← 워크스페이스 정의 + 공통 스크립트 ├── Dockerfile ← 멀티스테이지 빌드 (shared→server→client→prod) ├── docker-compose.yml ← 로컬/프로덕션 Docker 설정 ├── charts/ ← Helm Chart (Kubernetes 배포) │ ├── shared/ ← @trek/shared 패키지 │ └── src/ ← 클라이언트+서버 공유 타입, Zod 스키마, 유틸 │ ├── server/ ← @trek/server 패키지 (NestJS) │ └── src/ │ ├── index.ts ← 진입점: NestJS 앱 부트스트랩 │ ├── bootstrap.ts ← Express 앱 설정, 미들웨어, 라우트 등록 │ ├── config.ts ← 환경변수 파싱 (dotenv + 검증) │ ├── websocket.ts ← WebSocket 서버 (ws 라이브러리) │ ├── scheduler.ts ← node-cron 스케줄 작업 (백업, 환율 등) │ ├── addons.ts ← 애드온 시스템 (Atlas, Journey, Vacay 등 on/off) │ ├── db/ ← SQLite DB 계층 │ │ ├── migrations/ ← DB 스키마 마이그레이션 파일들 │ │ └── *.ts ← DB 유틸, 연결, WAL 설정 │ ├── mcp/ ← MCP 서버 (150+ 도구 정의) │ │ └── tools/ ← 기능별 MCP 도구 파일들 │ ├── middleware/ ← 인증, tripAccess, MFA 정책 미들웨어 │ ├── services/ ← 핵심 비즈니스 로직 │ │ ├── tripService.ts ← 여행 CRUD │ │ ├── oidcService.ts ← OIDC 인증 처리 │ │ ├── passkeyService.ts ← WebAuthn 패스키 │ │ ├── weatherService.ts ← Open-Meteo API 연동 │ │ ├── backupService.ts ← 자동 백업 생성/관리 │ │ ├── exchangeRateService ← 다중 통화 환율 │ │ └── notificationService ← 이메일/webhook/ntfy 알림 │ └── nest/ ← NestJS 모듈/컨트롤러 (DI 연결) │ ├── client/ ← @trek/client 패키지 (React SPA) │ └── src/ │ ├── main.tsx ← React 진입점 │ ├── App.tsx ← 라우터 루트 │ ├── pages/ ← 페이지 컴포넌트 (여행목록, 지도, 예산 등) │ ├── components/ ← 재사용 UI 컴포넌트 │ ├── store/ ← Zustand 전역 상태 스토어 │ ├── sync/ ← WebSocket 클라이언트, 실시간 동기화 로직 │ ├── db/ ← Dexie (IndexedDB) 오프라인 DB │ ├── api/ ← Axios API 클라이언트 함수들 │ ├── hooks/ ← React Custom Hooks │ ├── i18n/ ← 20개 언어 번역 파일 │ └── services/ ← 클라이언트 사이드 서비스 (PDF 생성 등) │ ├── wiki/ ← 문서 (설정 가이드 등) ├── docs/ ← 스크린샷, 로고, 타일 이미지 └── scripts/ ← 빌드 보조 스크립트
비유 — npm workspace 모노레포

하나의 git 저장소에 3개의 독립 패키지(shared/server/client)가 같이 산다. npm install을 루트에서 한 번 실행하면 세 패키지의 의존성이 모두 설치된다. @trek/shared를 서버와 클라이언트가 동시에 import하므로 타입 정의를 한 곳에서만 관리한다 — 마치 공용 창고를 두 팀이 함께 쓰는 구조.

6학습 포인트 (기술별)

TREK 코드베이스에서 배울 수 있는 기술과 실습 아이디어.

1. NestJS + Express 아키텍처

NestJS는 Angular에서 영감받은 DI(의존성 주입) 프레임워크다. TREK의 server/src/nest/를 보면 모듈-컨트롤러-서비스 삼층 구조를 실전에서 어떻게 쓰는지 배울 수 있다. 특히 미들웨어 체인(middleware/auth.ts → middleware/tripAccess.ts)이 HTTP 요청을 단계적으로 검증하는 패턴이 교과서적이다.

2. WebSocket 실시간 동기화

server/src/websocket.tsclient/src/sync/가 쌍을 이룬다. "REST로 먼저 저장 → WS로 이벤트 브로드캐스트"라는 낙관적 업데이트 패턴을 배울 수 있다. React Suspense나 SWR 없이 Zustand 스토어를 WebSocket 이벤트로 직접 갱신하는 패턴도 흥미롭다.

3. PWA + 오프라인 전략

Vite에서 Service Worker를 Workbox로 생성하는 설정, Dexie(IndexedDB)로 오프라인 데이터를 캐시하는 패턴, 그리고 오프라인 중 쌓인 쓰기 작업을 온라인 복귀 시 동기화하는 흐름 — 이 세 가지를 TREK 코드에서 통째로 학습할 수 있다.

4. SQLite WAL 모드 + 마이그레이션

server/src/db/에는 SQLite을 WAL(Write-Ahead Logging) 모드로 열어 읽기 성능을 높이는 설정과, 마이그레이션 파일들이 있다. ORM 없이 better-sqlite3로 SQL을 직접 쓰면서도 타입 안전성을 유지하는 방법을 볼 수 있다.

5. MCP 서버 구현

server/src/mcp/AI MCP 서버를 직접 구현하는 실전 사례다. @modelcontextprotocol/sdk로 150개 이상의 도구를 정의하고, OAuth 2.1로 보호하는 전체 흐름을 배울 수 있다. MCP를 배우고 싶은 사람에게 최고의 실전 레퍼런스 중 하나다.

6. OIDC + WebAuthn 인증 스택

패스키(WebAuthn), TOTP 2FA, OIDC SSO를 한 앱에서 동시에 지원하는 코드는 드물다. server/src/services/oidcService.ts, passkeyService.ts, ephemeralTokens.ts를 보면 현대 인증 스택의 전체 그림이 나온다.

7시스템 요구사항 · 설치

자신의 서버에 TREK을 올리기 위한 최소 사양과 설치 명령.

시스템 요구사항

항목최소권장비고
CPU1 vCPU2 vCPU지도 이미지 처리 시 CPU 사용량 증가
메모리512 MB1 GB+Node.js + SQLite 캐시
디스크2 GB20 GB+사진·첨부파일 업로드 공간
OSLinux (Docker)Linux (Docker)macOS/Windows Docker Desktop도 가능
포트300080/443 (리버스 프록시)Nginx/Caddy/Traefik 권장
네트워크없음 (로컬망)외부 도메인 + SSLOIDC·이메일 기능 시 도메인 필요

최소 설치 (Docker 1줄)

ENCRYPTION_KEY=$(openssl rand -hex 32) docker run -d \
  -p 3000:3000 \
  -e ENCRYPTION_KEY=$ENCRYPTION_KEY \
  -v ./data:/app/data \
  -v ./uploads:/app/uploads \
  --name trek \
  mauriceboe/trek

브라우저에서 http://localhost:3000 접속. 첫 부팅 시 관리자 계정이 ADMIN_EMAIL/ADMIN_PASSWORD 환경변수로 생성되며, 미설정 시 컨테이너 로그(docker logs trek)에 출력된다.

Docker Compose (프로덕션 권장)

version: "3.8"
services:
  app:
    image: mauriceboe/trek:latest
    container_name: trek
    read_only: true              # 보안: 컨테이너 파일시스템 읽기전용
    security_opt:
      - no-new-privileges:true   # 권한 상승 차단
    cap_drop:
      - ALL                      # 모든 Linux 능력 제거
    cap_add:
      - CHOWN                    # 파일 소유자 변경만 허용
      - SETUID
      - SETGID
    tmpfs:
      - /tmp:noexec,nosuid,size=128m
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - ENCRYPTION_KEY=${ENCRYPTION_KEY}
      - TZ=Asia/Seoul
      - ALLOWED_ORIGINS=https://trek.example.com
      # SSO 설정 (선택)
      # - OIDC_ISSUER=https://accounts.google.com
      # - OIDC_CLIENT_ID=your_client_id
      # - OIDC_CLIENT_SECRET=your_secret
    volumes:
      - ./data:/app/data
      - ./uploads:/app/uploads
    restart: unless-stopped
함정
ENCRYPTION_KEY 분실 = 데이터 잠김

TREK은 민감 데이터(API 키, OAuth 토큰 등)를 ENCRYPTION_KEY로 암호화한다. 이 키를 분실하면 암호화된 데이터를 복구할 수 없다. 반드시 별도 안전한 곳에 보관하라. openssl rand -hex 32로 생성한 값을 환경변수 파일(.env)에 저장하고 백업하라.

Kubernetes / Helm 설치

helm repo add trek https://mauriceboe.github.io/TREK/
helm install trek trek/trek \
  --set env.ENCRYPTION_KEY=$(openssl rand -hex 32) \
  --set env.TZ=Asia/Seoul

리버스 프록시 (Caddy 예시)

trek.example.com {
    reverse_proxy localhost:3000
    # Caddy가 자동으로 Let's Encrypt TLS 처리
}

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

난이도별 5단계 과제. 개발 환경 없어도 LV.1~2는 바로 시작 가능.

실습 과제

LV.1 — Docker로 TREK 로컬 실행 후 여행 계획 만들기 LV.1 · 입문

Docker Desktop이 설치된 환경에서 TREK을 로컬로 실행하고, 실제 여행 계획을 만들어보자. 지도에 장소를 핀으로 찍고, 일차별로 드래그해서 배치하고, 예산을 입력해본다.

목표: Docker 1줄 명령으로 TREK 실행 → 제주도 3박4일 여행 계획 작성 → PDF로 내보내기
실습 과제

LV.2 — Google OIDC SSO 연동하기 LV.2 · 초급

Google Cloud Console에서 OAuth 2.0 클라이언트를 만들고, docker-compose.ymlOIDC_ISSUER=https://accounts.google.com 등 환경변수를 추가해 "구글로 로그인" 버튼을 활성화한다. OIDC 콜백 URL 설정도 배울 수 있다.

배울 것: OAuth 2.0 클라이언트 등록, redirect_uri 설정, OIDC Discovery 흐름
실습 과제

LV.3 — TREK MCP를 Claude Desktop에 연결하기 LV.3 · 중급

TREK 관리자 패널에서 MCP 애드온을 활성화하고 API 키를 발급한다. Claude Desktop의 MCP 설정에 TREK 서버를 추가해 "다음 달 오사카 2박3일 일정 만들어줘"라고 Claude에게 물으면 실제 TREK에 여행이 생성되는 것을 경험한다.

배울 것: MCP 클라이언트-서버 연결, OAuth 2.1 토큰 발급, AI 도구 호출 흐름
실습 과제

LV.4 — 소스에 새 API 엔드포인트 추가하기 LV.4 · 중상급

TREK 소스를 로컬에서 빌드(npm run dev)하고, NestJS에 새 엔드포인트를 추가해본다. 예: GET /api/trips/:id/stats로 여행별 통계(총 장소 수, 총 예산, 이동 거리)를 반환하는 엔드포인트. 미들웨어 → 컨트롤러 → 서비스 → DB 쿼리 전체 흐름을 직접 짜본다.

배울 것: NestJS 모듈 시스템, better-sqlite3 쿼리, TypeScript 타입 추론
실습 과제

LV.5 — 새 MCP 도구 추가 + PR 기여 LV.5 · 고급

server/src/mcp/tools/에 새 도구를 추가한다. 예: "여행 내 모든 장소의 영업시간을 Google Places API로 업데이트하는 도구". @modelcontextprotocol/sdk의 도구 정의 패턴을 따르고, OAuth 스코프를 적절히 설정해 Claude가 호출할 수 있도록 한다. 완성 시 GitHub PR로 기여해보자.

배울 것: MCP 도구 스키마 정의, Zod 입력 검증, OAuth 스코프 설계, PR 기여 프로세스

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

TREK을 완전히 이해하고 기여하기까지 4주 계획.

주차주제학습 자료 / 실습
1주차Node.js + TypeScript 기초, NestJS 튜토리얼NestJS 공식 First Steps, TypeScript Handbook — 타입, 인터페이스, 데코레이터 집중
2주차React 19 + Zustand, Vite PWA 설정React 공식 튜토리얼, vite-plugin-pwa 문서, Workbox 캐싱 전략 가이드
3주차WebSocket 실시간 통신, SQLite WAL, 인증(JWT/OIDC/WebAuthn)ws 라이브러리 공식 문서, SQLite WAL mode 설명, SimpleWebAuthn 튜토리얼
4주차MCP 프로토콜, Leaflet/Mapbox, Docker 보안 설정MCP 공식 스펙 문서, Leaflet 퀵스타트, Docker 보안 모범 사례(read_only, cap_drop)

10핵심 키워드 사전

TREK 코드베이스를 읽을 때 반드시 알아야 할 용어 모음.

키워드설명
NestJSNode.js용 DI(의존성 주입) 백엔드 프레임워크. Angular 스타일의 모듈-컨트롤러-서비스 구조. Express 위에 올라간다.
SQLite WALWrite-Ahead Logging. SQLite의 쓰기 방식을 바꿔 읽기와 쓰기를 동시에 처리 가능하게 하는 모드. TREK처럼 단일 파일 DB에서 동시 접근 성능을 높인다.
WebSocket (ws)HTTP와 달리 한번 연결하면 서버-클라이언트가 양방향으로 지속 통신. TREK 실시간 협업의 핵심 채널.
ZustandReact용 경량 전역 상태 관리 라이브러리. Redux보다 코드가 훨씬 간결하며 훅 기반.
Leaflet오픈소스 자바스크립트 지도 라이브러리. OpenStreetMap 타일을 무료로 사용 가능. TREK의 기본 지도 엔진.
Mapbox GLWebGL 기반 3D 지도 렌더링 라이브러리. 3D 빌딩, 지형, 고성능 벡터 타일. API 키와 사용료 필요.
WorkboxGoogle이 만든 Service Worker 라이브러리. PWA 오프라인 캐싱 전략(Cache-First, Network-First 등)을 간편하게 구현.
DexieIndexedDB(브라우저 내장 DB)를 쉽게 쓰게 해주는 래퍼 라이브러리. TREK 오프라인 로컬 캐시에 사용.
OIDCOpenID Connect. OAuth 2.0 기반 신원 확인 표준. 구글, Keycloak 등 다양한 IdP와 연동 가능.
WebAuthn / 패스키비밀번호 없이 생체인증(지문/얼굴) 또는 보안 키로 로그인. FIDO2 표준 구현.
TOTP 2FATime-based One-Time Password. Google Authenticator 같은 앱으로 생성하는 6자리 시간 기반 OTP.
MCP (Model Context Protocol)AI가 외부 도구/데이터에 표준 방식으로 접근하는 Anthropic 제안 프로토콜. TREK은 150+ 도구를 OAuth 2.1로 보호해 노출.
npm workspace하나의 저장소에 여러 패키지를 관리하는 Node.js 기능. TREK: shared/server/client 세 패키지가 공존.
ZodTypeScript 우선 런타임 스키마 검증 라이브러리. 타입과 검증이 동시에 정의되어 타입 안전 API 경계를 만든다.
bcryptjs비밀번호 해시 라이브러리. 솔트 기반 해시로 레인보우 테이블 공격 방어. 순수 JS 구현.
KDE Itinerary예약 확인 이메일/PDF에서 항공편·숙박 정보를 자동 추출하는 오픈소스 도구. TREK이 선택 의존성으로 지원.
AGPL-3.0GNU Affero GPL. 소스 수정 후 네트워크로 서비스하면 수정 소스도 공개해야 하는 강한 카피레프트 라이선스.

11참고 링크

공식 문서와 관련 기술 학습 자료.

자료링크설명
TREK GitHubgithub.com/mauriceboe/TREK소스코드, 이슈, 릴리스 노트
TREK 라이브 데모demo.liketrek.com계정 없이 직접 체험 가능
Docker Hubhub.docker.com/r/mauriceboe/trek공식 이미지, 릴리스 태그
TREK Discorddiscord.gg/NhZBDSd4qW커뮤니티, 개발자 소통
NestJS 공식 문서docs.nestjs.comFirst Steps, 미들웨어, DI 가이드
MCP 공식 문서modelcontextprotocol.ioMCP 프로토콜 스펙, SDK 가이드
Leaflet 공식leafletjs.com지도 라이브러리 튜토리얼 및 API
SimpleWebAuthnsimplewebauthn.dev패스키 서버·클라이언트 구현 가이드
vite-plugin-pwavite-pwa-org.netlify.appVite PWA 설정, Workbox 전략
SQLite WAL 모드sqlite.org/wal.htmlWAL 동작 원리 공식 문서