바이브코딩 · 심화 핸즈온 워크북

웹사이트 클릭을 명령어 한 줄
— gh · Vercel · Supabase CLI 연동

시간 약 90분
준비물 한 사이클(폴더→배포)을 한 번이라도 끝낸 프로젝트, 안티그래비티, GitHub·Vercel·Supabase 계정
만들 것 편집기를 떠나지 않고 push→배포→DB까지 명령어로
오늘의 약속. 지금까지는 github.com·vercel.com·supabase.com에 브라우저로 접속해 버튼을 눌렀습니다. 오늘은 그 클릭들을 명령어(CLI)로 대체합니다. 외우진 않습니다 — 처음 한 번 로그인만 내 손으로, 나머지는 안티그래비티에게 부탁하고 결과만 눈으로 확인합니다. 끝나면 "저장→배포→DB반영"이 편집기 안에서 한 흐름으로 돌아갑니다.

0큰 그림 — CLI가 뭐고 왜 배우나 8분

지금까지 배포는 이런 식이었죠. 브라우저 열기 → github.com 접속 → 파일 드래그 → vercel.com 접속 → Import 클릭 → Deploy 클릭 → supabase.com 접속 → 테이블 클릭… 사이트 세 곳을 왔다 갔다 하는 게 일이었습니다. 오늘은 이걸 줄입니다.

전화기 비유

웹사이트(버튼 클릭) = 볼일이 있을 때마다 회사 건물까지 직접 걸어가서 창구에 줄 서기. 확실하지만 느리고, 매번 같은 길을 반복합니다.

CLI(명령어) = 그 회사에 바로 연결되는 전용 전화기. 소파에 앉아 "이거 처리해줘" 한마디면 끝. 익숙해지면 걸어가는 것보다 훨씬 빠릅니다.

오늘 우리는 전화기 세 대를 설치합니다. gh(GitHub 전화기) · vercel(Vercel 전화기) · supabase(Supabase 전화기).

CLICommand Line Interface, 우리말로 "명령줄 도구"입니다. 각 서비스 회사가 "우리랑 통화하려면 이 전화기 쓰세요" 하고 공식으로 나눠주는 프로그램이에요. 서비스마다 전화기가 따로 있습니다.

오늘의 핵심 한 문장. 명령어를 외우지 않습니다. gh로 저장소 만들고 push해줘처럼 한국어로 부탁하면 안티그래비티가 명령어를 대신 실행합니다. 우리가 직접 하는 건 딱 두 가지 — ① 처음 한 번 로그인(전화기에 내 계정 등록), ② 결과 확인.
왜 굳이 CLI를? 세 가지 이득이 있습니다.
먼저 정직하게 — CLI가 못 하는 것. "로그인"만큼은 AI가 대신 못 합니다. 각 전화기에 내 계정을 처음 등록하는 과정은 브라우저가 열려서 "당신 맞아요?"를 물어보는데, 그 Authorize 버튼은 사람이 눌러야 하거든요. 그래서 오늘 §2·§3·§4의 첫 로그인은 내 손으로 합니다. 한 번 해두면 그 다음부터는 AI가 알아서 씁니다.

1전화기 세 대 설치 — gh · vercel · supabase 12분

전화기를 쓰려면 먼저 내 컴퓨터에 깔아야 합니다. 세 개를 한 번에 확인하고 설치하겠습니다. 설치 방법은 운영체제(Mac / Windows)마다 다른데, 그 판단도 AI에게 맡깁니다.

1-1. 세 전화기 설치 상태 확인 + 없는 것 설치8분

안티그래비티에서 내 프로젝트 폴더를 연 상태로, 아래를 채팅창에 붙여넣습니다.

내 컴퓨터(운영체제 먼저 확인해줘)에 아래 세 개가 깔려 있는지 확인해줘.
- GitHub CLI (gh)
- Vercel CLI (vercel)
- Supabase CLI (supabase)

