블로그

인쇄 창에서 ‘PDF로 저장’을 고르세요.

AI 기본기

바이브코딩을 시작하는 19장

바이브공장장 지음

차례

1부 · AI와 일하기 시작

1장

터미널, 까만 화면과 친해지기

마우스 대신 글자로 컴퓨터에 명령하는 창. 명령어 몇 개면 바이브코딩 준비가 끝납니다.

  • 1장 카드뉴스 1
  • 1장 카드뉴스 2
  • 1장 카드뉴스 3
  • 1장 카드뉴스 4
  • 1장 카드뉴스 5
  • 1장 카드뉴스 6

바이브코딩을 하다 보면 한 번쯤 까만 화면을 만나게 됩니다. 영화에서 해커가 두드리던 그 화면, 터미널입니다.

겁먹을 필요 없습니다.

1.1어디서 여나요?

  • Mac: Spotlight(⌘ + 스페이스)에서 "터미널" 검색
  • Windows: 시작 메뉴에서 "터미널" 또는 "PowerShell" 검색
  • 코드 에디터(VS Code 등) 안에도 터미널이 들어 있습니다. 실제로는 이쪽을 더 많이 씁니다.

1.2왜 터미널을 쓰나요?

개발 도구들은 대부분 버튼보다 명령어로 움직입니다.

  • 프로젝트 실행: npm run dev
  • 필요한 도구 설치: npm install
  • AI 코딩 도구 실행: claude

Claude Code2장도 터미널에서 쓸 수 있습니다. 데스크톱 앱으로 시작하더라도, 터미널이 익숙해지면 할 수 있는 일이 훨씬 넓어집니다.

1.3이것만 알면 됩니다

코드
pwd           지금 내가 있는 폴더 보기
ls            이 폴더에 뭐가 있는지 보기
cd 폴더이름    폴더 안으로 들어가기
cd ..         한 단계 위 폴더로 나가기
mkdir 이름     새 폴더 만들기
clear         화면 정리하기

명령어를 치고 Enter를 누르면 실행됩니다. 아무 결과도 나오지 않아도 대부분 "잘 됐다"는 뜻입니다.

1.4시간 아끼는 요령

  • Tab 키: 폴더 이름을 앞 글자만 치고 Tab을 누르면 나머지를 채워 줍니다. 오타가 확 줄어요.
  • 위쪽 화살표: 방금 친 명령어를 다시 불러옵니다.
  • Ctrl + C: 실행 중인 프로그램을 멈춥니다. 개발 서버를 끌 때 씁니다. Mac에서도 Command가 아니라 Ctrl입니다.
  • 폴더 끌어다 놓기: Mac에서는 터미널 창에 폴더를 끌어다 놓으면 경로가 자동으로 입력됩니다.

1.5조심할 것

  • 인터넷에서 복사한 명령어, 특히 sudo 가 붙은 명령어는 무슨 뜻인지 AI에게 먼저 물어보세요. sudo는 관리자 권한으로 실행한다는 뜻입니다.
  • 에러 메시지19장가 나와도 컴퓨터가 망가진 게 아닙니다. 빨간 글씨는 "왜 안 됐는지 알려 주는 메모"입니다.

1.6AI에게 이렇게 말해 보세요

  • “이 명령어가 무슨 뜻인지 설명해 줘: (명령어 붙여 넣기)”
  • “터미널에 이런 에러가 났어. 무슨 뜻이야? (에러 붙여 넣기)”
  • “내 프로젝트 폴더로 이동하려면 뭐라고 쳐야 해?”

2장에서는 AI와 대화하며 코딩하는 도구, Claude Code를 시작해 보겠습니다.

1부 · AI와 일하기 시작

2장

Claude Code 시작하기, 터미널 속 AI 동료

채팅창에 코드를 복사해 붙이던 방식은 이제 그만. 내 프로젝트 폴더 안에서 직접 일하는 AI를 만나 봅니다.

  • 2장 카드뉴스 1
  • 2장 카드뉴스 2
  • 2장 카드뉴스 3
  • 2장 카드뉴스 4
  • 2장 카드뉴스 5
  • 2장 카드뉴스 6

지금까지는 AI에게 코딩을 시키려면 채팅창에 코드를 복사해 붙이고, 답변을 다시 복사해 파일에 붙여 넣어야 했습니다. Claude Code는 이 과정을 없앱니다. 내 프로젝트 폴더 안에서 파일을 직접 읽고, 고치고, 명령어를 실행하는 AI입니다.

2.1채팅 AI와 무엇이 다른가요?

  • 채팅 AI: 내가 보여 준 코드 조각만 압니다. 결과를 옮기는 건 내 몫입니다.
  • Claude Code: 프로젝트 전체를 스스로 둘러봅니다. 여러 파일을 한 번에 고치고, 테스트를 돌려 보고, 실패하면 다시 고칩니다.

2.2시작하는 방법

가장 쉬운 방법은 Claude 데스크톱 앱입니다. 바이브공장장 수업도 이 방법으로 시작합니다.

  • 1단계: Claude 데스크톱 앱을 설치하고 Claude 계정으로 로그인합니다. Code 탭을 쓰려면 유료 요금제가 필요하니, 요금제는 공식 안내를 확인하세요.
  • 2단계: Code 탭을 열고 작업할 프로젝트 폴더를 고릅니다.
  • 3단계: 평소 말투로 요청합니다.

터미널에 익숙하다면 공식 문서의 설치 안내를 따라 설치한 뒤, 프로젝트 폴더에서 claude 를 입력해도 됩니다. 두 방법의 차이는 3장3장에서 다룹니다.

코드
cd my-project
claude

2.3알아 두면 좋은 기능

  • 허락 받고 움직입니다: 파일을 고치거나 명령어를 실행하기 전에 물어봅니다. 무엇을 하려는지 읽어 보고 승인하면 됩니다.
  • CLAUDE.md4장: 프로젝트 규칙을 적어 두는 파일입니다. "답은 존댓말로", "커밋 전에 테스트 실행" 같은 내용을 적어 두면 대화를 새로 시작해도 기억합니다. /init 명령으로 초안을 만들 수 있습니다. 4장에서 자세히 다룹니다.
  • 계획 먼저: 큰 작업은 바로 시키지 말고 "먼저 계획만 세워 줘"라고 하세요. 계획을 확인한 뒤 진행하면 엉뚱한 방향으로 가는 일이 줄어듭니다.
  • Esc: 작업 중에 방향이 틀렸다 싶으면 Esc로 멈추고 다시 말하면 됩니다.

바이브공장장 홈페이지도 Claude Code로 만들고 있습니다. 디자인·화면·서버·검사 역할을 나눈 에이전트, 배포 순서를 적은 스킬9장, 응답이 끝날 때마다 테스트를 돌리는 훅까지 .claude 폴더에 설정해 두었습니다.

2.4처음에 자주 하는 실수

  • 너무 큰 요청: "쇼핑몰 만들어 줘" 한마디보다 "상품 목록 화면부터 만들어 줘"처럼 쪼개는 편이 결과가 좋습니다.
  • 읽지 않고 승인: 무엇을 바꾸는지 보지 않고 계속 승인하면, 나중에 어디서 꼬였는지 찾기 어렵습니다.
  • 저장 없이 시작: 큰 변경 전에는 Git10장으로 저장해 두세요. 되돌릴 수 있어야 마음 놓고 맡길 수 있습니다. Git은 10장에서 다룹니다.

2.5AI에게 이렇게 말해 보세요

  • “이 프로젝트 구조를 초보자에게 설명하듯 알려 줘”
  • “로그인 기능을 만들고 싶어. 바로 코딩하지 말고 계획부터 세워 줘”
  • “방금 바꾼 내용을 쉬운 말로 요약해 줘”

Claude Code는 데스크톱 앱 말고 터미널에서도 쓸 수 있습니다. 3장에서는 데스크톱 앱과 CLI가 어떻게 다른지 알아보겠습니다.

1부 · AI와 일하기 시작

3장

데스크톱 앱과 CLI, 같은 Claude Code 다른 창

Claude 데스크톱 앱의 Code 탭과 터미널의 Claude Code는 무엇이 같고 무엇이 다를까요?

  • 3장 카드뉴스 1
  • 3장 카드뉴스 2
  • 3장 카드뉴스 3
  • 3장 카드뉴스 4
  • 3장 카드뉴스 5
  • 3장 카드뉴스 6

2장2장에서 터미널에 claude 를 입력해 Claude Code를 켜 봤습니다. 그런데 Claude 데스크톱 앱에도 Code 탭이 있습니다. 둘은 다른 프로그램일까요?

결론부터 말하면 같은 Claude Code입니다. 공식 문서에 따르면 터미널, 데스크톱 앱, 웹, IDE 확장이 모두 같은 Claude Code 엔진에 연결됩니다. 창만 다를 뿐, 안에서 일하는 AI는 같습니다.

3.1어디서 쓸 수 있나요?

  • 터미널(CLI): 글자로 대화하는 기본형입니다. 기능이 가장 많습니다.
  • 데스크톱 앱: Claude 앱을 설치하고 Code 탭을 누르면 됩니다. Mac과 Windows를 지원하고, CLI를 따로 설치하지 않아도 됩니다.
  • 웹: 브라우저에서 claude.ai/code 로 접속합니다. 내 컴퓨터에 설치 없이 클라우드에서 작업합니다.
  • IDE 확장: VS Code나 JetBrains 같은 코드 에디터 안에서 씁니다.

