Skip to Content

시스템 아키텍처 (소프트웨어 + 클라우드)

작성일: 2026-02-23 기준: 세컨테이스트 하드웨어 플로우 도면 기반, 방향 A (TouchDesigner 중심)

전체 플로우

━━━ 테이블 (실시간) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ [카메라] → [미니PC / TouchDesigner] ├─ 물체 인식 (음식, 접시, 손) ├─ 리액티브 프로젝션 매핑 ├─ 사운드 반응 └─ 세션 녹화 (영상 + 오디오) ━━━ 식사 완료 시 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ MP4 렌더링 (30~60초 하이라이트) 클라우드 업로드 (S3/R2) 고유 URL 생성 → QR 코드 생성 마지막 테이블에 QR 프로젝션 ━━━ 관람객 스마트폰 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ QR 스캔 → 웹 뷰어 (모바일 최적화) ├─ 내 식사 비주얼 영상 재생 ├─ "저장" 버튼 → 카메라 롤 저장 └─ "인스타 스토리 공유" 버튼

하드웨어 구성 (도면 기반)

노드역할연결
Main Visual Server무거운 비주얼 처리Ethernet → HUB
Ethernet GIGA Switching HUB중앙 네트워크CAT.6E
테이블 미니PCTouchDesigner 제어 서버Ethernet → HUB, HDMI → 프로젝터
Depth IR Camera Sensor음식/접시/사용자 인식Ethernet → 미니PC
Laser Projector테이블 프로젝션 매핑HDMI ← 미니PC
Speaker오디오 출력← 미니PC

테이블 위 설치 구조물: 미니PC + 단초점 레이저 프로젝터 + 카메라 센서 일체형 (구조물 디자인 예정)


1. 테이블 (TouchDesigner 미니PC)

TouchDesigner가 카메라 입력 → 물체 인식 → 프로젝션 매핑 → 녹화까지 단일 머신에서 처리.

역할기술비고
물체 인식YOLOv8 (Python Script CHOP)커스텀 학습 모델 (음식/접시)
프로젝션 매핑TD Kantan Mapper / Stoner테이블 면 캘리브레이션
세션 녹화TD Movie File Out TOP실시간 프로젝션 화면 캡처
하이라이트 생성Python (moviepy)핵심 장면 30~60초 편집
업로드 트리거TD → Python subprocess식사 종료 감지 시 실행
메인 서버 통신OSC over Ethernet비주얼 데이터 IN/OUT

장점

  • 카메라 → 인식 → 매핑 레이턴시 최소화 (단일 머신)
  • TouchDesigner가 프로젝션 매핑에 이미 최적화
  • 미디어아트/전시 업계 표준 도구

2. 클라우드 + API

통신 흐름

미니PC 클라우드 │ │ │ POST /sessions │ ├──────────────────────────→│ 세션 생성 → 고유 ID 발급 │ │ │ PUT /sessions/{id}/video │ ├──────────────────────────→│ MP4 업로드 (presigned URL) │ │ │ GET /sessions/{id}/qr │ ├──────────────────────────→│ QR 코드 이미지 반환 │ │ │ QR을 테이블에 프로젝션 │ │ │

기술 선택

레이어기술이유
API 서버Next.js API Routes웹 뷰어와 API 한 프로젝트로 관리
파일 저장Cloudflare R2전송(egress) 비용 무료, S3 호환 API
DBSupabase (PostgreSQL)세션 메타데이터, 만료 관리
호스팅VercelNext.js 배포 최적화
QR 생성서버사이드 qrcode 라이브러리URL → PNG 즉시 생성

세션 데이터 모델

sessions ├─ id (UUID) ├─ table_number (int) ├─ created_at (timestamp) ├─ expires_at (timestamp, +7일) ├─ video_url (string, R2 presigned) ├─ video_duration (int, 초) ├─ status (uploading | ready | expired) └─ metadata (json, 인식된 음식 목록 등)

3. 모바일 웹 뷰어