안 깔린 건 내 운영체제에 맞는 공식 방법으로 설치해줘.
명령어는 네가 직접 실행하고, 끝나면 세 개의 버전 번호를 한국어로 정리해서 보여줘.

참고로 AI가 쓰게 될 표준 설치 명령어는 아래와 같습니다. 외울 필요는 없고, "아 이런 걸 실행하는구나" 정도만 보세요.

전화기Mac (Homebrew)Windows
ghbrew install ghwinget install GitHub.cli
vercelnpm i -g vercelnpm i -g vercel
supabasebrew install supabase/tap/supabasescoop install supabase
아래 세 줄을 실행했을 때 모두 버전 숫자가 나오면 설치 성공입니다.
$ gh --version
gh version 2.62.0 ...
$ vercel --version
Vercel CLI 39.x
$ supabase --version
2.x.x
  • command not found → 아직 설치가 안 됐거나 방금 깔아서 인식 전. AI에게 gh(또는 vercel/supabase)가 command not found로 떠. 설치됐는지 다시 확인하고, 됐으면 터미널을 새로 열어야 하는지 알려줘
  • Windows에서 winget·scoop이 없다고 함 → AI에게 내 윈도우에 winget이 없대. 다른 설치 방법으로 gh 깔아줘 (npm으로 까는 방법도 있습니다)
  • Homebrew가 없다고 함(Mac) → AI에게 Homebrew부터 설치해줘. 이건 Mac의 "앱 설치 도우미"입니다.
전화기 = 프로그램, 계정 = 로그인. 지금은 전화기를 것뿐입니다. 아직 내 계정은 등록 안 됐어요. §2·§3·§4에서 각 전화기에 처음 한 번 로그인합니다.

2GitHub 전화기(gh) — 저장소 만들기 + 올리기를 한 방에 18분

복습 → 단축

4회차(웹)에서는 이렇게 했죠. github.com 접속 → New repository → 이름 입력 → Create → 주소 복사 → 편집기로 돌아와 remote 등록 → push. 일곱 단계였습니다.

gh는 이 전부를 명령어 한 줄로 합니다. 저장소 생성 + remote 등록 + push가 동시에요.

2-1. gh에 로그인 (처음 한 번 · 내 손으로)7분

이건 대화형(질문에 답하는 방식)이라 직접 하는 게 편합니다. 안티그래비티 아래쪽 터미널(Terminal) 탭에서 아래를 입력하세요.

$ gh auth login

그러면 몇 가지를 화살표 ↑↓ + 엔터로 고르게 됩니다. 이렇게 답하세요.

물어보는 것고를 답
Where do you use GitHub?GitHub.com
Preferred protocol (프로토콜)HTTPS
Authenticate Git with your credentials?Yes (엔터)
How would you like to authenticate?Login with a web browser

마지막에 여덟 자리 코드(예: AB12-CD34)가 나옵니다. 이걸 복사해두고 엔터를 누르면 브라우저가 열립니다. 그 코드를 붙여넣고 Authorize를 누르면 끝.

터미널에 ✓ Logged in as 내아이디 가 보이면 로그인 성공. 이제 이 컴퓨터에서는 다시 로그인할 일이 거의 없습니다.
브라우저가 안 열리거나 코드 입력에서 막히면 → AI에게 gh auth login 하는데 [여기 화면 그대로] 에서 막혔어. 다음 뭐 눌러?
2-2. 저장소 만들기 + 올리기 한 방에8분

내 프로젝트 폴더가 열린 상태에서, 안티그래비티에 부탁합니다.

이 폴더를 gh로 GitHub에 새 저장소로 올려줘.
- 저장소 이름: [my-project]  ← 내 폴더 이름으로 바꾸기
- 공개 범위: public (나중에 Vercel 무료 연결 위해)
- 저장소 만들면서 remote(origin)로 등록하고, 지금까지의 커밋을 push까지 해줘.
- 아직 커밋이 하나도 없으면 먼저 "처음 시작" 커밋부터 만들어줘.
명령어는 네가 직접 실행하고, 끝나면 저장소 주소를 알려줘.