3.2무엇이 같나요?

설정을 한 번만 해 두면 어디서든 통합니다. 프로젝트의 CLAUDE.md, .claude 폴더의 설정, 연결해 둔 MCP8장 서버를 모든 화면이 함께 씁니다. 다음 장에서 다룰 CLAUDE.md를 잘 써 두면, 터미널에서든 앱에서든 같은 규칙으로 일합니다.

3.3무엇이 다른가요?

  • 데스크톱 앱: 바뀐 코드(diff)를 눈으로 보며 검토하기 편하고, 여러 작업을 나란히 띄워 둘 수 있습니다. 까만 화면이 낯선 분에게 부담이 적습니다.
  • 터미널(CLI): 명령어 한 줄로 자동화하거나, 다른 도구와 이어 붙이기 좋습니다. 공식 문서도 CLI를 가장 기능이 많은 형태로 소개합니다.

터미널에서 작업하다가 /desktop 을 입력하면 지금 대화를 데스크톱 앱으로 넘겨 이어 갈 수도 있습니다(claude.ai 구독 필요).

3.4초보자는 무엇으로 시작할까요?

  • 터미널이 아직 무섭다면: 데스크톱 앱으로 시작해 AI와 일하는 감을 잡으세요.
  • 자동화나 고급 설정까지 해 보고 싶다면: 터미널도 익혀 두면 좋습니다. 개발 서버 실행, Git10장, 배포 명령을 직접 다룰 수 있게 됩니다.

바이브공장장 수업은 데스크톱 앱으로 진행합니다. 까만 화면에 대한 부담 없이, 바뀐 코드를 눈으로 확인하며 AI와 일하는 감을 잡기 좋기 때문입니다. 터미널이 필요한 순간이 와도 1장1장의 명령어 몇 개면 충분합니다.

3.5AI에게 이렇게 말해 보세요

  • “지금 이 작업을 데스크톱 앱에서 이어서 하려면 어떻게 해?”
  • “이 프로젝트에 설정된 CLAUDE.md와 MCP 서버를 알려 줘”
  • “방금 바꾼 파일들을 하나씩 보여 주면서 설명해 줘”

어디서 쓰든 Claude Code가 가장 먼저 읽는 파일이 있습니다. 4장에서는 AI에게 주는 프로젝트 안내서, CLAUDE.md를 알아보겠습니다.

1부 · AI와 일하기 시작

4장

CLAUDE.md, AI에게 주는 프로젝트 안내서

매번 같은 설명을 반복하지 않도록, AI가 대화를 시작할 때마다 먼저 읽는 파일을 만들어 봅니다.

  • 4장 카드뉴스 1
  • 4장 카드뉴스 2
  • 4장 카드뉴스 3
  • 4장 카드뉴스 4
  • 4장 카드뉴스 5
  • 4장 카드뉴스 6

Claude Code는 새 대화를 시작할 때마다 기억이 비어 있습니다. 어제 "답은 존댓말로 해 줘", "커밋 전에 테스트 돌려 줘"라고 했어도, 오늘 새로 켜면 모릅니다. 매번 같은 설명을 반복해야 할까요?

그래서 CLAUDE.md가 있습니다. 프로젝트 폴더에 두는 안내서로, Claude Code가 대화를 시작할 때마다 가장 먼저 읽습니다. 한 번 적어 두면 매번 말하지 않아도 됩니다.

4.1어디에 두나요?

코드
./CLAUDE.md             이 프로젝트의 규칙 (팀과 함께 씀)
~/.claude/CLAUDE.md     내 모든 프로젝트에 쓰는 개인 규칙
./CLAUDE.local.md       이 프로젝트의 내 개인 메모 (Git에 올리지 않음)
  • 프로젝트 CLAUDE.md는 Git10장에 함께 올려 팀원과 나눕니다.
  • 사용자 전역 파일(~/.claude/CLAUDE.md)은 나만의 습관을 적는 곳입니다. 어느 프로젝트를 열어도 적용됩니다.
  • 여러 파일이 있으면 서로 덮어쓰지 않고 모두 합쳐서 읽습니다. 그러니 서로 어긋나는 규칙이 없게 하세요.

4.2처음 만들기: /init

Claude Code 안에서 /init 을 입력하면, AI가 프로젝트를 둘러보고 실행 명령, 테스트 방법, 코드 규칙을 찾아 CLAUDE.md 초안을 써 줍니다. 이미 파일이 있으면 덮어쓰지 않고 고칠 점을 제안합니다.

언제 하면 좋을까요? /init 은 프로젝트에 있는 파일을 보고 초안을 쓰기 때문에, 빈 폴더에서 하면 적을 내용이 거의 없습니다. 이 순서를 추천합니다.

  • 1단계: PRD6장로 무엇을 만들지 정합니다.
  • 2단계: Claude Code에게 프로젝트 뼈대를 만들게 합니다. 예: "Next.js로 새 프로젝트 만들어 줘"
  • 3단계: 뼈대가 생기면 /init 으로 CLAUDE.md 초안을 만듭니다.
  • 4단계: 기능을 만들다가 같은 설명을 두 번 하게 되면 그때마다 추가합니다.

프로젝트 구조가 크게 바뀌었을 때 /init 을 다시 실행하면, 지금 파일을 바탕으로 고칠 점을 제안해 줍니다.

초안을 받은 뒤에는, AI가 코드만 보고는 알 수 없는 것을 직접 보태세요. "왜 이렇게 하는지", "하면 안 되는 것" 같은 내용입니다.

4.3무엇을 적을까요?

공식 문서의 기준은 간단합니다. "같은 설명을 두 번째 하게 되면 적는다."

  • 실행 명령: "테스트는 npm test, 개발 서버는 npm run dev"
  • 규칙: "커밋 전에 npm run qa 실행", "답은 항상 존댓말"
  • 구조: "API 코드는 src/api 에 둔다"
  • 함정: "이 프로젝트의 Next.js는 최신 버전이라 옛날 방식과 다르다"

4.4짧게 유지하기

CLAUDE.md는 매 대화마다 통째로 읽히기 때문에 길수록 AI의 집중력이 흐려집니다. 공식 문서는 파일 하나를 200줄 이내로 권합니다.

  • 여러 단계로 된 절차(배포 순서 등)는 스킬9장로 옮기세요. 필요할 때만 읽힙니다.
  • 다른 파일을 불러올 수도 있습니다. @README 처럼 @ 뒤에 파일 경로를 쓰면 그 파일 내용이 함께 읽힙니다.
  • "반드시 매번" 지켜야 하는 검사는 CLAUDE.md보다 훅(hook)이 확실합니다. CLAUDE.md는 안내이고, 훅은 자동으로 실행되는 장치입니다.

4.5바이브공장장 홈페이지의 실제 예

이 홈페이지의 루트 CLAUDE.md는 짧습니다. 핵심만 줄이면 이렇습니다.

코드
@AGENTS.md

# 작업 흐름
- 에이전트: layout-designer(디자인) → frontend / backend(구현) → qa(검증)
- 코드를 바꾸면 보고 전에 qa 에이전트를 자동으로 실행
- 자동 점검 3단계: 응답 끝날 때 / 커밋 전 / 푸시 후

첫 줄 @AGENTS.md 는 다른 AI 도구와 함께 쓰는 안내 파일을 불러옵니다. 그리고 운영자의 개인 전역 파일(~/.claude/CLAUDE.md)에는 "항상 존댓말로 답한다" 한 줄이 들어 있습니다. 그래서 어느 프로젝트를 열어도 AI가 존댓말로 답합니다.

4.6잘 안 지켜질 때

  • /context 를 입력하면 지금 읽힌 파일 목록이 보입니다. 내 CLAUDE.md가 빠져 있지 않은지 확인하세요.
  • 규칙을 더 구체적으로 바꾸고, 서로 부딪치는 규칙이 없는지 살펴보세요.
  • /memory 로 파일을 바로 열어 고칠 수 있습니다.

4.7AI에게 이렇게 말해 보세요

  • “CLAUDE.md를 한국어로 바꾸고, 우리가 정한 규칙도 추가해 줘”
  • “방금 알려 준 규칙을 CLAUDE.md에 추가해 줘”
  • “CLAUDE.md에 오래됐거나 서로 부딪치는 규칙이 없는지 점검해 줘”

CLAUDE.md가 "어떻게 일할지"를 알려 준다면, 이제 "무엇을 해 달라고" 잘 말하는 법이 남았습니다. 5장에서는 프롬프트 기본기를 알아보겠습니다.

1부 · AI와 일하기 시작

5장

AI에게 일 잘 시키는 법, 프롬프트 기본기

같은 AI라도 어떻게 부탁하느냐에 따라 결과가 달라집니다. 바로 써먹는 요청의 재료 네 가지.

  • 5장 카드뉴스 1
  • 5장 카드뉴스 2
  • 5장 카드뉴스 3
  • 5장 카드뉴스 4
  • 5장 카드뉴스 5
  • 5장 카드뉴스 6

AI에게 "홈페이지 만들어 줘"라고 하면 그럴듯한 페이지가 나옵니다. 하지만 내가 원하던 것과는 어딘가 다릅니다. AI가 부족해서가 아니라, 내 머릿속 그림을 AI가 볼 수 없기 때문입니다.

프롬프트는 AI에게 하는 부탁입니다.

5.1좋은 요청의 네 가지 재료

