시스템 아키텍처 (소프트웨어 + 클라우드)
작성일: 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 |
| 테이블 미니PC | TouchDesigner 제어 서버 | 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 |
| DB | Supabase (PostgreSQL) | 세션 메타데이터, 만료 관리 |
| 호스팅 | Vercel | Next.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 스크립트)만 합의하면, 웹/클라우드 파트는 독립적으로 개발 가능.