AI가 실행하는 명령어는 이 한 줄입니다(참고용).

$ gh repo create my-project --public --source=. --remote=origin --push

이 한 줄이 4회차에서 손으로 했던 일곱 단계를 전부 대신합니다.

4회차 웹 방식오늘 gh 방식
github.com에서 New repository 클릭gh repo create
--source=. --push

한 줄로 끝
이름 입력 → Create repository
주소 복사 → git remote add
git push -u origin main
터미널에 https://github.com/내아이디/my-project 주소가 뜨면 성공. AI에게 gh repo view --web 해서 브라우저로 열어줘 하면 실제 올라간 파일을 눈으로 볼 수 있습니다.
  • could not create repository ... already exists → 같은 이름 저장소가 이미 있음. AI에게 이름을 my-project-2로 바꿔서 다시 만들어줘
  • 생성+push를 한 방에 하다 에러가 남 → 두 단계로 나누면 대부분 풀립니다. AI에게 gh로 빈 저장소만 먼저 만들고, 그 다음 git push로 따로 올려줘
  • 인증 만료 메시지 → gh auth login 다시 해줘(§2-1 반복)
이후 저장은 그대로. 저장소가 한 번 만들어진 다음부터는 4회차에서 배운 커밋 → push 리듬이 똑같이 이어집니다. gh는 "처음 저장소 만들 때" 특히 빛나요.

3Vercel 전화기(vercel) — 폴더에서 바로 배포 17분

복습 → 단축

배포 실습편(웹)에서는 vercel.com 접속 → Add New Project → 저장소 Import → Deploy 클릭이었죠.

vercel 명령어는 내 폴더에서 바로 미리보기 배포진짜 공개 배포를 합니다. 고친 걸 빠르게 확인하고 싶을 때 최고입니다.

3-1. vercel 로그인 (처음 한 번 · 내 손으로)4분

터미널에서:

$ vercel login

이메일로 할지 GitHub로 할지 물어봅니다. Continue with GitHub를 고르면 (2-1에서 GitHub 로그인을 해뒀으니) 브라우저가 열리고 Authorize 한 번으로 끝납니다.

터미널에 Congratulations! You are now logged in. 가 보이면 성공.
3-2. 미리보기 배포 — 나만 보는 임시 주소7분

프로젝트 폴더에서 안티그래비티에 부탁합니다.

이 폴더를 Vercel에 배포해줘.
- 처음이면 프로젝트를 새로 연결(link)해줘. (질문이 나오면 기본값 그대로 엔터로 진행)
- 우선 미리보기(preview)로 배포해서, 나오는 주소를 알려줘.
명령어는 네가 실행해줘.

AI가 실행하는 명령어는 그냥 vercel 한 단어입니다. 처음이면 이런 걸 물어봐요(대부분 엔터).

Set up and deploy? Y
Which scope? 내 계정 (엔터)
Link to existing project? N (처음이니까 새로)
Project name / directory기본값 엔터
https://my-project-xxxx.vercel.app 같은 미리보기 주소가 나오면 성공. 이건 "나와 링크 아는 사람만 보는 시연용" 주소입니다.
3-3. 진짜 공개 배포 — production6분

미리보기가 잘 나왔으면, 이제 진짜 공개용 주소로 올립니다.

미리보기 잘 나왔어. 이제 프로덕션(진짜 공개)으로 배포해줘.
$ vercel --prod   # --prod 하나 붙으면 "진짜 공개" 배포
preview vs production 딱 한 줄 정리. vercel = 미리보기(연습·시연) / vercel --prod = 진짜 공개(내 대표 주소). 고칠 때마다 vercel로 확인하고, 확정되면 vercel --prod 하는 리듬입니다.
  • 배포는 됐는데 화면이 에러 → AI에게 vercel logs로 방금 배포 로그 보여주고, 에러 원인 짚어줘
  • 엉뚱한 프로젝트에 연결됨 → AI에게 지금 연결된 Vercel 프로젝트 확인하고, 필요하면 다시 link해줘