1. 목표: 무엇을 만들려는지, 왜 필요한지 2. 맥락: 누가 쓰는지, 지금 어떤 상태인지 3. 조건: 꼭 지켜야 할 것, 하지 말아야 할 것 4. 완료 기준: 어떻게 되면 "끝"인지

예를 들어 볼게요.

코드
아쉬운 요청:
신청 폼 만들어 줘

좋은 요청:
수강 신청 폼을 만들어 줘.
이름, 휴대폰, 이메일을 받고, 모두 필수야.
모바일에서 주로 쓰니까 입력칸을 크게 해 줘.
제출하면 결제 페이지로 넘어가면 완료야.

두 번째 요청은 길지만 AI가 되물을 게 없습니다. 결과도 한 번에 원하는 모습에 가까워집니다.

5.2잘 시키는 요령

  • 한 번에 하나씩: 큰 일은 쪼개서 부탁하세요. 화면 하나, 기능 하나씩 완성해 나가면 문제가 생겨도 어디서 생겼는지 바로 보입니다.
  • 계획 먼저: 복잡한 작업은 "바로 만들지 말고 계획부터 보여 줘"라고 하세요. 계획 단계에서 방향을 고치는 게 다 만든 뒤에 고치는 것보다 훨씬 쉽습니다.
  • 예시 붙이기: 참고할 사이트 캡처, 원하는 데이터 모양(JSON7장 예시), 에러 메시지 원문을 그대로 붙여 넣으세요. 말로 설명하는 것보다 정확합니다.
  • 되묻게 하기: "헷갈리는 게 있으면 먼저 물어봐"라고 덧붙이면, AI가 짐작으로 채우는 대신 질문합니다.

5.3결과가 이상할 때

  • "다시 해 줘" 대신 무엇이 다른지 말하세요. "버튼이 너무 작아. 화면 폭의 절반 정도로"처럼요.
  • 대화가 길어져 엉키면, 새 대화에서 지금까지의 결론만 정리해 다시 시작하는 편이 나을 때가 많습니다.
  • AI가 "완료했습니다"라고 해도 직접 눌러 보세요. 확인은 사람 몫입니다.

5.4AI에게 이렇게 말해 보세요

  • “내 요청에서 빠진 정보가 있으면 먼저 질문해 줘”
  • “이 기능, 바로 만들지 말고 단계별 계획부터 보여 줘”
  • “방금 만든 걸 내가 직접 확인하려면 어디를 눌러 보면 돼?”

요청 하나가 아니라 서비스 전체를 설명해야 할 때는 어떻게 할까요? 6장에서는 AI에게 주는 설계도, PRD를 알아보겠습니다.

1부 · AI와 일하기 시작

6장

PRD, 만들 것을 글로 먼저

서비스 전체를 AI에게 맡기기 전에, 무엇을 누구를 위해 어디까지 만들지 한 장에 적어 봅니다.

  • 6장 카드뉴스 1
  • 6장 카드뉴스 2
  • 6장 카드뉴스 3
  • 6장 카드뉴스 4
  • 6장 카드뉴스 5
  • 6장 카드뉴스 6

5장5장에서 좋은 요청에는 목표, 맥락, 조건, 완료 기준이 필요하다고 했습니다. 기능 하나라면 한 번의 요청으로 충분합니다. 그런데 서비스 전체를 만든다면요? 매번 처음부터 설명할 수는 없습니다.

이때 쓰는 것이 PRD(Product Requirements Document), 제품 요구사항 문서입니다. "무엇을, 누구를 위해, 어디까지 만들지"를 한 장에 적어 둔 글입니다.

6.1바이브코딩에서 특히 중요한 이유

AI는 빈칸을 추측으로 채웁니다. 요청이 모호하면 그럴듯하지만 내가 원하지 않은 기능이 생기고, 필요한 기능은 빠집니다.

  • 방향이 흔들리지 않습니다: 대화가 길어져도 PRD로 돌아와 확인하면 됩니다.
  • 쪼개기 쉬워집니다: 핵심 기능 목록이 곧 작업 순서가 됩니다.
  • "다 됐다"를 판단할 수 있습니다: 완료 기준이 적혀 있으니까요.

6.21페이지 PRD, 다섯 칸이면 충분합니다

1. 문제: 지금 무엇이 불편한가 2. 대상: 누가 쓰는가 3. 핵심 기능: 꼭 있어야 하는 것 (3~5개) 4. 하지 않을 것: 이번엔 만들지 않는 것 5. 완료 기준: 어떻게 되면 "끝"인가

6.3예시: 스터디 모임 출석부

코드
문제: 스터디 출석을 단톡방에서 세다 보니 매번 헷갈린다.
대상: 10명 안팎의 스터디 모임장과 멤버
핵심 기능:
  - 모임장이 날짜별 모임을 만든다
  - 멤버가 휴대폰으로 "출석" 버튼을 누른다
  - 모임장이 날짜별 출석 현황을 본다
하지 않을 것: 회비 결제, 채팅, 앱 설치
완료 기준:
  - 휴대폰 브라우저에서 출석 버튼이 동작한다
  - 같은 날 두 번 출석하면 한 번만 기록된다
  - 배포된 주소로 멤버가 접속할 수 있다

이 정도면 AI가 화면, 데이터 표, 필요한 기술을 스스로 제안할 수 있습니다. 데이터는 Supabase14장에 저장하고, 화면은 Next.js12장로 만드는 식입니다.

6.4AI와 함께 PRD 쓰기

처음부터 잘 쓸 필요 없습니다. 생각나는 대로 말하고, AI에게 정리를 맡기세요.

  • 아이디어를 두세 줄로 말합니다.
  • AI에게 "PRD 다섯 칸으로 정리하되, 모르는 건 먼저 질문해 줘"라고 합니다.
  • 질문에 답하고, "하지 않을 것"을 함께 정합니다.
  • 완성된 PRD를 docs/prd.md 같은 파일로 저장합니다.

6.5PRD에서 작업으로

PRD가 생기면 다음 단계가 자연스럽게 이어집니다.

  • 작업 목록: "이 PRD를 하루 단위 작업으로 쪼개 줘"
  • CLAUDE.md4장 연결: CLAUDE.md에 "기능 설계는 docs/prd.md 를 따른다"라고 적어 두면, 새 대화에서도 AI가 설계도를 알고 시작합니다.
  • 한 번에 하나씩: 작업 목록의 첫 줄부터 만들고, 끝날 때마다 Git10장으로 저장합니다.

바이브공장장 수업도 둘째 날 각자 만들 서비스를 정하고 요구사항을 정리합니다. 2주 뒤 무엇이 완성되어 있을지 수업 초반에 정해 두는 셈입니다.

6.6AI에게 이렇게 말해 보세요

  • “내 아이디어를 PRD 다섯 칸으로 정리해 줘. 모르는 건 먼저 물어봐”
  • “이 PRD에서 첫 버전에 꼭 필요 없는 기능을 골라 줘”
  • “이 PRD를 작업 목록으로 쪼개고, 첫 작업부터 시작하자”

이제 무엇을 만들지 정했으니, AI와 대화할 때 계속 마주칠 언어를 배울 차례입니다. 7장에서는 JSON을 알아보겠습니다.

2부 · AI의 언어와 도구

7장

JSON, 바이브코딩에서 가장 먼저 만나는 글자

중괄호와 따옴표가 가득한 그것. 코드를 몰라도 JSON만 읽을 줄 알면 AI와의 대화가 훨씬 쉬워집니다.

  • 7장 카드뉴스 1
  • 7장 카드뉴스 2
  • 7장 카드뉴스 3
  • 7장 카드뉴스 4
  • 7장 카드뉴스 5
  • 7장 카드뉴스 6

바이브코딩을 시작하면 금방 이런 모양의 글자를 만나게 됩니다.

코드
{
  "name": "바이브공장장",
  "weeks": 2,
  "online": false,
  "tools": ["Claude Code", "Next.js", "Supabase"]
}

이게 JSON(제이슨)입니다. JavaScript Object Notation의 줄임말인데, 이름은 잊으셔도 됩니다.

7.1왜 알아야 하나요?

AI에게 코딩을 맡기면 직접 코드를 쓸 일은 줄지만, JSON은 계속 눈에 띕니다.

  • 설정 파일: package.json, 그리고 다음 장에서 다룰 MCP8장 설정도 JSON입니다.
  • 데이터: 서버가 화면에 보내 주는 데이터, 외부 서비스(API15장)가 돌려주는 응답 대부분이 JSON입니다.
  • 에러 확인: "응답이 이상해요"를 해결하려면 JSON을 읽을 줄 알아야 어디가 틀렸는지 보입니다.

읽을 수만 있으면 AI가 만든 결과를 확인하고, 원하는 걸 정확히 요청할 수 있습니다.

7.2규칙은 딱 여섯 가지

1. { } 중괄호는 "묶음"입니다. 한 가지 대상에 대한 정보를 모읍니다. 2. 안에는 "이름": 값 쌍을 씁니다. 이름은 항상 큰따옴표로 감쌉니다. 3. 쌍과 쌍 사이는 쉼표로 나눕니다. 마지막 쌍 뒤에는 쉼표를 쓰지 않습니다. 4. 값이 글자면 큰따옴표("바이브공장장"), 숫자면 따옴표 없이(2) 씁니다. 5. 참/거짓은 true, false. 값이 없으면 null입니다. 6. [ ] 대괄호는 "목록"입니다. 여러 개를 순서대로 나열합니다.

묶음 안에 묶음을, 목록 안에 묶음을 넣을 수도 있습니다.

