바이브코딩, 로컬에선 되는데 배포하면 왜 안 될까

바이브코딩 배포에서 자꾸 막히는 이유는 대부분 환경변수, 빌드 오류, 서버 기능 차이에서 옵니다. 바이브코딩 배포가 로컬과 다르게 동작하는 이유와 가장 현실적인 순서를 단계별로 정리합니다.

집 부엌에서 되던 요리가 가게에서는 안 되는 이유

이 글을 읽으면 알 수 있는 것 3가지

  • 왜 내 컴퓨터에서는 되던 앱이 바이브코딩 배포 후 갑자기 안 되는지
  • 환경변수, 빌드 오류, 서버 기능 차이를 초보자 눈높이로 이해하는 법
  • 바이브코딩 배포를 덜 꼬이게 하는 가장 현실적인 순서

바이브코딩을 하다 보면 꽤 비슷한 순간을 맞이합니다.
내 컴퓨터에서는 분명 잘 돌아갑니다. 화면도 뜨고, 버튼도 눌리고, 데이터도 저장되는 것처럼 보입니다. 그래서 “이제 거의 다 됐다”고 생각합니다.

그런데 막상 바이브코딩 배포를 하고 나면 이상한 일이 벌어집니다.
화면은 뜨는데 저장이 안 되거나, 로그인은 되는데 목록이 비어 있거나, 아예 빌드 단계에서 에러가 납니다. 이때 초보자는 가장 먼저 이렇게 생각합니다.
“분명 내 컴퓨터에서는 됐는데 왜 안 되지?”

이 상황을 가장 쉽게 설명하면 이렇습니다.
집 부엌에서 혼자 요리하던 것과, 실제 가게 주방에서 손님을 받으며 운영하는 것은 완전히 다른 일입니다. 집에서는 익숙한 재료와 도구를 내 마음대로 쓰면 되지만, 가게에서는 재고 관리, 위생, 동선, 주문 흐름, 손님 응대까지 함께 돌아가야 합니다. 앱도 비슷합니다. 로컬은 집 부엌이고, 바이브코딩 배포는 실제 가게입니다. 환경이 바뀌면 문제도 달라집니다.

바이브코딩 MVP를 처음 만들 때 어떤 층위에서 막히는지는 2부 1편 MVP 현실 글에서 이미 다뤘습니다. 이번 글은 그다음 단계, 즉 실제로 바이브코딩 배포를 할 때 왜 꼬이는지를 더 구체적으로 풀어봅니다.

바이브코딩 배포가 갑자기 안 되는 4가지 이유

초보자가 바이브코딩 배포에서 막히는 이유는 대부분 몇 가지로 좁혀집니다.
대표적으로는 환경변수, 빌드 오류, 프런트와 서버 기능의 차이, 배포 환경과 로컬 환경의 차이입니다.

이유 1. 환경변수가 빠졌기 때문이다

바이브코딩 배포에서 가장 흔한 이유입니다.
환경변수는 쉽게 말해 코드에 직접 적으면 안 되는 비밀 정보를 따로 보관하는 방식입니다. 예를 들어 Supabase 프로젝트 URL과 키, 외부 날씨 API 키, 결제 서비스 비밀키 같은 값이 여기에 해당합니다. 이런 값은 로컬에서는 .env.local 파일에 넣고 잘 돌아갈 수 있지만, 바이브코딩 배포 환경에서는 그 값이 자동으로 따라가지 않습니다. 그래서 Vercel 같은 배포 환경에도 별도로 등록해야 합니다. Vercel은 환경변수를 소스코드 밖에서 관리하고 환경별로 다르게 설정할 수 있다고 설명하고 있고, Supabase의 Next.js 튜토리얼도 .env.local에 API URL과 키를 저장하는 예시를 보여줍니다.

즉, 로컬에서는 되는데 바이브코딩 배포 후 안 된다면 가장 먼저 “이 프로젝트가 쓰는 비밀값들이 배포 환경에도 제대로 들어갔는가?”를 확인해야 합니다.

이유 2. 빌드 단계에서 실패했기 때문이다