보너스 — 환경변수도 명령어로. 배포 실습편에서 Vercel 사이트의 Settings → Environment Variables에 키를 하나씩 손으로 넣었죠. 그것도 명령어로 됩니다.
$ vercel env add NEXT_PUBLIC_SUPABASE_URL     # 값 물어보면 붙여넣기
$ vercel env pull .env.local                 # 반대로, 등록된 값을 내 폴더로 내려받기
env add는 바로 다음 §4의 Supabase 키를 넣을 때 씁니다.

4Supabase 전화기(supabase) — DB를 코드처럼 다루기 20분

왜 CLI가 특히 중요한가

배포 확장편(웹)에서는 supabase.com의 Table Editor에서 마우스로 테이블과 컬럼을 만들었죠. 편하지만 문제가 하나 있습니다 — "내가 언제 뭘 바꿨는지" 기록이 안 남습니다.

supabase CLI는 DB 변경을 마이그레이션 파일로 남깁니다. git 커밋이 "코드의 세이브 포인트"였다면, 마이그레이션은 "데이터베이스의 세이브 포인트"예요. 파일로 남으니 git에 같이 저장되고, 다른 컴퓨터·다른 사람도 그대로 재현할 수 있습니다.

4-1. supabase 로그인 + 내 프로젝트에 연결(link)6분

먼저 로그인(내 손으로):

$ supabase login   # 브라우저가 열려서 접근 토큰을 자동 등록

다음, 내 컴퓨터 폴더를 어느 Supabase 프로젝트에 연결할지 지정합니다. 이때 필요한 게 프로젝트 ref(프로젝트마다 붙는 고유 아이디)예요. supabase.com에서 내 프로젝트 → Settings → General → Reference ID에서 복사하거나, 프로젝트 주소 app.supabase.com/project/여기가-ref 에서 가운데 부분입니다.

이 폴더를 내 Supabase 프로젝트에 연결해줘.
프로젝트 ref는 [여기에 복사한 ref 붙여넣기] 야.
필요하면 supabase init부터 하고, link까지 해줘.
$ supabase link --project-ref [내-프로젝트-ref]
Finished supabase link. 가 보이면 연결 성공. 이제 내 폴더 = 이 DB 담당.
4-2. 마이그레이션으로 방명록 테이블 만들기9분

마우스로 테이블 만드는 대신, "이런 테이블을 만들어라"라는 설계서 파일을 만들고 그걸 원격 DB에 밀어 넣습니다. AI에게 통째로 부탁하는 게 가장 편합니다.

supabase CLI로 방명록(guestbook) 테이블 마이그레이션을 만들어줘.
- 컬럼: name(글쓴이), message(내용), created_at(작성시각, 기본값 지금)
- 보안(RLS)을 반드시 켜고, "누구나 읽기 / 누구나 쓰기" 정책을 넣어줘
- 마이그레이션 파일을 만든 다음, 원격 DB에 push까지 해줘 (supabase db push)
명령어는 네가 실행하고, 만들어진 SQL 파일 내용을 한국어로 설명해줘.

AI가 밟는 두 단계는 이렇습니다.

$ supabase migration new create_guestbook   # 빈 설계서 파일 생성
# → supabase/migrations/XXXX_create_guestbook.sql 안에 아래 SQL 채움
$ supabase db push                           # 원격 DB에 실제 반영

설계서(SQL) 안에는 이런 내용이 들어갑니다. 읽어만 두세요.

create table public.guestbook (
  id bigint generated always as identity primary key,
  name text not null,
  message text not null,
  created_at timestamptz not null default now()
);