코드
{
  "cohort": "10월 1기",
  "students": [
    { "name": "김바이브", "paid": true },
    { "name": "이코딩", "paid": false }
  ]
}

"10월 1기에 학생이 두 명 있고, 김바이브 님은 결제했고 이코딩 님은 아직"이라는 뜻입니다. 코드를 몰라도 읽히죠?

7.3자주 하는 실수 세 가지

  • 마지막 쉼표: "paid": true, } 처럼 끝에 쉼표가 남으면 에러가 납니다.
  • 작은따옴표: 'name' 은 안 됩니다. JSON은 큰따옴표만 씁니다.
  • 주석: JSON 안에는 // 메모 를 쓸 수 없습니다.

7.4AI에게 이렇게 말해 보세요

  • “이 JSON이 무슨 뜻인지 한 줄씩 설명해 줘”
  • “이 JSON에서 문법 오류 찾아서 고쳐 줘”
  • “회원 정보를 JSON 예시 3개로 만들어 줘”

특히 마지막처럼 예시 데이터를 JSON으로 먼저 만들어 달라고 하면, 화면을 만들 때 어떤 데이터가 오갈지 AI와 내가 같은 그림을 보게 되어 결과물이 훨씬 정확해집니다.

8장에서는 JSON 설정 몇 줄로 Claude에게 새로운 도구를 쥐여 주는 MCP를 알아보겠습니다.

2부 · AI의 언어와 도구

8장

MCP, AI에게 손과 발을 달아 주는 방법

대화만 하던 AI가 브라우저를 열고 DB를 조회합니다. 그 연결 규칙이 MCP입니다.

  • 8장 카드뉴스 1
  • 8장 카드뉴스 2
  • 8장 카드뉴스 3
  • 8장 카드뉴스 4
  • 8장 카드뉴스 5
  • 8장 카드뉴스 6

AI에게 "우리 DB에 신청자가 몇 명이야?"라고 물으면 어떻게 될까요? 기본 상태의 AI는 DB에 들어갈 방법이 없어서 대답하지 못합니다. 아는 건 많지만 손발이 없는 셈입니다.

MCP(Model Context Protocol)는 AI에게 손과 발을 달아 주는 약속입니다. Anthropic이 2024년 말에 공개한 개방형 표준으로, 지금은 여러 AI 도구가 함께 쓰고 있습니다.

8.1USB-C를 떠올리면 쉽습니다

  • AI 쪽(Claude Code 같은 프로그램)은 MCP라는 단자를 하나 가지고 있고,
  • 각 서비스(DB, 브라우저, 캘린더, 디자인 툴 등)는 MCP 서버라는 "케이블"을 제공합니다.

꽂기만 하면 AI가 그 서비스의 기능을 도구처럼 꺼내 씁니다.

8.2실제로 이렇게 씁니다

바이브공장장 홈페이지도 MCP를 쓰며 만들고 있습니다.

  • Supabase14장 MCP: "후기 테이블에 사진 칸 추가해 줘" → AI가 직접 DB 구조를 바꿉니다.
  • Playwright MCP: "신청 페이지 모바일 화면 확인해 줘" → AI가 브라우저를 열어 캡처하고 깨진 곳을 찾습니다.

사람은 말로 요청하고, AI는 MCP로 연결된 도구 중 알맞은 것을 골라 실행합니다.

8.3연결은 JSON 몇 줄

7장7장의 JSON이 여기서 등장합니다. Claude Code에서는 프로젝트 폴더의 .mcp.json 파일에 연결할 서버를 적습니다. 모양은 대략 이렇습니다.

코드
{
  "mcpServers": {
    "playwright": {
      "command": "npx",
      "args": ["@playwright/mcp@latest"]
    }
  }
}

터미널에서 claude mcp add 명령으로 추가해도 됩니다. 서버마다 설치 방법이 조금씩 다르니, 서비스의 안내 문서를 AI에게 보여 주고 "이거 연결해 줘"라고 하는 게 가장 빠릅니다.

8.4주의할 점

  • 권한: MCP로 연결하면 AI가 그 서비스에서 실제로 행동합니다. 운영 DB처럼 중요한 곳은 읽기 전용으로 연결하거나, 실행 전에 꼭 확인을 거치세요.
  • 출처: 아무 MCP 서버나 설치하지 말고, 서비스 공식 서버나 믿을 만한 곳의 것을 쓰세요.

8.5AI에게 이렇게 말해 보세요

  • “Supabase MCP를 이 프로젝트에 연결하는 방법 알려 줘”
  • “지금 연결된 MCP 서버와 쓸 수 있는 도구 목록 보여 줘”
  • “이 MCP 서버가 공식 서버인지 확인해 줘”

MCP가 AI에게 도구를 준다면, 9장의 Skills는 AI에게 일하는 방법을 가르칩니다.

2부 · AI의 언어와 도구

9장

Skills, AI에게 우리만의 일하는 방식을 가르치기

매번 같은 설명을 반복하고 있다면, 그 설명을 스킬로 만들어 두세요.

  • 9장 카드뉴스 1
  • 9장 카드뉴스 2
  • 9장 카드뉴스 3
  • 9장 카드뉴스 4
  • 9장 카드뉴스 5
  • 9장 카드뉴스 6

AI에게 일을 시키다 보면 같은 말을 반복하게 됩니다. "배포할 때는 이 순서로, 환경변수는 이렇게, 끝나면 이걸 확인해." 매번 설명하기도 번거롭고, 내가 깜빡 빠뜨리면 AI도 빠뜨립니다.

Skills(스킬)는 이런 설명을 파일로 적어 두고, 필요할 때 AI가 스스로 꺼내 읽게 하는 기능입니다.

9.1스킬은 폴더 하나, 문서 하나

스킬의 핵심은 SKILL.md라는 문서 하나입니다. Claude Code에서는 프로젝트의 .claude/skills/스킬이름/SKILL.md 위치에 둡니다.

코드
---
name: deploy
description: 사이트를 배포하거나 배포 설정을 바꿀 때 사용
---
1. 배포 전에 npm run qa 로 테스트를 통과시킨다.
2. 환경변수는 대시보드에서만 바꾼다.
3. 배포 후 주요 페이지가 열리는지 확인한다.

맨 위 --- 사이의 name과 description은 스킬의 이름표이고, 그 아래가 실제 매뉴얼입니다. 필요하면 참고 문서나 스크립트를 같은 폴더에 함께 넣을 수 있습니다.

9.2필요할 때만 꺼내 읽습니다

AI는 평소에 스킬의 이름표만 알고 있다가, 요청이 설명과 맞으면 그때 본문을 읽습니다. "배포해 줘"라고 하면 deploy 스킬을 펼쳐 보고 적힌 순서대로 일하는 식입니다. 그래서 스킬을 여러 개 만들어 두어도 AI가 헷갈리지 않습니다. /deploy 처럼 이름을 직접 불러 실행할 수도 있습니다.

9.3MCP, CLAUDE.md와 무엇이 다른가요?

  • MCP8장는 도구입니다. AI가 DB나 브라우저 같은 바깥 세상에 손을 뻗게 해 줍니다.
  • Skills는 노하우입니다. 그 도구를 언제, 어떤 순서로, 무엇을 조심하며 쓸지 알려 줍니다.
  • CLAUDE.md4장는 매번 읽는 안내서입니다. 항상 지킬 짧은 규칙은 CLAUDE.md에, 가끔 필요한 긴 절차는 스킬에 둡니다.

둘은 함께 쓸 때 가장 좋습니다. 바이브공장장 홈페이지도 Supabase MCP로 DB에 연결하고, 보안 점검 스킬에 "결제·개인정보 코드를 바꾸면 이 항목들을 확인한다"를 적어 두었습니다.

9.4첫 스킬 만들기

어렵게 시작할 필요 없습니다. AI와 작업하다가 같은 설명을 두 번째 하게 되면 이렇게 말해 보세요.

코드
"방금 설명한 순서를 스킬로 만들어 줘"

AI가 SKILL.md를 써 줍니다. 한번 읽어 보고 빠진 부분만 보태면, 다음부터는 한마디로 같은 품질의 결과를 받을 수 있습니다.

JSON으로 데이터를 읽고, MCP로 도구를 연결하고, Skills로 일하는 방식을 가르친다. 이 셋이면 AI와 함께 일하는 기본기는 갖춘 셈입니다.

3부에서는 AI가 마음껏 고쳐도 안심할 수 있게 해 주는 안전장치부터 시작합니다. 10장에서는 Git을 알아보겠습니다.

3부 · 코드 관리

10장

Git, 언제든 되돌릴 수 있는 저장

AI가 코드를 망가뜨려도 괜찮습니다. 잘 되던 시점으로 돌아가면 되니까요.

  • 10장 카드뉴스 1
  • 10장 카드뉴스 2
  • 10장 카드뉴스 3
  • 10장 카드뉴스 4
  • 10장 카드뉴스 5
  • 10장 카드뉴스 6

AI에게 코드를 맡기다 보면 이런 순간이 옵니다. 잘 되던 화면이 이것저것 고치다 보니 망가졌는데, 어디서부터 틀렸는지 모르겠는 순간. 이때 필요한 게 Git입니다.

Git은 코드의 "세이브 포인트"를 만드는 도구입니다.

10.1파일명_최종_진짜최종 대신

Git 없이 버전을 관리하면 이렇게 됩니다.

코드
홈페이지_최종.zip
홈페이지_최종_수정.zip
홈페이지_진짜최종.zip