secondtaste.app/s/{session-id} ┌──────────────────────────┐ │ │ │ ┌──────────────────┐ │ │ │ │ │ │ │ 내 식사 영상 │ │ │ │ (자동 재생) │ │ │ │ │ │ │ └──────────────────┘ │ │ │ │ 2026.02.23 · 테이블 3 │ │ 세컨테이스트 │ │ │ │ ┌────────┐ ┌────────┐ │ │ │ 저장 │ │ 공유 │ │ │ └────────┘ └────────┘ │ │ │ │ ┌──────────────────┐ │ │ │ 인스타 스토리 공유 │ │ │ └──────────────────┘ │ │ │ └──────────────────────────┘

인스타그램 공유 구현

방법동작호환성
Web Share API (1순위)네이티브 공유 시트 → 인스타 선택iOS Safari, Android Chrome
카메라 롤 저장 + 안내 (폴백)영상 다운로드 → “인스타에서 공유하세요” 안내전 기기
// Web Share API 예시 async function shareToInstagram() { const response = await fetch(videoUrl); const blob = await response.blob(); const file = new File([blob], 'secondtaste.mp4', { type: 'video/mp4' }); if (navigator.canShare?.({ files: [file] })) { await navigator.share({ files: [file], title: '세컨테이스트에서의 나의 식사', }); } else { // 폴백: 다운로드 downloadVideo(); } }

4. 세션 수명 관리

항목설정
영상 보관 기간7일 (이후 자동 삭제)
QR 유효 기간7일
만료 안내웹 뷰어에 “D-3” 등 카운트다운 표시
정리Cron job 또는 R2 lifecycle rule

5. 기술스택 요약

테이블 TouchDesigner + YOLOv8 + Python 통신 OSC (테이블 간) / HTTPS (클라우드) 클라우드 API Next.js API Routes (Vercel) 파일 저장소 Cloudflare R2 DB Supabase (PostgreSQL) 웹 뷰어 Next.js (같은 프로젝트) QR 생성 서버사이드 qrcode 라이브러리 인스타 공유 Web Share API + 폴백 다운로드

6. 바이브코딩 복잡도 판단

전체 시스템을 영역별로 나누었을 때, AI 보조 코딩(바이브코딩)으로 직접 구현 가능한 범위와 전문 협업이 필요한 범위:

바이브코딩 가능 (약 40%)

영역난이도비고
웹 뷰어 (Next.js)쉬움표준 CRUD + 영상 재생 + 공유 버튼. Cursor/Claude Code로 충분
클라우드 API쉬움presigned URL 업로드, QR 생성. 레퍼런스 풍부
Supabase + R2 연동쉬움SDK 문서 잘 되어 있고 AI가 잘 알고 있는 영역
세션 만료 관리쉬움Cron + lifecycle rule

전문 협업 필요 (약 60%)

영역난이도비고
TouchDesigner 비주얼노드 기반이라 직관적이지만, AI가 TD를 잘 모름. 커뮤니티/튜토리얼 의존
YOLOv8 물체 인식커스텀 데이터셋 라벨링 + 학습 + TD 통합. 전문 지식 필요
카메라 캘리브레이션물리적 세팅 + 좌표 변환 수학. 코드만으론 해결 안 됨
프로젝션 매핑 캘리브레이션물리 환경 의존, 현장 반복 튜닝 필요
TD ↔ Python 통합TD의 Python Script CHOP 특수 환경. 일반 Python과 다름

현실적 역할 분담 제안

본인 (바이브코딩) 미디어아트 엔지니어 ├─ 웹 뷰어 전체 ├─ TouchDesigner 비주얼 ├─ 클라우드 API ├─ YOLOv8 모델 학습 ├─ Supabase DB ├─ 카메라 캘리브레이션 ├─ QR 생성 ├─ 프로젝션 매핑 ├─ 인스타 공유 ├─ TD ↔ Python 통합 └─ 세션 관리 └─ TD → 클라우드 업로드 연동

TD 쪽에서 클라우드로 MP4를 업로드하는 인터페이스(Python 스크립트)만 합의하면, 웹/클라우드 파트는 독립적으로 개발 가능.