alter table public.guestbook enable row level security;  # 보안 ON
create policy "누구나 읽기" on public.guestbook for select using (true);
create policy "누구나 쓰기" on public.guestbook for insert with check (true);
Applying migration ... Finished 이 보이고, supabase.com Table Editor를 새로고침하면 guestbook 테이블이 나타납니다. 마우스로 안 만들었는데 생겼죠? 그게 CLI입니다.
RLS(행 수준 보안)는 꼭 켜세요. Supabase 테이블은 기본이 보안 OFF에 가깝게 동작할 수 있어, 안 켜면 아무나 남의 데이터를 읽고 지울 수 있습니다. 방명록처럼 "누구나"인 경우도 일부러 "누구나 읽기/쓰기" 정책을 명시하는 게 정석입니다. 진짜 서비스라면 정책을 더 좁혀야 하고요.
  • db push가 비밀번호를 물어봄 → 프로젝트 만들 때 정한 DB 비밀번호입니다. 메모 못 찾으면 supabase.com → Settings → Database에서 재설정.
  • project not linked → §4-1의 link가 안 된 것. AI에게 supabase link 다시 해줘. ref는 [ref]
4-3. (프로 팁) 코드에 쓸 타입 자동 생성 + 키 연결5분

마지막으로 두 가지를 붙이면 진짜 풀스택 연결이 완성됩니다.

① 타입 파일 — DB 구조를 코드가 알아듣는 파일로 뽑아둡니다. 그러면 AI가 코드를 짤 때 컬럼 이름 오타 같은 실수가 크게 줍니다.

$ supabase gen types typescript --linked > types/database.types.ts

② 키 연결 — 화면이 DB와 통화하려면 URL과 anon 키가 필요합니다. supabase.com → Settings → API에서 Project URLanon public 키를 복사해, §3의 vercel env add로 넣고 로컬 .env.local에도 둡니다.

Supabase의 Project URL과 anon 키를 아래에 줄게.
- URL: [붙여넣기]
- anon key: [붙여넣기]
이 둘을 NEXT_PUBLIC_SUPABASE_URL / NEXT_PUBLIC_SUPABASE_ANON_KEY 이름으로
Vercel 환경변수에 등록하고, 내 .env.local에도 같은 값을 넣어줘.
그리고 이 키로 방명록을 읽고 쓰는 화면을 만들어줘.
키 규칙 — 절대 금지. .env.localDB 비밀번호·service_role 키GitHub에 올리지 않습니다. .gitignore.env*가 들어 있는지 확인하세요. 화면에 노출돼도 되는 건 NEXT_PUBLIC_이 붙은 anon 키까지입니다.

5세 전화기를 한 흐름으로 — 실전 사이클 10분

이제 진짜 편해지는 순간입니다. 뭔가 고쳤을 때, 사이트 세 곳을 왔다 갔다 하지 않고 한 번의 부탁으로 저장→배포→DB반영까지 끝냅니다.

방금 방명록 기능을 고쳤어. 아래를 한 번에 해줘.
1) 변경사항을 커밋하고 GitHub에 push (gh/git)
2) supabase 마이그레이션이 새로 있으면 원격 DB에 db push
3) Vercel 프로덕션으로 배포 (vercel --prod)
각 단계 결과를 한국어로 한 줄씩 요약해줘. 중간에 에러 나면 멈추고 알려줘.
한눈 비교 — 같은 일, 두 방식
단계예전(웹 클릭)오늘(CLI)
코드 저장github.com 드래그·커밋git push
DB 반영Table Editor 마우스 편집supabase db push
공개 배포vercel.com Import·Deployvercel --prod
걸리는 느낌브라우저 3곳 왕복편집기에서 한 번
여기가 AI 자동화의 진짜 힘입니다. 웹 버튼은 AI가 못 누르지만, 이 세 명령어는 AI가 직접 실행합니다. 그래서 "배포해줘" 한마디면 세 회사에 동시에 전화가 걸립니다. 오늘 배운 세 전화기가 앞으로 만들 모든 프로젝트의 기본 배포 루틴이 됩니다.