Git은 폴더 하나에서 모든 변경 기록을 남깁니다. 언제, 무엇을, 왜 바꿨는지 한 줄 메모와 함께요. 이렇게 한 번 저장하는 것을 커밋(commit)이라고 부릅니다.

10.2꼭 알아야 할 네 단어

  • 저장소(repository): Git이 기록을 관리하는 프로젝트 폴더
  • 커밋(commit): 지금 상태를 메모와 함께 저장하는 것
  • 브랜치(branch): 원래 코드는 그대로 두고 옆길에서 실험하는 것
  • 로그(log): 지금까지의 커밋 기록

명령어로는 이런 모습입니다. 직접 칠 일은 많지 않습니다. AI에게 부탁하면 됩니다.

코드
git status                    무엇이 바뀌었는지 보기
git add .                     저장할 파일 담기
git commit -m "신청 폼 추가"    메모와 함께 저장
git log                       저장 기록 보기

10.3바이브코딩에서 Git이 특히 중요한 이유

Claude Code2장 같은 AI는 한 번에 여러 파일을 고칩니다. 결과가 마음에 안 들 때 되돌릴 수 있어야 과감하게 맡길 수 있습니다.

  • 작업 시작 전에 커밋: "지금 상태 커밋해 줘"
  • 기능 하나를 완성할 때마다 커밋: 작게 자주 저장할수록 되돌리기 쉬워집니다.
  • 이상해지면 비교: "마지막 커밋 이후 바뀐 걸 보여 줘" → 원인을 찾거나 되돌립니다.

바이브공장장 홈페이지는 커밋하기 전에 테스트와 검사가 자동으로 돌도록 설정해 두었습니다. 망가진 코드가 저장되는 걸 한 번 더 막아 주는 장치입니다.

10.4조심할 것

  • 되돌리기 명령 중에는 저장하지 않은 작업까지 지워 버리는 것도 있습니다. AI가 되돌리기를 제안하면 "저장 안 한 변경이 사라지는지" 먼저 물어보세요.
  • 커밋 메모는 나중의 나를 위한 것입니다. "수정" 대신 "신청 폼 휴대폰 검증 추가"처럼 구체적으로 쓰세요.

10.5AI에게 이렇게 말해 보세요

  • “지금까지 바뀐 내용 요약해서 커밋해 줘”
  • “어제 잘 되던 상태로 돌아가고 싶어. 방법 알려 줘”
  • “이 되돌리기, 저장 안 한 작업도 지워져?”

Git은 내 컴퓨터 안의 기록입니다. 11장에서는 이 기록을 인터넷에 올려 보관하고 공유하는 곳, GitHub를 알아보겠습니다.

3부 · 코드 관리

11장

GitHub, 내 코드가 사는 집

Git이 내 컴퓨터 속 기록이라면, GitHub는 그 기록을 인터넷에 보관하고 함께 쓰는 곳입니다.

  • 11장 카드뉴스 1
  • 11장 카드뉴스 2
  • 11장 카드뉴스 3
  • 11장 카드뉴스 4
  • 11장 카드뉴스 5
  • 11장 카드뉴스 6

10장10장의 Git은 내 컴퓨터 안에 기록을 남깁니다. 그런데 노트북이 고장 나면요? 다른 컴퓨터에서 이어서 작업하고 싶다면요? 이때 쓰는 곳이 GitHub입니다.

GitHub는 Git 기록을 인터넷에 올려 두는 서비스입니다. 코드의 클라우드 보관함이자, 여러 사람이 함께 작업하는 작업실입니다.

11.1Git과 GitHub, 뭐가 다른가요?

  • Git: 기록하는 도구. 내 컴퓨터에서 동작합니다.
  • GitHub: 그 기록을 올려 두는 웹사이트. 백업, 공유, 협업을 맡습니다.

11.2기본 흐름: 올리고, 받고

코드
git push     내 컴퓨터의 커밋을 GitHub에 올리기
git pull     GitHub의 최신 내용을 내 컴퓨터로 받기
git clone    GitHub의 프로젝트를 통째로 내려받기

처음 연결하는 과정은 조금 번거롭지만, AI에게 "이 프로젝트를 GitHub 새 저장소로 올려 줘"라고 하면 필요한 단계를 안내하거나 대신 해 줍니다. 로그인처럼 본인이 직접 해야 하는 단계도 있습니다.

11.3GitHub로 할 수 있는 일

  • 백업: 컴퓨터가 고장 나도 코드가 안전합니다.
  • 공개/비공개: 저장소마다 누구에게 보여 줄지 정할 수 있습니다. 개인 프로젝트는 비공개로 시작해도 됩니다.
  • Pull Request: 바꾼 내용을 바로 합치지 않고, 검토를 거쳐 합치는 방법입니다. 혼자 작업할 때도 무엇이 바뀌었는지 한눈에 보기 좋습니다.
  • 자동 검사(GitHub Actions): 코드를 올릴 때마다 테스트와 검사를 자동으로 돌립니다. 바이브공장장 홈페이지도 올릴 때마다 테스트, 타입 검사, 빌드, 보안 점검이 자동으로 돌아갑니다.
  • 자동 배포: Vercel이나 Netlify 같은 배포17장 서비스와 연결하면, GitHub에 올리는 것만으로 사이트가 업데이트되게 할 수 있습니다.

11.4올리기 전에 확인할 것

  • .gitignore: node_modules, .env 같은 파일이 제외되어 있는지 AI에게 확인을 부탁하세요.
  • 라이선스: 남의 코드를 가져다 쓸 때는 라이선스를 확인하세요. 공개되어 있다고 마음대로 써도 되는 건 아닙니다.

11.5AI에게 이렇게 말해 보세요

  • “이 프로젝트를 GitHub 비공개 저장소로 올리는 방법 알려 줘”
  • “올리기 전에 비밀 키나 올리면 안 되는 파일이 없는지 확인해 줘”
  • “지금까지 커밋한 거 GitHub에 올려 줘”

4부에서는 드디어 만들기를 시작합니다. 12장에서는 바이브공장장 수업에서 화면과 서버를 만드는 데 쓰는 도구, Next.js를 알아보겠습니다.

4부 · 만들기

12장

Next.js, 화면과 서버를 한 번에

웹사이트의 보이는 부분과 보이지 않는 부분을 한 프로젝트에서 만드는 도구. 폴더가 곧 주소입니다.

  • 12장 카드뉴스 1
  • 12장 카드뉴스 2
  • 12장 카드뉴스 3
  • 12장 카드뉴스 4
  • 12장 카드뉴스 5
  • 12장 카드뉴스 6

웹사이트는 두 부분으로 나뉩니다. 눈에 보이는 화면(프론트엔드)과, 보이지 않는 곳에서 데이터를 저장하고 처리하는 서버(백엔드)입니다. 예전에는 둘을 따로 만드는 경우가 많았는데, Next.js는 둘을 한 프로젝트에서 만들 수 있게 해 줍니다.

Next.js는 React라는 화면 도구를 바탕으로 한 웹 프레임워크입니다.

12.1폴더가 곧 주소입니다

Next.js의 App Router 방식에서는 app 폴더 안의 폴더 구조가 그대로 사이트 주소가 됩니다.

코드
app/page.tsx              →  사이트.com/
app/blog/page.tsx         →  사이트.com/blog
app/blog/[slug]/page.tsx  →  사이트.com/blog/글주소

"후기 페이지 만들어 줘"라고 하면 AI가 app/reviews/page.tsx 파일을 만드는 식입니다. 파일 위치만 봐도 어떤 페이지인지 알 수 있어서, AI가 만든 코드를 따라가기 쉽습니다.

12.2알아 두면 좋은 개념

  • 컴포넌트: 화면을 이루는 레고 블록입니다. 버튼, 카드, 헤더를 한 번 만들어 두면 여러 페이지에서 다시 씁니다.
  • 서버에서 그리기: Next.js는 화면을 서버에서 미리 만들어 보내는 방식을 기본으로 씁니다. 첫 화면이 빨리 뜨고, 검색 엔진도 내용을 잘 읽습니다.
  • 서버 액션: 폼을 제출했을 때 서버에서 실행할 일을 같은 프로젝트 안에 함수로 적습니다. 비밀 키16장가 필요한 일처럼 브라우저에 보이면 안 되는 일은 서버 쪽에서 처리합니다.

바이브공장장 홈페이지도 Next.js로 만들었습니다. 기수 선택 화면, 신청 폼, 결제 확인, 관리자 페이지가 모두 한 프로젝트 안에 있습니다.

12.3실행해 보기

코드
npm install      필요한 도구 설치 (처음 한 번)
npm run dev      개발 서버 켜기