로컬에서는 개발 서버가 조금 느슨하게 넘어가던 것도, 바이브코딩 배포할 때는 더 엄격하게 검사되곤 합니다.
문법 오류, 타입 오류, 누락된 파일, 잘못된 import 경로 때문에 빌드가 실패할 수 있습니다. Vercel은 배포 전에 빌드 과정을 거치고, 환경변수 변경도 기존 배포에 자동 반영되지 않으며 새로 배포해야 적용된다고 안내합니다.

그래서 “로컬에서 화면은 떴다”가 “실제 바이브코딩 배포도 된다”를 보장하지는 않습니다.
배포는 단순 업로드가 아니라, 다른 환경에서 다시 조립하고 실행해보는 과정에 가깝습니다.

이유 3. 화면만 배포하면 서버 기능도 될 거라고 착각했기 때문이다

이건 바이브코딩 배포 초보자가 정말 자주 하는 오해입니다.
AI가 만들어준 코드에는 단순 UI만 있는 것이 아니라, 데이터 저장, 인증 처리, 외부 API 호출처럼 서버가 필요한 기능까지 들어 있는 경우가 많습니다. 그런데 사용자는 “일단 Vercel에 올렸으니 다 되겠지”라고 생각합니다.

실제로는 그렇지 않습니다.
Vercel은 정적 화면을 배포하는 데도 많이 쓰이지만, 서버사이드 코드는 Vercel Functions 같은 실행 구조가 있어야 합니다. Vercel 공식 문서는 Functions가 서버를 직접 관리하지 않고도 서버사이드 코드를 실행하고, API나 데이터베이스 연결을 처리할 수 있다고 설명합니다.

즉, 앱 화면이 잘 뜬다고 해서 데이터 저장, 인증, 외부 API 호출까지 자동으로 되는 것은 아닙니다.
여기서 많은 사람이 “앱은 떴는데 기능은 안 된다”는 벽을 만납니다.

이유 4. 로컬과 배포 환경의 차이를 구분하지 않았기 때문이다

바이브코딩 배포 환경에서 Supabase를 붙이는 순간 이 차이는 더 선명해집니다. Supabase는 Postgres 기반 데이터베이스, Auth, Storage, REST API 등을 제공하고, Next.js 예제에서는 .env.local에 URL과 키를 저장해 연결하도록 안내합니다.

예를 들어 이런 상황이 생길 수 있습니다.

  • 로컬에서는 저장이 되는데 바이브코딩 배포 후에는 insert가 안 된다
  • 로그인은 되는데 배포된 주소에서는 리디렉션이 꼬인다
  • 사용자별 데이터가 나뉘지 않고 전부 보인다

이때는 단순히 “Supabase가 안 된다”가 아니라 문제를 더 잘게 나눠야 합니다.

  • 환경변수가 빠졌는가
  • API 호출이 실패했는가
  • Auth 리디렉션 설정이 안 맞는가
  • 권한 정책이 잘못됐는가

Supabase는 Redirect URLs 설정과 서버/클라이언트 키 사용 차이도 따로 문서로 안내하고 있습니다. 새 키 체계에서는 publishable key를, 레거시 키 체계에서는 anon/service_role 키 구분을 설명합니다.

바이브코딩 배포가 자꾸 꼬인다면 순서를 바꿔야 한다

이번 글에서 가장 중요한 실전 팁은 이것입니다.
한 번에 다 바이브코딩 배포하려고 하지 말고, 범위를 잘라서 확인해야 합니다.

가장 현실적인 순서는 보통 이렇습니다.

  1. 화면만 먼저 배포해본다
    정적인 화면이 정상적으로 뜨는지 먼저 확인합니다.

  2. 그다음 데이터 연결을 붙인다
    Supabase 같은 DB 연결이 실제 바이브코딩 배포 환경에서도 동작하는지 봅니다.

  3. 그다음 로그인과 권한을 붙인다
    인증과 사용자별 접근 제어는 그다음 단계로 갑니다.

  4. 마지막에 외부 API를 붙인다
    날씨, 결제, 메일 발송 같은 외부 연결은 마지막에 넣는 편이 안전합니다.

