지금까지 배포는 이런 식이었죠. 브라우저 열기 → github.com 접속 → 파일 드래그 → vercel.com 접속 → Import 클릭 → Deploy 클릭 → supabase.com 접속 → 테이블 클릭… 사이트 세 곳을 왔다 갔다 하는 게 일이었습니다. 오늘은 이걸 줄입니다.
웹사이트(버튼 클릭) = 볼일이 있을 때마다 회사 건물까지 직접 걸어가서 창구에 줄 서기. 확실하지만 느리고, 매번 같은 길을 반복합니다.
CLI(명령어) = 그 회사에 바로 연결되는 전용 전화기. 소파에 앉아 "이거 처리해줘" 한마디면 끝. 익숙해지면 걸어가는 것보다 훨씬 빠릅니다.
오늘 우리는 전화기 세 대를 설치합니다. gh(GitHub 전화기) · vercel(Vercel 전화기) · supabase(Supabase 전화기).
CLI는 Command Line Interface, 우리말로 "명령줄 도구"입니다. 각 서비스 회사가 "우리랑 통화하려면 이 전화기 쓰세요" 하고 공식으로 나눠주는 프로그램이에요. 서비스마다 전화기가 따로 있습니다.
gh로 저장소 만들고 push해줘처럼 한국어로 부탁하면 안티그래비티가 명령어를 대신 실행합니다.
우리가 직접 하는 건 딱 두 가지 — ① 처음 한 번 로그인(전화기에 내 계정 등록), ② 결과 확인.
전화기를 쓰려면 먼저 내 컴퓨터에 깔아야 합니다. 세 개를 한 번에 확인하고 설치하겠습니다. 설치 방법은 운영체제(Mac / Windows)마다 다른데, 그 판단도 AI에게 맡깁니다.
안티그래비티에서 내 프로젝트 폴더를 연 상태로, 아래를 채팅창에 붙여넣습니다.
내 컴퓨터(운영체제 먼저 확인해줘)에 아래 세 개가 깔려 있는지 확인해줘. - GitHub CLI (gh) - Vercel CLI (vercel) - Supabase CLI (supabase) 안 깔린 건 내 운영체제에 맞는 공식 방법으로 설치해줘. 명령어는 네가 직접 실행하고, 끝나면 세 개의 버전 번호를 한국어로 정리해서 보여줘.
참고로 AI가 쓰게 될 표준 설치 명령어는 아래와 같습니다. 외울 필요는 없고, "아 이런 걸 실행하는구나" 정도만 보세요.
| 전화기 | Mac (Homebrew) | Windows |
|---|---|---|
| gh | brew install gh | winget install GitHub.cli |
| vercel | npm i -g vercel | npm i -g vercel |
| supabase | brew install supabase/tap/supabase | scoop 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로 떠. 설치됐는지 다시 확인하고, 됐으면 터미널을 새로 열어야 하는지 알려줘winget·scoop이 없다고 함 → AI에게 내 윈도우에 winget이 없대. 다른 설치 방법으로 gh 깔아줘 (npm으로 까는 방법도 있습니다)Homebrew부터 설치해줘. 이건 Mac의 "앱 설치 도우미"입니다.4회차(웹)에서는 이렇게 했죠. github.com 접속 → New repository → 이름 입력 → Create → 주소 복사 → 편집기로 돌아와 remote 등록 → push. 일곱 단계였습니다.
gh는 이 전부를 명령어 한 줄로 합니다. 저장소 생성 + remote 등록 + push가 동시에요.
이건 대화형(질문에 답하는 방식)이라 직접 하는 게 편합니다. 안티그래비티 아래쪽 터미널(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 내아이디 가 보이면 로그인 성공.
이제 이 컴퓨터에서는 다시 로그인할 일이 거의 없습니다.
gh auth login 하는데 [여기 화면 그대로] 에서 막혔어. 다음 뭐 눌러?
내 프로젝트 폴더가 열린 상태에서, 안티그래비티에 부탁합니다.
이 폴더를 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한 줄로 끝 |
| 이름 입력 → 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로 바꿔서 다시 만들어줘gh로 빈 저장소만 먼저 만들고, 그 다음 git push로 따로 올려줘gh auth login 다시 해줘(§2-1 반복)배포 실습편(웹)에서는 vercel.com 접속 → Add New Project → 저장소 Import → Deploy 클릭이었죠.
vercel 명령어는 내 폴더에서 바로 미리보기 배포와 진짜 공개 배포를 합니다. 고친 걸 빠르게 확인하고 싶을 때 최고입니다.
터미널에서:
$ vercel login
이메일로 할지 GitHub로 할지 물어봅니다. Continue with GitHub를 고르면 (2-1에서 GitHub 로그인을 해뒀으니) 브라우저가 열리고 Authorize 한 번으로 끝납니다.
Congratulations! You are now logged in. 가 보이면 성공.
프로젝트 폴더에서 안티그래비티에 부탁합니다.
이 폴더를 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 같은 미리보기 주소가 나오면 성공.
이건 "나와 링크 아는 사람만 보는 시연용" 주소입니다.
미리보기가 잘 나왔으면, 이제 진짜 공개용 주소로 올립니다.
미리보기 잘 나왔어. 이제 프로덕션(진짜 공개)으로 배포해줘.
$ vercel --prod # --prod 하나 붙으면 "진짜 공개" 배포
vercel = 미리보기(연습·시연) / vercel --prod = 진짜 공개(내 대표 주소).
고칠 때마다 vercel로 확인하고, 확정되면 vercel --prod 하는 리듬입니다.
vercel logs로 방금 배포 로그 보여주고, 에러 원인 짚어줘지금 연결된 Vercel 프로젝트 확인하고, 필요하면 다시 link해줘$ vercel env add NEXT_PUBLIC_SUPABASE_URL # 값 물어보면 붙여넣기 $ vercel env pull .env.local # 반대로, 등록된 값을 내 폴더로 내려받기
env add는 바로 다음 §4의 Supabase 키를 넣을 때 씁니다.
배포 확장편(웹)에서는 supabase.com의 Table Editor에서 마우스로 테이블과 컬럼을 만들었죠. 편하지만 문제가 하나 있습니다 — "내가 언제 뭘 바꿨는지" 기록이 안 남습니다.
supabase CLI는 DB 변경을 마이그레이션 파일로 남깁니다. git 커밋이 "코드의 세이브 포인트"였다면, 마이그레이션은 "데이터베이스의 세이브 포인트"예요. 파일로 남으니 git에 같이 저장되고, 다른 컴퓨터·다른 사람도 그대로 재현할 수 있습니다.
먼저 로그인(내 손으로):
$ 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 담당.
마우스로 테이블 만드는 대신, "이런 테이블을 만들어라"라는 설계서 파일을 만들고 그걸 원격 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입니다.
db push가 비밀번호를 물어봄 → 프로젝트 만들 때 정한 DB 비밀번호입니다. 메모 못 찾으면 supabase.com → Settings → Database에서 재설정.project not linked → §4-1의 link가 안 된 것. AI에게 supabase link 다시 해줘. ref는 [ref]마지막으로 두 가지를 붙이면 진짜 풀스택 연결이 완성됩니다.
① 타입 파일 — DB 구조를 코드가 알아듣는 파일로 뽑아둡니다. 그러면 AI가 코드를 짤 때 컬럼 이름 오타 같은 실수가 크게 줍니다.
$ supabase gen types typescript --linked > types/database.types.ts
② 키 연결 — 화면이 DB와 통화하려면 URL과 anon 키가 필요합니다.
supabase.com → Settings → API에서 Project URL과 anon 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.local과 DB 비밀번호·service_role 키는
GitHub에 올리지 않습니다. .gitignore에 .env*가 들어 있는지 확인하세요.
화면에 노출돼도 되는 건 NEXT_PUBLIC_이 붙은 anon 키까지입니다.
이제 진짜 편해지는 순간입니다. 뭔가 고쳤을 때, 사이트 세 곳을 왔다 갔다 하지 않고 한 번의 부탁으로 저장→배포→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·Deploy | vercel --prod |
| 걸리는 느낌 | 브라우저 3곳 왕복 | 편집기에서 한 번 |
--version이 모두 버전 숫자를 보여준다gh repo create --source=. --push 한 줄로 저장소를 만들고 올려봤다vercel(미리보기)와 vercel --prod(공개)의 차이를 안다db push로 원격 DB에 반영했다.env.local·비밀 키는 GitHub에 올리지 않는다는 걸 안다| 전화기 | 명령어 | 하는 일 |
|---|---|---|
| gh (GitHub) | gh auth login | 처음 한 번 로그인 |
| gh repo create 이름 --public --source=. --push | 저장소 생성+등록+올리기 한 방에 | |
| gh repo view --web | 내 저장소를 브라우저로 열기 | |
| vercel | vercel login | 처음 한 번 로그인 |
| vercel | 미리보기(preview) 배포 | |
| vercel --prod | 진짜 공개(production) 배포 | |
| vercel env add 이름 | 환경변수(키) 등록 | |
| supabase | supabase 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에 함께 저장돼 재현 가능 |
| RLS | Row Level Security(행 수준 보안). 안 켜면 아무나 데이터 접근 가능 — 꼭 켜기 |
| ref | Supabase 프로젝트 고유 아이디. 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에게 도움 요청 |