WOWVote 데모
완성된 코드를 받아 본인 Supabase로 연결하는 실습. DB 셋업의 진짜 경험을 1시간 안에.
오늘 배우는 것: DB의 핵심 동작(INSERT / SELECT / UPDATE), 테이블 설계, RLS, 그리고 "AI로 직접 도구를 만든다"는 경험.
코드를 처음부터 만들지 않고, 이미 완성된 WOWVote 코드를 받아서 본인의 Supabase에 연결해보는 실습이에요. 셋업·연결 과정 자체가 진짜 학습 자산입니다.
📦 GitHub 레포
https://github.com/TeddyChoi-wow/WOWVote
이 레포 안에 모든 가이드 문서가 함께 들어있습니다. Clone 후 SUPABASE_SETUP.md와 WORKSHOP_GUIDE.md를 따라가세요.
🌟 WOWVote가 뭔가요?
WOWVote는 세미나·포럼·시민 워크숍을 위한 익명 Q&A 도구입니다. WOWD.LAB이 만들었고, 누구나 본인 환경에 배포해서 무료로 쓸 수 있어요.
WOWVote는 DB의 핵심 동작 3가지를 모두 경험할 수 있습니다:
- INSERT — 새 질문 작성 시 DB에 저장
- SELECT — 질문 목록 조회 + 좋아요 순 정렬
- UPDATE — 좋아요 클릭 시 카운트 증가
익명 질문함만 만들어도 DB의 3가지 핵심 동작을 다 익힐 수 있어요.
💭 잠깐 — 왜 DB(데이터베이스)가 필요한가요?
DB가 없으면 우리 앱은 "기억상실증 환자"입니다. 누가 무슨 말을 했는지, 어떤 데이터가 있었는지 새로고침 한 번에 다 사라져요.
DB는 그 앱에 "기억"을 달아주는 것입니다. 사용자가 적은 글, 만든 데이터, 누른 좋아요... 모두 저장되어서 다음에 다시 와도 그대로 있어요.
DB 없는 앱 vs DB 있는 앱
| DB 없음 | DB 있음 (Supabase) | |
|---|---|---|
| 새로고침 | 데이터 사라짐 | 그대로 남아있음 |
| 여러 사람 사용 | 각자 따로 데이터, 공유 불가 | 모두 같은 데이터를 봄 |
| 예시 앱 | 계산기, 단순 변환기 | Q&A, 게시판, 회원 관리 |
📋 실습 진행 순서 — 한눈에
1) git clone → 코드 내려받기
2) Supabase 셋업 → 내 DB 만들기
3) config.js 만들기 → 내 키 연결하기
4) 실행 → npx serve .
5) 동작 확인 → 질문 / 좋아요 / 발표자 뷰
핵심 개념 한 줄: 코드는 모두 공통, DB와 키는 "1인 1개".
옆 사람과 질문이 안 섞이는 게 정상이에요. (각자 자기 Supabase를 쓰니까)
🚀 0. 시작 전 준비물
아래 4가지는 실습 시작 전에 미리 깔고 가입해 두세요. 현장에서 설치하면 시간이 많이 듭니다.
npx 명령에 필요)터미널에 node -v 쳤을 때 버전 숫자가 나오면 준비 완료.
📌 Step 1. 코드 내려받기 (5분)
🤔 "터미널이 뭐예요? 어디서 열어요?"
터미널은 컴퓨터에 명령어를 입력하는 창입니다. 검은색 또는 흰색 글자만 있는 화면이에요.
- Windows: 시작 → "Git Bash" 검색 → 실행 (Git for Windows 설치되어 있어야 함)
- Mac:
Cmd + Space→ "터미널" 검색 → 엔터 - 가장 편한 방법: VS Code 안에서 터미널 열기 → 상단 메뉴 Terminal → New Terminal
🤔 "cd가 뭐예요?"
cd는 "Change Directory" — 폴더를 이동하는 명령어입니다.
cd WOWVote— 현재 위치의 WOWVote 폴더로 들어가기cd ..— 부모 폴더로 한 단계 올라가기pwd— 지금 내가 어디 있는지 확인 (Mac/Linux)
🤔 "GitHub Desktop으로 클론했는데 그 폴더로 가는 법?"
GitHub Desktop은 보통 Documents/GitHub/WOWVote에 저장합니다.
가장 쉬운 방법: GitHub Desktop 화면 상단 메뉴 Repository → Open in Terminal 또는 Open in Visual Studio Code 클릭. 자동으로 그 폴더에서 터미널이 열림.
🤔 "터미널에서 명령어 쳤는데 에러가 나요"
command not found→ 도구가 설치 안 됐거나, 다른 터미널이 필요 (Windows는 Git Bash 사용)No such file or directory→ 지금 폴더에 그 파일이 없음.ls로 확인Permission denied→ 권한 문제. Mac은sudo는 쓰지 말고 강사 호출
Claude에게 솔직하게:
방법 A. 터미널 (Git Bash 또는 Terminal)
방법 B. GitHub Desktop (클릭만)
- 브라우저에서 github.com/TeddyChoi-wow/WOWVote 열기
- 오른쪽 위 초록 버튼 "Code" 클릭
- 드롭다운에서 "Open with GitHub Desktop" 클릭
- GitHub Desktop이 자동으로 열림 → "Clone" 클릭
- 저장 위치 확인 → "Clone"
받은 후 — VS Code에서 열기
- VS Code 실행 → File → Open Folder
- 방금 받은
WOWVote폴더 선택 - 좌측 파일 탐색기에서 다음이 보이면 OK:
index.html,present.html— 페이지 파일supabase-schema.sql— DB 셋업용 SQL ⭐SUPABASE_SETUP.md— 클릭 위치까지 짚어주는 셋업 가이드 ⭐WORKSHOP_GUIDE.md— 워크숍 진행 가이드js/config.example.js— 키 설정 템플릿
VS Code에 WOWVote 폴더가 열려 있고, 좌측 탐색기에서 위 파일들이 보이면 OK!
📌 Step 2. 내 Supabase 만들기 (15~20분)
WOWVote 레포의 SUPABASE_SETUP.md 파일에 클릭 위치까지 짚어주는 6단계 가이드가 있습니다. VS Code에서 열어서 그대로 따라가세요.
아래는 핵심 흐름만 요약한 것입니다.
🤔 "Supabase 화면이 가이드 설명과 좀 달라요"
Supabase가 UI를 자주 업데이트해서 메뉴 위치가 살짝 다를 수 있어요. 핵심 메뉴 4개의 아이콘 모양으로 찾는 게 더 안전합니다:
- SQL Editor:
</>아이콘 (꺾쇠 두 개) - Table Editor: 표 또는 격자 아이콘
- Settings: 톱니바퀴(⚙️) 아이콘 — 보통 사이드바 맨 아래
- API: Settings 안의 하위 메뉴 (열쇠 아이콘일 수도)
🤔 "프로젝트가 'Provisioning' 상태에서 안 끝나요"
처음 만들 때 2~3분 걸립니다. 5분 이상 안 끝나면 페이지 새로고침. 그래도 안 되면 새 프로젝트 생성.
🤔 "키 복사가 잘 안 돼요 / 키가 너무 길어요"
anon public 키는 매우 깁니다 (보통 200자 이상, eyJhbGc...로 시작). 복사할 때 함정:
- 드래그로 선택하면 앞·뒤가 잘릴 수 있음 → 화면의 "Copy" 버튼을 꼭 사용
- 붙여넣은 후 앞·뒤 공백·줄바꿈 확인 (있으면 인식 안 됨)
- 키에 점(
.)이 중간에 2~3번 있는 게 정상 — 지우지 마세요
🤔 "SQL 실행했더니 에러가 빨갛게 떠요"
흔한 원인:
- "relation already exists" → 이미 한 번 실행됐음. 무시 OK, 또는 테이블 삭제 후 재실행
- "syntax error" → 복사할 때 일부가 빠짐.
supabase-schema.sql전체 다시 복사 - "permission denied" → 프로젝트 준비가 안 끝남. 5분 더 기다리기
스크린샷보다 정확하게 — Claude에게:
- supabase.com 접속 → 우측 상단 "Start your project" 클릭
- "Sign in with GitHub" 추천 (계정 통합)
- 대시보드에서 "New project" 클릭
※ 처음이면 먼저 Organization 만들기 → 이름 아무거나 (예:
wowdlab), Plan은 Free - 프로젝트 정보 입력:
- Name:
wowvote - Database Password: 자동 생성된 값 옆 Copy 눌러서 어딘가 메모 (다시 못 봐요)
- Region: Northeast Asia (Seoul) ⭐
- Name:
- "Create new project" → 2~3분 대기
이 단계가 DB 학습의 핵심입니다. SQL을 직접 실행해서 테이블·정책을 만듭니다.
- Supabase 왼쪽 메뉴에서 "SQL Editor" 클릭 (
</>아이콘) - "+ New query" 클릭
- VS Code에서
supabase-schema.sql파일 열기 → 전체 선택(Cmd/Ctrl+A) → 복사(Cmd/Ctrl+C) - Supabase 편집창에 붙여넣기(Cmd/Ctrl+V)
- 오른쪽 아래 "Run" 버튼 클릭 (또는 Cmd/Ctrl+Enter)
- 아래에
Success. No rows returned같은 초록 메시지가 뜨면 성공! ✅
SQL이 실행되면서 3개 테이블(sessions/questions/likes) + 인덱스 + 기본 세션 1개 + RLS 정책 6개가 한 번에 만들어졌습니다. 이게 "스키마 정의"의 힘이에요.
메시지 전체를 그대로 복사해서 Claude에게 붙여넣어 주세요. 바로 원인 잡아줍니다.
같은 SQL Editor에서 새 쿼리에 이거 한 줄 넣고 Run:
→ 아래에 1줄이 나오고 code 칸에 default, title에 "WOWVote 기본 세션"이 보이면 완벽해요.
추가로 정책이 다 들어갔는지 보려면:
→ 정책 6개가 보이면 OK.
- 왼쪽 세로 메뉴 맨 아래 "Settings" (⚙️ 톱니바퀴) 클릭
- 설정 하위 메뉴에서 "API" 클릭
- 이 화면에서 두 가지를 복사:
- Project URL (맨 위,
https://....supabase.co형태) → 옆 Copy - Project API keys 섹션의
anonpublic키 → 옆 Copy
- Project URL (맨 위,
같은 화면에 service_role 키도 보이지만, 그건 절대 클라이언트 코드에 넣지 마세요. 우리는 anon public 키만 사용합니다.
📌 Step 3. 내 키 연결하기 (config.js, 5분)
🤔 "cp가 뭐예요?"
cp는 "Copy" — 파일 복사 명령어입니다.
위 명령은 js/config.example.js 파일을 복사해서 js/config.js라는 새 파일을 만들어요. 원본은 그대로 두고요.
💡 명령어 대신 마우스로 하기:
- VS Code 좌측 탐색기에서
js/config.example.js마우스 우클릭 → "Copy" js/폴더 우클릭 → "Paste"- 복사된 파일 우클릭 → "Rename" →
config.js로 변경
🤔 "VS Code에서 config.js가 회색으로 흐릿하게 보여요"
정상입니다. config.js는 .gitignore에 등록되어 있어서 git이 무시하는 파일이에요. 그래서 VS Code 탐색기에서:
- 회색·흐릿하게 표시 — 정상 (git이 추적 안 함)
- 옆에 'I' 표시 — Ignored (무시) 의미
이게 정상이에요. 파일이 사라진 게 아닙니다. 클릭하면 정상적으로 열려요.
🤔 "config.js가 아예 안 보여요"
- VS Code 좌측 탐색기 새로고침: 폴더 옆 새로고침 아이콘 클릭
- 파일이 진짜 안 만들어진 거라면
cp명령어 다시 실행 - 혹시 다른 폴더에 만들어졌나 —
js/폴더 안에 있는지 확인 (루트 아님)
🤔 "키 붙여넣었는데 따옴표가 이상해 보여요"
가장 흔한 함정입니다. 두 종류의 따옴표가 있어요:
- 일반 따옴표:
"'— 코드에서 사용 OK ✅ - 스마트(곱슬) 따옴표:
""''— 코드에서 안 됨 ❌
스마트 따옴표는 워드 같은 곳에서 자동 변환되는 모양이에요. VS Code에서는 그대로 입력하면 일반 따옴표가 나오니까 걱정 마세요. 다만 다른 곳에서 복사해 왔다면 확인:
- 의심되면 따옴표 부분만 직접 다시 타이핑
- 또는 VS Code에서
Ctrl+H(찾아 바꾸기)로"→"로 교체
🤔 "키에 공백·줄바꿈이 끼었어요"
붙여넣을 때 의도치 않게 들어갈 수 있어요. 확인 방법:
키 시작 따옴표 바로 옆에 키 문자가 붙어있어야 해요. 사이에 빈칸·줄바꿈 있으면 제거.
- 각 값이 따옴표 안에 있음
- 값 뒤에 쉼표(,)가 있음
- URL은
https://로 시작,.supabase.co로 끝
VS Code의 터미널(또는 시스템 터미널)을 열어서:
그다음 js/config.js 파일을 VS Code에서 열어 복사한 값을 채워주세요:
js/config.js는.gitignore에 포함되어 git에 올라가지 않습니다anon public키만 사용하세요.service_role키는 절대 넣지 마세요
📌 Step 4. 실행 & 동작 확인 (10분)
🤔 "npx serve . 했더니 뭐가 잔뜩 나와요"
정상이에요. npx는 Node.js 도구 실행 명령어입니다. 처음 쓰면 자동으로 다운로드해서 살짝 오래 걸려요.
정상 출력 예시:
이런 게 나오면 성공. 이 창은 그대로 켜두세요 (닫으면 사이트도 같이 꺼짐).
🤔 "터미널을 끄면 어떻게 되나요?"
사이트가 멈춥니다. 워크숍 동안엔 터미널 창을 그대로 켜두세요. 다 끝나면 터미널 창에서 Ctrl+C로 멈출 수 있어요.
🤔 "주소를 어디에 입력해요?"
크롬·사파리·엣지 같은 브라우저의 주소창에 http://localhost:3000 입력 후 엔터.
🤔 "화면 떴는데 질문 작성이 안 돼요. 에러도 없어요"
가장 어려운 상황입니다. 브라우저 콘솔을 봐야 해요.
- 브라우저에서 F12 누르기 (Mac:
Cmd + Option + I) - 상단 탭에서 "Console" 클릭
- 빨간 글씨(에러)가 있는지 확인
- 빨간 글씨 있으면 → 그대로 복사해서 Claude에게
이게 진짜 중요해요. "에러 없는 것 같은데"라고 느껴도 콘솔에 거의 항상 단서가 있어요.
🤔 "콘솔에 뭐가 너무 많아요. 어디가 에러예요?"
- 빨간색: 에러 (Error) — 이게 문제
- 노란색: 경고 (Warning) — 보통 무시 OK
- 회색·흰색: 일반 로그 — 무시 OK
빨간 글씨만 골라서 보세요. 보통 1~3줄 정도예요.
🤔 "WOWVOTE_CONFIG 미설정 알림이 떠요"
가장 흔한 시작 에러입니다. 원인 3가지:
js/config.js파일을 안 만들었음 → Step 3 다시- 파일은 만들었는데 키가 비어있음 (예시 그대로 둠) → 본인 키로 교체
- 파일을 다른 폴더에 만들었음 → 반드시
js/폴더 안에 있어야 함
🤔 "기본 세션을 찾지 못했어요 에러"
Supabase 스키마 실행이 안 됐거나 일부만 실행된 경우.
- Supabase SQL Editor 열기
SELECT * FROM sessions;실행- 결과가 비어있음 →
supabase-schema.sql다시 전체 복사·실행
🤔 "동작은 안 하는데 에러도 없어요"
가장 막막한 상황. 진단 순서:
- config.js 다시 확인 — URL과 키가 정확한지, 따옴표·쉼표 모양 OK인지
- 브라우저 콘솔 F12 — 정말 에러가 없는지 한 번 더
- Supabase 대시보드 — Table Editor에서 데이터가 실제 들어가는지 확인
- 시크릿 모드로 다시 열기 — 캐시 문제 가능성
- 여기까지 다 했는데도 안 되면 강사 호출
Claude에게:
정적 사이트라 빌드 없이 바로 실행됩니다.
방법 A. 터미널 명령어 (추천)
터미널에 뜬 주소(예: http://localhost:3000)를 브라우저에서 열기.
방법 B. VS Code Live Server
- VS Code 확장에 "Live Server" 설치 (없으면)
- 좌측 탐색기에서
index.html우클릭 - "Open with Live Server" 클릭
index.html을 그냥 더블클릭하면 file:// 프로토콜로 열려서 Supabase 연결이 막힙니다. 반드시 npx serve 또는 Live Server로 열어주세요.
http://localhost:3000/present.html → 큰 화면 발표자 뷰, 5초마다 자동 갱신지금 일어난 일을 정리하면:
- INSERT: 질문 작성이 questions 테이블에 행 추가
- SELECT: 페이지 로드 시 모든 질문을 좋아요 순으로 조회
- UPDATE: 좋아요 클릭이 likes_count를 1 증가시킴
이 3가지가 DB 세계의 핵심입니다. 본인 프로젝트에서도 똑같이 응용 가능해요.
⚠️ 자주 막히는 곳 — 꼭 읽기
| 증상 | 원인 / 해결 |
|---|---|
| "WOWVOTE_CONFIG 미설정" 알림 | config.js를 안 만들었거나 키가 비어 있음. Step 3 다시 |
| 그냥 더블클릭했더니 안 돼요 | index.html을 file://로 열면 안 됨. 반드시 npx serve / Live Server |
| "기본 세션을 찾지 못했어요" | 스키마 실행이 안 됨. supabase-schema.sql을 SQL Editor에서 Run했는지 확인 |
| 빨간 RLS / 정책 에러 | 스키마의 정책 부분이 빠짐. 스키마 전체를 다시 Run |
| 키 어디 있어요? | Supabase Settings > API. anon public만 사용, service_role은 절대 금지 |
| 며칠 뒤 갑자기 안 돼요 | 무료 프로젝트는 미사용 시 일시정지됨. 콘솔에서 Restore로 깨우기 |
에러가 나면 메시지 전체를 복사해서 Claude Code에 이렇게:
📖 코드 읽어보기 (15분, 이해 단계)
동작시켰다면 이제 코드가 어떻게 도는지 봅니다.
js/questions.js— INSERT(질문 작성), SELECT(목록 조회·정렬)가 어디 있는지 찾아보기js/likes.js— 좋아요 중복을 어떻게 막는지 (fingerprint+ UNIQUE 제약)supabase-schema.sql— 테이블 3개의 관계, 인덱스, RLS 정책
- 정렬은 DB에서 할까, 브라우저에서 할까? (힌트:
.order(...)) - 좋아요 숫자는 왜
increment_likes함수로 올릴까? (힌트: 동시에 여러 명이 누르면?)
🔥 변형 도전 — 실습의 진짜 재미
Claude Code에게 이렇게 지시해보세요. 하나씩 시도하는 걸 추천:
변형할 때도 원칙은 같아요: DB(스키마) → 코드 → 테스트 순서.
🚀 더 나아가기 (집에서)
1. 배포해서 진짜 쓰기
WOWVote 레포의 README에 "운영 가이드"가 있습니다. Vercel 배포 + QR 코드 생성까지 안내합니다.
2. B 시나리오 도전 — 진짜 슬라이도 대체재로
호스트 페이지, 행사별 세션 분리, 모더레이션을 추가합니다. Claude Code에게:
🧭 Claude Code 세션을 새로 열 때
대화가 끊겨도 이 프롬프트 하나면 맥락이 복원됩니다:
오늘 셋업한 WOWVote는 단순한 데모가 아닙니다. 본인의 모든 미래 프로젝트에서 응용할 수 있는 "DB 연결의 표준 패턴"이에요. 이 경험이 본인의 진짜 자산입니다.
즐겁게 실습하세요! 막히는 건 당연한 거예요. 에러는 친구입니다. 🙌
— WOWD.LAB