이 순서가 좋은 이유는 단순합니다.
문제가 생겼을 때 원인을 좁히기 쉽기 때문입니다. 처음부터 모든 기능을 한꺼번에 올리면, 화면 문제인지, DB 문제인지, 인증 문제인지, 외부 API 문제인지 한 번에 뒤엉켜버립니다.

바이브코딩 배포가 자꾸 꼬인다면,
한 번에 다 올리려 하지 말고

  1. 화면만 먼저 배포
  2. 데이터 연결
  3. 로그인
  4. 외부 API
    순서로 붙이는 편이 훨씬 안전합니다.

AI에게는 이렇게 물어봐야 덜 꼬인다

바이브코딩 배포 단계에서 가장 나쁜 질문은 이런 것입니다.
“배포했는데 안 돼요. 고쳐줘.”

이 말로는 AI도 전체를 흔들 가능성이 큽니다.
대신 문제를 작게 나눠서 물어야 합니다.

예를 들면 이렇게 바꿔 말하는 편이 좋습니다.

로컬에서는 로그인 후 목록이 잘 보이는데,
Vercel에 바이브코딩 배포한 뒤에는 빈 화면만 나온다.
환경 변수 설정, 배포 설정, 인증 리디렉션 문제 중
어디부터 확인해야 할지 순서대로 설명해줘.

또는

화면은 정상적으로 뜬다.
저장 버튼을 누르면 성공 메시지는 뜨는데,
Supabase 테이블에는 데이터가 들어가지 않는다.
원인을 UI, API 호출, DB 권한 문제로 나눠서 점검해줘.

이렇게 질문하면 AI도 “전체 코드를 다시 짜는 방식”보다 “바이브코딩 배포 환경에서 무엇이 빠졌는지 확인하는 방식”으로 움직입니다.

바이브코딩 배포는 ‘세상 밖으로 나오는 관문’이다

초보자는 종종 바이브코딩 배포를 마지막 클릭 한 번처럼 생각합니다.
하지만 실제로 바이브코딩 배포는 단순 업로드가 아니라, 앱이 내 컴퓨터 밖의 세계에서 처음 살아보는 순간에 가깝습니다.

내 로컬 환경에서는 우연히 맞아떨어지던 것들이, 실제 바이브코딩 배포 환경에서는 더 이상 당연하지 않습니다.
환경변수도 챙겨야 하고, 빌드도 통과해야 하고, 서버 기능이 필요한지 아닌지도 구분해야 하고, 인증 리디렉션과 데이터 연결도 다시 점검해야 합니다. Vercel은 Preview와 Production 같은 환경을 분리해 제공하고, 환경변수도 환경별로 다르게 둘 수 있다고 안내합니다.

그래서 바이브코딩 배포는 “끝”이 아니라, 진짜 시작 전 최종 점검 관문에 가깝습니다.

결국 중요한 것은 ‘왜 안 되지?’를 ‘어디가 다르지?’로 바꾸는 것이다

바이브코딩 배포 단계에서 비개발자가 한 단계 성장하는 순간은, 단순히 에러를 없애는 때가 아닙니다.
질문이 바뀌는 순간입니다.

“왜 안 되지?”
에서
“로컬과 바이브코딩 배포 환경 중 어디가 다르지?”
로 바뀌는 순간입니다.

이 질문을 할 수 있으면 배포는 더 이상 공포 구간이 아닙니다.
복잡해 보여도, 하나씩 확인하면 되는 체크리스트가 됩니다.

이 흐름은 바이브코딩 실수 6가지 글에서 말한 보안 실수와도 연결됩니다. 특히 환경변수나 API 키를 코드에 직접 넣는 실수는 바이브코딩 배포 단계에서 더 크게 터집니다. 아직 그 부분이 헷갈린다면 4편을 함께 보는 것이 좋습니다.
반대로 구조가 왜 중요한지 다시 보고 싶다면 바이브코딩 툴 조합법, 노코드와 고민 중이라면 노코드 바이브코딩 비교 글도 함께 읽어보면 흐름이 더 잘 이어집니다.

다음 글에서는 도메인, 서버, DNS, 배포의 역할이 각각 무엇인지, 그리고 “사이트가 안 열려요”라는 막막함을 어디서부터 나눠 봐야 하는지 정리해보겠습니다.