터미널1장에 나오는 주소(보통 http://localhost:3000)를 브라우저에서 열면 내 사이트가 보입니다. 코드를 고치고 저장하면 화면이 바로 바뀝니다. 끌 때는 터미널에서 Ctrl + C를 누릅니다.

12.4조심할 것

  • 서버와 브라우저 구분: 비밀 키나 관리자 기능은 서버 쪽 코드에만 두세요.
  • 헷갈릴 때: AI에게 "이 코드는 브라우저에서 실행돼, 서버에서 실행돼?"라고 물어보세요.

12.5AI에게 이렇게 말해 보세요

  • “블로그 목록 페이지를 새로 만들어 줘. 주소는 /blog 야”
  • “헤더를 컴포넌트로 빼서 모든 페이지에서 같이 쓰게 해 줘”
  • “이 코드는 어디서 실행돼? 서버야, 브라우저야?”

13장에서는 Next.js로 만든 화면에 옷을 입히는 도구, Tailwind CSS를 알아보겠습니다.

4부 · 만들기

13장

Tailwind CSS, 클래스 이름으로 옷 입히기

CSS 파일을 따로 쓰지 않고, 이름표만 붙여서 화면을 꾸미는 도구입니다.

  • 13장 카드뉴스 1
  • 13장 카드뉴스 2
  • 13장 카드뉴스 3
  • 13장 카드뉴스 4
  • 13장 카드뉴스 5
  • 13장 카드뉴스 6

웹 화면은 크게 두 가지로 만들어집니다. 무엇을 보여 줄지 정하는 뼈대(HTML)와, 어떻게 보일지 정하는 옷(CSS)입니다. 예전에는 옷을 입히려면 CSS 파일을 따로 만들고, 이름을 짓고, 두 파일을 오가며 작업해야 했습니다.

Tailwind CSS는 이 과정을 확 줄여 줍니다. 미리 만들어 둔 스타일 이름표를 요소에 바로 붙이면 끝입니다.

코드
<button className="bg-orange-500 text-white px-6 py-3 rounded-full font-bold hover:bg-orange-600">
  신청하기
</button>

13.1이름표를 읽는 법

  • bg-orange-500: 배경(background)을 주황색으로. 숫자가 클수록 진한 색입니다.
  • text-white: 글자색을 흰색으로.
  • px-6 py-3: 안쪽 여백. x는 좌우, y는 위아래입니다.
  • rounded-full: 모서리를 완전히 둥글게.
  • font-bold: 글자를 굵게.
  • hover:bg-orange-600: 마우스를 올리면 조금 더 진한 주황색으로.

이름만 봐도 뜻이 대충 짐작되죠? 이게 Tailwind의 가장 큰 장점입니다. 코드를 몰라도 읽을 수 있고, AI가 만든 화면을 살짝 고치고 싶을 때 이름표 하나만 바꾸면 됩니다.

13.2자주 쓰는 이름표

  • p-4, m-4: 안쪽 여백(padding), 바깥 여백(margin)
  • text-lg, text-2xl: 글자 크기
  • bg-white, text-gray-700: 배경색, 글자색
  • rounded-xl: 둥근 모서리
  • flex, grid: 요소를 나란히, 또는 격자로 배치
  • gap-4: 나란히 놓인 요소 사이의 간격

숫자는 대부분 "클수록 크게"입니다. p-2보다 p-8이 여백이 넓습니다.

13.3화면 크기별로 다르게

Tailwind는 작은 화면을 먼저 생각합니다. 앞에 아무것도 붙지 않은 이름표는 모든 화면에 적용되고, md:나 lg:를 붙이면 그 크기 이상의 화면에서만 적용됩니다.

코드
<h1 className="text-2xl lg:text-5xl">바이브공장장</h1>

휴대폰에서는 text-2xl, 넓은 데스크톱 화면에서는 text-5xl이 됩니다.

13.4우리 브랜드 색 쓰기

이 홈페이지는 Tailwind v4를 씁니다. v4에서는 CSS 파일 안의 @theme에 브랜드 색을 등록합니다.

코드
@theme {
  --color-orange: #e4583a;
}

이렇게 등록하면 bg-orange, text-orange 같은 이름표가 생깁니다. 브랜드 색을 바꾸고 싶으면 이 한 줄만 고치면 사이트 전체가 바뀝니다. CLAUDE.md4장에 "색은 @theme에 등록한 이름만 쓴다"처럼 적어 두면 AI도 이 규칙을 지킵니다.

13.5자주 하는 실수 세 가지

  • 이름표를 조합해서 만들기: bg-${color}-500처럼 코드로 이름을 이어 붙이면 적용되지 않습니다. Tailwind는 코드 안에 완성된 이름표 글자가 있어야 그 스타일을 만들어 줍니다. bg-red-500, bg-blue-500처럼 통째로 써 두세요.
  • 같은 속성을 두 번: p-4 p-8처럼 겹쳐 쓰면 뒤에 쓴 것이 이기는 게 아닙니다. 결과가 헷갈리니 하나만 남기세요.
  • sm:을 모바일로 착각: sm:은 "작은 화면 이상"이라는 뜻입니다. 모바일 스타일은 아무것도 붙이지 않은 기본 이름표에 쓰세요.

13.6AI에게 이렇게 말해 보세요

  • “신청 버튼을 더 눈에 띄게 바꿔 줘”
  • “모바일에서 제목이 너무 커. 줄여 줘”
  • “이 화면에 쓰인 Tailwind 클래스를 하나씩 설명해 줘”

특히 마지막 요청은 공부에 좋습니다. AI가 만든 화면의 이름표를 설명받다 보면, 어느새 직접 고칠 수 있게 됩니다.

14장에서는 화면 뒤에서 데이터를 저장하고 로그인을 처리하는 Supabase를 알아보겠습니다.

4부 · 만들기

14장

Supabase, DB와 로그인을 한 번에

서버를 직접 만들지 않고도 데이터를 저장하고 회원 기능을 붙일 수 있는 서비스입니다.

  • 14장 카드뉴스 1
  • 14장 카드뉴스 2
  • 14장 카드뉴스 3
  • 14장 카드뉴스 4
  • 14장 카드뉴스 5
  • 14장 카드뉴스 6

화면만 있는 사이트는 새로고침하면 입력한 내용이 모두 사라집니다. 신청서를 받거나 후기를 모으려면 데이터를 어딘가에 저장해야 하는데, 그곳이 데이터베이스(DB)입니다.

예전에는 DB를 쓰려면 서버를 빌리고, DB를 설치하고, 데이터를 주고받는 코드를 직접 짜야 했습니다. Supabase는 이 과정을 웹사이트에서 클릭 몇 번으로 끝내 줍니다.

14.1Supabase가 해 주는 일

  • 데이터베이스: Postgres라는 오래 검증된 DB를 바로 쓸 수 있습니다.
  • 로그인(Auth): 이메일 가입, 소셜 로그인 같은 회원 기능.
  • 파일 저장(Storage): 사진이나 문서 업로드.
  • 자동 API: 표를 만들면 그 표를 읽고 쓰는 창구(API15장)가 자동으로 생깁니다.

14.2표 하나가 데이터 한 묶음

후기를 저장하는 표라면 이렇게 생겼습니다.

코드
표 이름: reviews
칸: author(작성자), rating(별점), body(내용)
줄: 김바이브 · 5 · "생각보다 쉬웠어요"
줄: 이코딩 · 4.5 · "질문에 바로 답해 주셨어요"

Supabase 대시보드의 Table Editor에서는 엑셀처럼 직접 보고 고칠 수도 있습니다.

14.3열쇠는 두 개입니다

Supabase에 접속하려면 열쇠(키)가 필요한데, 종류가 둘입니다.

  • 공개 키(publishable key): 브라우저 코드에 들어가도 되는 키입니다. 대신 아래에서 설명할 규칙(RLS) 안에서만 움직입니다.
  • 비밀 키(secret key): 모든 규칙을 통과하는 만능 키입니다. 서버에서만 쓰고, 절대 화면 코드에 넣으면 안 됩니다.

예전 프로젝트에서는 각각 anon 키, service_role 키라는 이름으로 보일 수도 있습니다. 역할은 같습니다.

14.4RLS, 줄마다 붙는 출입 규칙

RLS(Row Level Security)는 "누가 어떤 줄을 볼 수 있는지" 정하는 규칙입니다. 이 홈페이지의 후기 표에는 이런 규칙이 걸려 있습니다.

코드
create policy "visible reviews are public"
  on reviews for select
  using (visible);

"숨김 처리하지 않은 후기만 누구나 읽을 수 있다"는 뜻입니다. 공개 키로는 이 규칙을 넘을 수 없어서, 숨긴 후기는 아무리 요청해도 보이지 않습니다. 후기를 쓰고 고치는 일은 관리자 화면에서 서버가 비밀 키로 처리합니다.

14.5자주 하는 실수 세 가지

  • RLS를 끈 채로 운영: 공개 키만 있으면 누구나 표 전체를 읽고 고칠 수 있는 상태가 될 수 있습니다. 표를 만들면 RLS부터 켜세요.
  • 비밀 키를 브라우저에: 화면 코드에 들어간 키는 누구나 볼 수 있습니다. 비밀 키는 서버에만 둡니다.
  • RLS만 켜고 규칙은 없음: 에러 없이 빈 결과만 돌아옵니다. "데이터가 안 보여요"의 흔한 원인이니, 정책(policy)부터 확인하세요.

14.6AI에게 이렇게 말해 보세요

  • “후기를 저장할 표 만들어 줘. 작성자, 별점, 내용 칸이 필요해”
  • “이 표에 RLS 켜고, 누구나 읽기만 할 수 있게 정책 만들어 줘”
  • “비밀 키가 브라우저 코드에 들어간 곳이 없는지 확인해 줘”

Supabase MCP8장를 연결해 두면(8장 참고) AI가 표를 직접 만들고 확인까지 해 줍니다.

15장에서는 Supabase처럼 서비스끼리 데이터를 주고받는 창구, API를 알아보겠습니다.

4부 · 만들기

15장

API, 서비스끼리 대화하는 창구

결제, 지도, 날씨, AI까지. 다른 서비스의 기능을 빌려 쓰는 약속이 API입니다.

  • 15장 카드뉴스 1
  • 15장 카드뉴스 2
  • 15장 카드뉴스 3
  • 15장 카드뉴스 4
  • 15장 카드뉴스 5
  • 15장 카드뉴스 6

내 사이트에 결제 기능을 넣고 싶다고 해서 결제 시스템을 처음부터 만들 필요는 없습니다. 이미 잘 만들어진 결제 서비스의 기능을 빌려 쓰면 됩니다. 이때 쓰는 창구가 API(Application Programming Interface)입니다.

15.1식당 주문 창구를 떠올려 보세요

  • 메뉴판 = API 문서: 무엇을 주문할 수 있는지 적혀 있습니다.
  • 주문 = 요청(request): "이걸 해 주세요"
  • 음식 = 응답(response): 결과물. 대부분 JSON7장 형식입니다(7장 참고).
코드
요청:  GET /cohorts
응답:  200 OK
       [{ "title": "10월 1기", "status": "모집중" }]

15.2주문 방법은 네 가지

  • GET: 가져오기. 목록이나 상세 내용을 봅니다.
  • POST: 새로 만들기. 신청서 제출, 글쓰기.
  • PATCH: 고치기. 일부 내용을 수정합니다. (비슷한 PUT도 있지만 처음엔 몰라도 됩니다.)
  • DELETE: 지우기.

15.3응답 번호로 결과 읽기

응답에는 세 자리 번호가 붙습니다. 이것만 읽어도 무슨 일이 있었는지 알 수 있습니다.

  • 200번대: 성공
  • 400: 요청 내용이 잘못됨
  • 401, 403: 권한 없음. 로그인이나 키를 확인하세요.
  • 404: 그런 주소가 없음
  • 500번대: 상대 서버 쪽 문제

15.4실제로는 이렇게 쓰입니다

이 홈페이지의 수강 신청 결제도 API로 동작합니다. 결제창에서 결제를 마치면, 우리 서버가 토스페이먼츠의 승인 API에 "이 결제, 금액이 맞으니 승인해 주세요"라고 요청합니다. 성공 응답을 받은 뒤에야 신청을 완료로 처리합니다.

15.5API 키, 창구의 출입증

대부분의 API는 누가 요청했는지 알기 위해 키를 요구합니다. 키는 출입증이자 결제 카드 같은 것이라, 새어 나가면 남이 내 이름으로 요청을 보낼 수 있습니다. 키를 안전하게 두는 방법은 16장16장에서 자세히 다룹니다.

15.6자주 하는 실수 세 가지

  • 비밀 키를 화면 코드에: 브라우저에서 바로 API를 부르면 키가 그대로 노출됩니다. 비밀 키가 필요한 요청은 서버에서 보내세요.
  • 성공했다고 가정: 응답 번호를 확인하지 않으면, 실패했는데도 "완료"라고 보여 주는 화면이 됩니다.
  • 너무 자주 호출: 반복문 안에서 API를 수백 번 부르면 요청 제한(429)에 걸리거나, 유료 API라면 요금이 늘 수 있습니다.

15.7AI에게 이렇게 말해 보세요

  • “이 API 문서 읽고, 필요한 요청 예시 만들어 줘”
  • “이 응답 JSON이 무슨 뜻인지 설명해 줘”
  • “에러 응답이 오면 사용자에게 안내 문구를 보여 줘”

5부에서는 만든 서비스를 세상에 내놓습니다. 그 첫 단계로, 16장에서는 API 키 같은 비밀 값을 안전하게 보관하는 환경변수를 알아보겠습니다.

5부 · 세상에 내놓기

16장

환경변수와 비밀 키 지키기

API 키를 코드에 그대로 적는 순간 위험해집니다. 열쇠는 코드 밖에 두세요.

  • 16장 카드뉴스 1
  • 16장 카드뉴스 2
  • 16장 카드뉴스 3
  • 16장 카드뉴스 4
  • 16장 카드뉴스 5
  • 16장 카드뉴스 6

앞의 장들에서 계속 "비밀 키는 조심하세요"라고 했습니다. 그럼 비밀 키는 어디에 둬야 할까요? 답은 환경변수입니다.

16.1환경변수가 뭔가요?

코드 밖에 따로 적어 두는 설정값입니다. 코드에는 "SUPABASE_URL이라는 값을 써라"라고 이름만 적고, 실제 값은 별도 파일이나 서버 설정에 둡니다.

Next.js12장에서는 프로젝트 폴더의 .env.local 파일에 적습니다.

코드
# .env.local
SUPABASE_URL=https://xxxx.supabase.co
SUPABASE_SECRET_KEY=sb_secret_...
NEXT_PUBLIC_TOSS_CLIENT_KEY=test_gck_...

코드에서는 process.env.SUPABASE_URL처럼 이름으로 꺼내 씁니다.

16.2왜 코드 밖에 두나요?

  • 코드는 공유됩니다: GitHub11장에 올리고, 팀원과 나누고, AI에게 보여 줍니다. 키가 코드에 있으면 함께 퍼집니다.
  • 환경마다 값이 다릅니다: 내 컴퓨터에서는 테스트 키, 실제 사이트에서는 진짜 키. 코드는 그대로 두고 값만 바꾸면 됩니다.
  • 교체가 쉽습니다: 키를 바꿔야 할 때 코드를 고칠 필요가 없습니다.

16.3NEXT_PUBLIC_, 공개 표시

Next.js에서 이름이 NEXT_PUBLIC_으로 시작하는 환경변수는 브라우저로 전달됩니다. 누구나 볼 수 있다는 뜻입니다.

  • 공개해도 되는 값: 토스 결제위젯의 클라이언트 키처럼, 원래 브라우저에서 쓰도록 만든 키 → NEXT_PUBLIC_을 붙입니다.
  • 비밀 값: Supabase14장 비밀 키, 결제 시크릿 키, 관리자 비밀번호 → 절대 붙이지 않습니다.

16.4.env.local은 GitHub에 올리지 않습니다

.gitignore 파일에 적힌 파일은 Git이 무시합니다. Next.js 프로젝트는 보통 처음부터 .env 파일들이 여기에 들어 있지만, 꼭 한 번 확인하세요.

코드
# .gitignore
.env*

16.5배포할 때는?

.env.local은 내 컴퓨터에만 있으니, 배포17장 서버에는 따로 알려 줘야 합니다. Vercel이나 Netlify 같은 호스팅 서비스는 대시보드에 환경변수 입력 칸이 있고, 직접 운영하는 서버라면 서버의 환경 설정에 넣습니다. 이름은 .env.local과 똑같이 맞추세요.

16.6자주 하는 실수 세 가지

  • 비밀 키에 NEXT_PUBLIC_: 편하려고 붙였다가 키가 전 세계에 공개됩니다.
  • 코드에 직접 붙여 넣기: "일단 테스트만" 하려다 그대로 올라가는 경우가 많습니다.
  • .env 파일을 GitHub에: 한 번 올라간 키는 커밋을 지워도 기록에 남을 수 있습니다. 새어 나갔다면 즉시 그 키를 폐기하고 새로 발급하세요.

16.7AI에게 이렇게 말해 보세요

  • “이 키는 브라우저에 공개해도 되는 키야?”
  • “코드에 직접 들어간 키가 있는지 찾아서 환경변수로 옮겨 줘”
  • “.env.local이 GitHub에 올라가지 않게 되어 있는지 확인해 줘”

17장에서는 드디어 내 컴퓨터 밖으로, 사이트를 세상에 내놓는 배포를 알아보겠습니다.

5부 · 세상에 내놓기

17장

배포, 내 컴퓨터 밖으로

localhost에서만 열리던 사이트를 누구나 접속할 수 있게 만드는 과정입니다.

  • 17장 카드뉴스 1
  • 17장 카드뉴스 2
  • 17장 카드뉴스 3
  • 17장 카드뉴스 4
  • 17장 카드뉴스 5
  • 17장 카드뉴스 6

npm run dev를 실행하고 브라우저에서 localhost:3000을 열면 사이트가 보입니다. 뿌듯하지만, 이 주소는 내 컴퓨터에서만 열립니다. 친구에게 링크를 보내도 친구 컴퓨터에는 그 사이트가 없습니다.

배포는 내 사이트를 24시간 켜져 있는 인터넷 서버에 올려서, 누구나 접속할 수 있게 만드는 일입니다.

코드
지금     http://localhost:3000          → 나만 볼 수 있어요
배포 후  https://vibegongzzang.kr    → 누구나 볼 수 있어요

17.1배포하는 두 가지 길

1. 호스팅 서비스 이용 Vercel, Netlify 같은 서비스에 GitHub11장 저장소를 연결하면, 코드를 올릴 때마다 알아서 빌드하고 배포해 줍니다. 서버 관리를 신경 쓰지 않아도 되어서 처음 시작하기에 좋습니다.

2. 내 서버에 직접 올리기 클라우드 서버를 빌려 직접 운영하는 방법입니다. Docker로 실행 환경을 통째로 포장하고, Caddy 같은 웹 서버로 HTTPS를 붙입니다. 자유도가 높은 대신 관리할 것이 늘어납니다.

이 홈페이지는 두 방법을 모두 준비해 두었습니다.

17.2배포할 때 일어나는 일

  • 빌드: npm run build로 개발용 코드를 실제 서비스용으로 정리하고 압축합니다.
  • 환경변수 설정: 16장16장에서 본 비밀 키들을 서버에도 넣어 줍니다.
  • 실행: 빌드된 결과를 서버에서 켭니다.
  • HTTPS 연결: 주소창에 자물쇠가 뜨도록 보안 인증서를 붙입니다. 호스팅 서비스와 Caddy는 대부분 자동으로 해 줍니다.

17.3배포 전 체크리스트

  • 내 컴퓨터에서 npm run build가 성공하는지
  • 필요한 환경변수를 서버에 모두 넣었는지
  • 테스트 키를 실제 키로 바꿔야 하는지 (결제 등)
  • 배포 후 주요 페이지를 하나씩 열어 봤는지
  • 휴대폰으로도 확인했는지

17.4자주 하는 실수 세 가지

  • 환경변수 빠뜨림: 내 컴퓨터에선 되는데 배포하면 안 된다면, 십중팔구 서버에 환경변수가 없는 경우입니다.
  • 빌드를 안 해 보고 배포: 개발 모드에서는 그냥 넘어가던 타입 오류가 빌드에서 걸리기도 합니다. 배포 전에 한 번 빌드해 보세요.
  • 주소를 localhost로 고정: 코드 곳곳에 http://localhost:3000이 박혀 있으면 배포 후 동작하지 않습니다. 사이트 주소도 환경변수로 관리하세요.

17.5AI에게 이렇게 말해 보세요

  • “배포 전에 빌드 돌려서 오류 있는지 확인해 줘”
  • “이 프로젝트 배포에 필요한 환경변수 목록 정리해 줘”
  • “배포된 사이트의 주요 페이지가 잘 열리는지 점검해 줘”

배포가 끝나면 이제 남은 건 이름입니다. 18장에서는 내 사이트에 도메인을 연결하는 방법을 알아보겠습니다.

5부 · 세상에 내놓기

18장

도메인 연결하기

숫자로 된 서버 주소 대신, 기억하기 쉬운 이름을 내 사이트에 붙이는 방법입니다.

  • 18장 카드뉴스 1
  • 18장 카드뉴스 2
  • 18장 카드뉴스 3
  • 18장 카드뉴스 4
  • 18장 카드뉴스 5
  • 18장 카드뉴스 6

배포17장를 마치면 사이트에 주소가 생깁니다. 호스팅 서비스가 준 긴 주소이거나, 서버의 숫자 주소(IP)일 수도 있습니다. 누군가에게 알려 주기엔 불편하죠. 그래서 도메인을 연결합니다.

18.1도메인이 뭔가요?

인터넷 주소록에 등록한 이름입니다. 컴퓨터는 서로를 숫자로 된 IP 주소로 찾는데, 사람이 외우기엔 어렵습니다. 그래서 이름을 붙이고, DNS라는 인터넷 주소록이 이름을 숫자로 바꿔 줍니다.

코드
vibegongzzang.kr
      ↓  DNS가 찾아 줘요
203.0.113.10  (서버 주소 예시)

18.2연결은 세 단계

1. 도메인 사기: 도메인 판매 업체에서 원하는 이름을 삽니다. 보통 기간 단위로 비용을 내고 연장합니다. 2. DNS 레코드 입력: 도메인 관리 화면에서 "이 이름은 이 서버로 가라"는 기록을 적습니다. 3. HTTPS 확인: 주소창에 자물쇠가 뜨는지 확인합니다. 호스팅 서비스나 Caddy가 보안 인증서를 자동으로 받아 오는 경우가 많습니다.

18.3DNS 레코드, 이것만 알면 됩니다

  • A 레코드: 도메인 → 서버의 IP 주소. 내 서버에 직접 연결할 때 씁니다.
  • CNAME 레코드: 도메인 → 다른 도메인 이름. 호스팅 서비스가 준 주소에 연결할 때 자주 씁니다.
  • TXT 레코드: 메모. "이 도메인 주인이 맞다"를 증명할 때 씁니다.

18.4www는 따로?

vibegongzzang.kr과 www.vibegongzzang.kr은 서로 다른 이름입니다. 둘 다 연결하고, 한쪽으로 모이게(리다이렉트) 설정해 두면 깔끔합니다.

18.5자주 하는 실수 세 가지

  • 값을 추측해서 입력: 한 글자만 틀려도 연결되지 않습니다. 안내 화면의 값을 그대로 복사하세요.
  • 기다리지 않고 계속 수정: DNS 변경이 퍼지는 데는 시간이 걸립니다. 몇 분 만에 되기도 하지만 길면 하루 이상 걸리기도 하니, 입력했다면 잠시 기다려 보세요.
  • 자동 연장을 꺼 둠: 도메인이 만료되면 사이트가 통째로 사라진 것처럼 보입니다. 결제 수단과 자동 연장을 꼭 확인하세요.

18.6AI에게 이렇게 말해 보세요

  • “이 DNS 설정 화면 캡처 보고, 뭘 입력해야 하는지 알려 줘”
  • “호스팅 안내 문서대로 필요한 레코드 정리해 줘”
  • “도메인이 제대로 연결됐는지 확인하는 방법 알려 줘”

도메인까지 연결하면 진짜 내 서비스가 완성됩니다. 6장6장에서 적어 둔 완료 기준을 하나씩 확인해 보세요.

마지막 19장에서는 만드는 내내 만나게 될 친구, 에러 메시지 읽는 법을 알아보겠습니다.

5부 · 세상에 내놓기

19장

에러 메시지 읽는 법

빨간 글씨는 실패가 아니라 힌트입니다. 세 군데만 보면 원인이 보입니다.

  • 19장 카드뉴스 1
  • 19장 카드뉴스 2
  • 19장 카드뉴스 3
  • 19장 카드뉴스 4
  • 19장 카드뉴스 5
  • 19장 카드뉴스 6

바이브코딩을 하다 보면 빨간 글씨를 정말 자주 만납니다. 처음엔 겁이 나지만 걱정하지 마세요.

19.1에러는 이렇게 생겼습니다

코드
TypeError: Cannot read properties of undefined (reading 'title')
    at CohortCard (page.tsx:42:18)
    at ...

길고 복잡해 보여도, 볼 곳은 세 군데뿐입니다.

19.2세 군데만 보세요

1. 종류: 맨 앞의 TypeError. 어떤 유형의 문제인지 알려 줍니다. 2. 내용: Cannot read properties of undefined (reading 'title'). "비어 있는(undefined) 것에서 title을 꺼내려 했다"는 뜻입니다. 데이터가 아직 안 왔거나, 이름이 틀렸을 가능성이 큽니다. 3. 위치: page.tsx:42:18. page.tsx 파일의 42번째 줄, 18번째 글자입니다. 아래로 이어지는 at 목록 중에서 내가 만든 파일 이름을 찾으세요. node_modules처럼 남이 만든 코드는 대부분 건너뛰어도 됩니다.

19.3어디서 확인하나요?

  • 터미널1장: npm run dev를 실행한 창입니다. 서버 쪽 에러와 빌드 에러가 여기에 나옵니다.
  • 브라우저 콘솔: 화면에서 F12(맥은 Cmd + Option + I)를 누르고 Console 탭을 엽니다. 화면 쪽 에러가 여기에 나옵니다.
  • 네트워크 탭: 같은 개발자 도구의 Network 탭입니다. API 요청과 응답 번호(15장15장 참고)를 볼 수 있습니다.

화면이 하얗게 나오는데 아무 설명이 없다면, 이 세 곳을 차례로 열어 보세요.

19.4자주 보는 에러 몇 가지

  • Module not found: 파일이나 패키지를 못 찾았습니다. 경로에 오타가 있거나 npm install을 안 했을 때 납니다.
  • is not defined: 만들지 않은 이름을 썼습니다. 오타를 먼저 의심하세요.
  • 404, 500: 페이지나 API 문제입니다. 응답 번호로 어느 쪽 문제인지 가늠합니다.

19.5자주 하는 실수 세 가지

  • 에러 없이 "안 돼요"만: AI도 사람도 에러 전문이 없으면 추측할 수밖에 없습니다.
  • 여러 곳을 한꺼번에 수정: 무엇 때문에 고쳐졌는지(또는 망가졌는지) 알 수 없게 됩니다. 한 번에 하나씩 고치세요.
  • 읽지 않고 새로고침만: 같은 에러는 같은 이유로 다시 납니다.

19.6AI에게 이렇게 말해 보세요

  • "이 에러 전문이야. 원인과 해결법 알려 줘" (에러를 통째로 붙여 넣기)
  • "방금 로그인 버튼을 눌렀더니 이 에러가 났어" (무엇을 하다가 났는지 함께)
  • “고친 다음, 같은 에러가 다시 안 나게 테스트도 추가해 줘”

19.7시리즈를 마치며

터미널과 Claude Code로 시작해 CLAUDE.md와 PRD, JSON과 MCP와 Skills, Git과 GitHub, Next.js와 Supabase, 배포와 도메인, 그리고 에러 읽는 법까지 19장을 함께 왔습니다. 하나하나는 작은 개념이지만, 모두 모이면 "AI와 함께 서비스를 만들고 세상에 내놓는" 전체 흐름이 됩니다.

여기까지 따라오셨다면, "코드를 몰라서 못 만든다"는 말은 이제 반만 맞습니다. 나머지 반은 직접 만들어 보면서 채워집니다. 머릿속에만 있던 서비스, 이제 AI와 함께 만들어 보세요.

혼자 하기 막막하다면 바이브공장장에서 함께 만들어요. 2주 동안 아이디어 하나를 실제로 배포되는 서비스로 완성합니다.