Appearance
프로젝트 개요
Canvas는 기획·디자인·개발 단계에서 UI 흐름과 화면 구성을 시각적으로 정리하는 프로토타입 에디터입니다.
저장소 구조, 기술 스택, 주요 설계를 개괄적으로 정리한 문서입니다.
개요
| 항목 | 내용 |
|---|---|
| 개발 기간 | 2026-05-18 ~ 2026-06-01 (활동 8일 · 커밋 22건 · 머지 PR 17건) |
| 상세 이력 | 업데이트 노트 — 일자별 PR·변경 파일·설계 배경 |
| 저장소 | github.com/ToKyun02/canvas |
| 문서 사이트 | canvas-doc.web.app (VitePress, Firebase Hosting) |
| 캔버스 데이터 | PostgreSQL Node 테이블 (워크스페이스별). UI 설정만 localStorage |
기술 스택
프론트엔드 (apps/web)
| 영역 | 기술 |
|---|---|
| UI | React 19, Vite, Tailwind CSS, shadcn/ui |
| 라우팅 | TanStack Router (파일 기반, codegen) |
| 캔버스 | Fabric.js 7 |
| 상태 | Zustand (command 스토어, 노드·뷰포트·영속성 슬라이스) |
| 영속성 | 서버 Node 테이블 + localStorage(UI 설정) |
백엔드 (apps/api)
| 영역 | 기술 |
|---|---|
| API | NestJS 11, Express |
| DB | PostgreSQL 17, Prisma 7 |
| 인증 | Passport — Google OAuth 2.0, JWT(httpOnly 쿠키) |
| 공유 타입 | @repo/api workspace 패키지 |
인프라·품질
| 영역 | 기술 |
|---|---|
| 컨테이너 | Docker Compose (web / api / db) |
| CI | GitHub Actions (레이블, 문서 → Firebase) |
| 코드 품질 | ESLint, Prettier, Husky, lint-staged |
주요 기능·설계
Store-first 캔버스
Fabric.js 객체는 렌더링용 뷰이며, 노드 데이터의 단일 출처는 Zustand nodes입니다. useCanvasNodes, canvasSync, hydrateCanvas가 생성·선택·복원을 담당합니다.
커맨드·단축키
에디터 조작(도구, 줌, 선택, 삭제 등)은 Command 인터페이스와 executeCommand로 통합됩니다. UI와 전역 단축키(useGlobalShortcuts)가 동일한 실행 경로를 사용합니다.
확장 가능한 노드
NodeDefinition과 레지스트리 패턴으로 노드 타입을 선언합니다. 텍스트 노드는 배치·Fabric 동기화·속성 패널과 연동됩니다.
→ 노드 추가하기
뷰포트·레이블
커서 기준 줌(zoomAtPoint), 브라우저 휠 제스처 분리, DOM 기반 노드 레이블(이름 표시·드래그 이동)은 별도 모듈로 분리되어 있습니다.
→ 캔버스 사용법
워크스페이스·서버 저장
Google OAuth 로그인 후 워크스페이스를 생성·선택하고, 캔버스 노드는 PUT /workspaces/:id/nodes로 PostgreSQL에 debounce 저장됩니다. URL은 /canvas/:workspaceId 형식입니다.
인증 API
Google OAuth, Prisma User 모델, JWT 쿠키 세션, GET /users/me 등 사용자 API가 apps/api에 포함되어 있습니다.
→ 백엔드 아키텍처
개발 타임라인
PR·커밋·변경 줄 수 등 상세 내역은 업데이트 노트를 참고하세요.
시스템 구성
설계 원칙과 레이어 구조는 아키텍처 개요에 정리되어 있습니다.
로컬 실행
bash
pnpm install
pnpm --filter web dev # http://localhost:3001
pnpm --filter api dev # http://localhost:3000 (환경 변수 필요)
pnpm docker:dev # Docker Compose 전체 스택환경 변수·DB 마이그레이션: 환경 변수, 로컬 개발.