오늘의 자가 점검

다 체크됐다면 — 오늘 완성입니다. 이제 여러분은 브라우저 없이 편집기 안에서 서비스를 저장·배포·운영할 수 있습니다. "웹사이트를 손으로 클릭"하던 사람에서 "명령어로 시스템을 부리는" 사람으로 한 칸 올라섰어요.

부록 — 명령어 치트시트 · 용어 · 자주 막히는 곳

세 전화기 핵심 명령어

전화기명령어하는 일
gh
(GitHub)
gh auth login처음 한 번 로그인
gh repo create 이름 --public --source=. --push저장소 생성+등록+올리기 한 방에
gh repo view --web내 저장소를 브라우저로 열기
vercelvercel login처음 한 번 로그인
vercel미리보기(preview) 배포
vercel --prod진짜 공개(production) 배포
vercel env add 이름환경변수(키) 등록
supabasesupabase login처음 한 번 로그인
supabase link --project-ref ref내 폴더를 프로젝트에 연결
supabase migration new 이름DB 설계 변경 파일 만들기
supabase db push변경을 원격 DB에 반영

오늘의 용어

CLI명령줄 도구. 서비스와 통화하는 "전용 전화기". 웹 버튼 대신 명령어로 시킴
로그인
(auth)
전화기에 내 계정을 등록하는 과정. 브라우저 Authorize라 사람이 처음 한 번 직접
link내 컴퓨터 폴더를 특정 원격 프로젝트에 "연결"하는 것 (Vercel·Supabase)
preview /
production
미리보기(연습·시연용 주소) / 프로덕션(진짜 공개 대표 주소). --prod가 차이
마이그
레이션
DB 변경 이력 파일. "데이터베이스의 세이브 포인트". git에 함께 저장돼 재현 가능
RLSRow Level Security(행 수준 보안). 안 켜면 아무나 데이터 접근 가능 — 꼭 켜기
refSupabase 프로젝트 고유 아이디. Settings→General 또는 프로젝트 주소에서 확인
anon 키화면(브라우저)에 노출돼도 되는 공개 키. 비밀 키(service_role)와 구분

자주 막히는 곳

증상해결
command not found (gh / vercel / supabase) 설치 안 됐거나 방금 깔아 인식 전. 터미널을 새로 열고 다시. 그래도 안 되면 AI에게 [이름]이 command not found야. 설치·PATH 확인해줘
로그인 브라우저가 안 열림 터미널에 나온 주소·코드를 직접 복사해 브라우저에 붙여넣기. AI에게 화면을 그대로 보여주며 물어도 됨
gh repo create가 already exists 같은 이름 저장소가 있음. 이름을 바꾸거나, AI에게 빈 저장소만 만들고 git push로 따로 올려줘(2단계로 분리)
vercel 배포 후 화면 에러 AI에게 vercel logs로 방금 배포 로그 보여주고 원인 짚어줘. 대개 환경변수 누락
supabase db push가 비밀번호 요구 프로젝트 만들 때 정한 DB 비밀번호. 모르면 Settings→Database에서 재설정
supabase project not linked link가 안 됨. AI에게 supabase link 다시. ref는 [ref]
실수로 .env를 GitHub에 올림 즉시 해당 키를 재발급(Supabase·Vercel에서). 그 뒤 .gitignore.env* 추가. AI에게 도움 요청
기억할 한 가지. CLI는 "더 어려운 방법"이 아니라 "더 빠른 지름길"입니다. 처음 로그인 세 번만 내 손으로 하면, 그 뒤로는 안티그래비티가 다 부립니다. 막히면 언제나 — 화면을 그대로 복사해서 AI에게 "이거 뭐야?" 하면 됩니다.