현장에서 있었던 일
요일 탓인가, 소재 탓인가
상황
한 D2C 브랜드가 광고 소재 판정을 에이전트에게 맡겼는데, 요청에 판정 시점이 없었어요.
문제
요일마다 매출이 크게 달라서(예시: 일 125 … 금 89), 금요일 숫자만 보면 좋은 소재도 잘려요.
바꾼 것
요청서의 완료 조건에 '판정은 월요일, 요일 보정 후'를 넣었어요. 그 뒤로 판정이 흔들리지 않았어요.
2주차 · 요청을 설계하기 — 17
커머스 AI 운영 실전 8주 과정 · 2주차
무엇을, 어디까지, 어떻게 확인하면 끝인가
난이도 LV.2 기초
수업 3시간 · 자료 4시간 40분
실습: contto.ai 70% 클론
2 / 8
이번 주 목표
01
목표·범위·완료 조건·하지 말 것·보고 형식이 든 요청서로 한 번에 맞혀요.
02
PRD v0.2와 기술 결정 15개를 AI의 질문에 답하며 정하고 기록해요.
03
Supabase(DB·Storage만)를 연결하고 마이그레이션으로 브랜드 등록을 저장해요.
2주차 · 요청을 설계하기 — 2
진행 순서
진한 칸(코어)만 하면 3시간 수업이에요. 회색 칸은 확장·자습이에요.
0:00
복습 리뷰
0:20
개념 핵심
1:05
개념 심화
1:20
영상 노트
1:40
강사 시연
2:10
실습 1
3:20
실습 2 도전
4:05
상급 노하우
4:25
회고 과제
2주차 · 요청을 설계하기 — 3
진행 순서 · 자세히
| 시간 | 순서 | 내용 | 구분 |
|---|---|---|---|
| 0:00–0:20 | 복습·과제 리뷰 | RULES.md·PRD v0.1 두 명 발표 | 코어 |
| 0:20–1:05 | 개념 (핵심) | 모호한 요청, 요청서 다섯 칸, 완료 조건, 계획 먼저 | 코어 |
| 1:05–1:20 | 개념 (심화) | 같은 요청도 결과가 다른 이유, 결정 기록 | 확장 |
| 1:20–1:40 | 참고 영상 노트 | 양실장 PRD 방식, CNV 3단계 '먼저 대화' | 확장 |
| 1:40–2:10 | 강사 시연 | PRD v0.2와 기술 결정 1문1답 | 코어 |
| 2:10–3:20 | 실습 1 (기본) | 결정 15개·Supabase·마이그레이션·브랜드 등록 | 코어 |
| 3:20–4:05 | 실습 2 (도전) | 할인정보·제품 화면 | 확장 |
| 4:05–4:25 | 상급 노하우 | 모델별 에이전트 최적화 | 확장 |
| 4:25–4:40 | 회고·과제 | 나쁜 요청 vs 좋은 요청 비교 공유 | 코어 |
2주차 · 요청을 설계하기 — 4
지난주 복습
오늘 이어서
PRD v0.1 → v0.2, 로컬 JSON → DB
2주diff 읽기
요청 안 한 변경을 찾았나요? 그 경험이 RULES.md에 들어갔나요?
1주지침 한 장
RULES.md와 포인터 파일. 새 세션이 '읽은 파일'을 적었나요?
1주2주차 · 요청을 설계하기 — 5
미니 콘토 지도
URL 자동 분석은 3주차예요. 화면 꾸미기는 최소로 해요.
브랜드 메뉴
contto.ai의 네 화면
브랜드정보
이름·URL을 DB에 · 이번 주
할인정보
손으로 입력 · 도전
고객 유형
URL 분석 초안 · 3주차
제품
손으로 입력 · 도전
2주차 · 요청을 설계하기 — 6
개념 1
에이전트는 빈칸을 비워 두지 않아요. 그럴듯하게 채워요.
2주차 · 요청을 설계하기 — 7
개념 2
가장 자주 빠지는 칸은 '하지 말 것'이에요.
01
한 문장: 브랜드 등록을 DB에 저장
02
brands 테이블, 등록·목록 화면
03
2개 등록 → 새로고침 유지, 테스트 통과
사람 승인 관문
04
로그인 만들지 않기, 키를 코드에 쓰지 않기
05
바꾼 파일 · 확인 결과 · 못 한 것
2주차 · 요청을 설계하기 — 8
개념 3
'잘 되게'는 조건이 아니에요. 실패할 때의 동작도 넣어요.
완료 조건
누가 봐도 같은 판정
숫자로
2개 등록 → 2개 보임
명령으로
pnpm test 통과 · 응답 200
화면으로
모바일 폭 가로 스크롤 없음
없을 때도
URL이 비면 저장 안 됨
2주차 · 요청을 설계하기 — 9
개념 4
바뀔 내용을 한 문장으로 말할 수 없으면 계획부터 받아요.
나
사람에이전트
AI1. 계획만 보여 줘
2. 할 일 목록 작성
3. 계획 제안
4. 빠진 것·넘친 것 고치기
5. OK, 실행해
6. 실행
7. 완료 조건별 결과 보고
2주차 · 요청을 설계하기 — 10
개념 5
| 결정 | 선택 | 결정 | 선택 |
|---|---|---|---|
| 01 프레임워크 | Next.js (App Router) | 09 단위 테스트 | Vitest |
| 02 언어 | TypeScript | 10 E2E 테스트 | Playwright |
| 03 스타일 | Tailwind + shadcn/ui | 11 CI | GitHub Actions |
| 04 DB | Supabase Postgres | 12 배포 | Vercel |
| 05 파일 저장 | Supabase Storage | 13 입력 검증 | Zod |
| 06 인증 | 없음 (가입 제외) | 14 LLM 호출 | 서버 라우트에서만 |
| 07 스키마 변경 | SQL 마이그레이션 | 15 비용 | 하루 상한 |
| 08 API | 라우트 핸들러 |
2주차 · 요청을 설계하기 — 11
개념 6 · 심화
그래서 요청서에는 '확인할 방법'이 꼭 있어야 해요.
1
앞의 글이 토큰으로 들어가요
2
모델이 다음 후보를 계산해요
3
후보마다 확률이 붙어요
4
온도를 올리면 고르게 퍼져요
5
그래서 뽑을 때마다 달라요
2주차 · 요청을 설계하기 — 12
개념 7 · 심화
# docs/decisions/004-database.md
결정: Supabase Postgres + Storage (Auth는 쓰지 않음)
날짜: 2주차 실습
이유: 무료 플랜으로 시작, 마이그레이션 파일로 형상 관리
대안: SQLite(배포가 번거로움), Firebase(SQL이 아님)
결과: brands 테이블부터 시작, 키는 .env.local
되돌리는 법: 마이그레이션 down, 데이터는 JSON으로 내보내기
AI에게 물은 것: '대안과 왜 이걸 추천하는지'
2주차 · 요청을 설계하기 — 13
운영 루프에서
완료 조건은 나중에 승인 관문의 기준이 돼요.
01
코드브랜드 URL·이름 저장 (이번 주)
02
AI요청서가 AI의 입력
03
사람완료 조건 = 사람의 확인 기준
사람 승인 관문
04
가짜아직 없음 (7주)
05
코드결정 기록이 첫 원장
원장이 다음 데이터가 돼요
2주차 · 요청을 설계하기 — 14
참고 영상 노트
출처: 양실장의 바이브코딩대학 「3시간 순삭) 55개 기술 의사결정, 소스코드 해설까지」 · https://www.youtube.com/watch?v=K6Rsy-pHBi0&t=1714s
28:34
AI가 PRD 초안을 쓰고 사람은 고쳐요.
31:41
결정이 필요한 것만 한 번에 하나씩 묻게 해요.
32:42
모르는 결정은 권장안으로 넘기고 기록을 남겨요.
35:45
맥락에 안 맞는 가정은 바로 고쳐 달라고 해요.
PRD v0.1 → 질문 → v0.2. 결정마다 이유를 남겨요.
2주차 · 요청을 설계하기 — 15
참고 영상 노트
출처: CNV AI 「AI 에이전트 만들기 3단계 — AI에게 실제 업무 시스템을 개발시키는 방법」 · https://www.youtube.com/watch?v=hG9i8nFHEEs&t=924s
15:24
충분히 대화한 뒤 개발하자고 시작해요.
17:33
에이전트가 선택지와 질문을 내고 사람이 답해요.
21:41
나중에 붙일 기능을 모듈 단위로 미리 정해요.
24:49
기준과 참고 소스를 작업 폴더에 받아 둬요.
요청 전에 대화, 대화의 결론은 요청서 한 장으로.
2주차 · 요청을 설계하기 — 16
현장에서 있었던 일
상황
한 D2C 브랜드가 광고 소재 판정을 에이전트에게 맡겼는데, 요청에 판정 시점이 없었어요.
문제
요일마다 매출이 크게 달라서(예시: 일 125 … 금 89), 금요일 숫자만 보면 좋은 소재도 잘려요.
바꾼 것
요청서의 완료 조건에 '판정은 월요일, 요일 보정 후'를 넣었어요. 그 뒤로 판정이 흔들리지 않았어요.
2주차 · 요청을 설계하기 — 17
강사 시연 30분
볼 것: 결정 충돌 알림 · 코드에 키 없음 · 완료 조건으로 끝 확인
01
AIPRD를 읽고 필요한 것만 하나씩
02
사람뭐고, 대체재는, 왜 이걸 추천해?
03
AI결정마다 docs/decisions/ 에
04
사람Supabase 프로젝트·키는 .env.local
사람 승인 관문
05
코드마이그레이션 001 → 등록 → 새로고침
2주차 · 요청을 설계하기 — 18
시연 프롬프트
[목표] 브랜드 등록(이름·URL)을 Supabase brands 테이블에 저장해요
[범위] supabase/migrations/001_brands.sql, 브랜드 등록·목록 화면
[완료 조건] 2개 등록 → 새로고침 후 2개 보임 / URL이 비면 저장 안 됨
pnpm test 통과
[하지 말 것] 인증·로그인 만들지 않기, 키를 코드에 쓰지 않기
[보고] 바꾼 파일 · 확인 명령과 결과 · 확인 못 한 것
먼저 계획을 보여 줘. 내가 OK 하면 그때 실행해.
2주차 · 요청을 설계하기 — 19
실습 1 · 70분
2주차 · 요청을 설계하기 — 20
실습 힌트
| 상황 | 이렇게 말해요 |
|---|---|
| 질문이 너무 많아요 | "꼭 필요한 5개만 묻고 나머지는 권장대로" |
| 용어를 모르겠어요 | "이게 뭐고, 대체재는 뭐고, 왜 이걸 추천해?" |
| 결정끼리 부딪혀요 | "결정 목록 전체에서 서로 충돌하는 걸 찾아 줘" |
| 계획 없이 실행해요 | "실행하지 말고 계획만. 내가 OK 하면 실행" |
| 완료를 못 믿겠어요 | "완료 조건 하나씩 확인한 명령과 결과를 보여 줘" |
2주차 · 요청을 설계하기 — 21
실습 2 · 도전 45분
완료: 마이그레이션 002 · 잘못된 입력은 저장 안 됨 · 요청서 v2(고친 점 표시)
01
사람다섯 칸부터 써요
02
AI002: offers·products
03
AI브랜드 메뉴 아래 할인정보·제품
04
코드Zod: 가격은 0 이상 숫자
05
코드잘못된 입력 1개는 저장 안 됨
2주차 · 요청을 설계하기 — 22
템플릿
[목표] 한 문장: 무엇을 바꾸나
[범위] 만질 파일·화면 / 만지지 않을 곳
[완료 조건] 확인할 수 있는 기준 3개 (숫자·명령·화면)
실패할 때의 동작 1개
[하지 말 것] 가입·로그인, 키를 코드에, 실제 외부 API
[참고] docs/PRD.md, docs/decisions/, 화면 캡처
[보고 형식] 바꾼 것 · 확인 방법과 결과 · 확인 못 한 것
먼저 계획만 보여 줘. 내가 OK 하면 실행해.
2주차 · 요청을 설계하기 — 23
안전 체크
계획
승인 전에는 실행 금지, 결정마다 되돌리는 법
매번데이터
변경은 마이그레이션 파일로만, 실습 데이터에 개인정보 넣지 않기
한도
Supabase 무료 플랜 한도를 먼저 확인해요
키
키는 .env.local, 예시는 .env.example, 서버 전용 키는 서버에서만, 브라우저로 안 나가게
토대2주차 · 요청을 설계하기 — 24
흔한 실수
| 실수 | 무슨 일이 생기나 | 대신 이렇게 |
|---|---|---|
| 한 줄 요청 | 가입 화면 같은 걸 지어내요 | 다섯 칸 요청서 |
| 완료 조건이 '잘' | 끝을 확인할 수 없어요 | 숫자·명령·화면으로 |
| 결정 이유를 안 남김 | 다음 세션이 다시 물어요 | docs/decisions/ |
| DB를 대시보드에서 직접 수정 | 재현이 안 돼요 | 마이그레이션 파일로 |
| 키를 코드에 | 커밋되면 회수 불가 | .env.local + .gitignore |
2주차 · 요청을 설계하기 — 25
문제 해결
| 증상 | 원인 | 해결 |
|---|---|---|
| Invalid API key | 변수 이름 오타·재시작 안 함 | 이름 확인 후 dev 서버 재시작 |
| relation does not exist | 마이그레이션 미적용 | 마이그레이션 적용 명령 실행 |
| 조회가 0건 | 행 보안(RLS)이 막음 | 서버 라우트에서만 조회, 정책은 5주차 |
| 결정끼리 충돌 | 무료 플랜 한도 등 | 결정 목록 전체 점검 요청 |
| 계획이 너무 길어요 | 범위가 넓음 | 범위 칸을 줄이고 다시 계획 |
2주차 · 요청을 설계하기 — 26
자습 목록 · 확장
| 자료 | 볼 구간 | 볼 것 |
|---|---|---|
| 양실장 3시간 강의 | 28:34–37:16 | PRD 초안 → 결정 질문 → v0.2 |
| 양실장 3시간 강의 | 37:16–113:41 | 기술 결정 55개를 1문1답으로 |
| CNV AI 3단계 | 15:24–25:21 | 먼저 대화, 요청 템플릿 |
| 양실장 LLM 원리 | 54:22–58:31 | 샘플링과 온도 |
| 공식 문서 | Supabase CLI 마이그레이션 | 마이그레이션 만들기·적용 |
2주차 · 요청을 설계하기 — 27
상급 노하우
| 기법 | 어떻게 | 왜 |
|---|---|---|
| 역할별 모델 | PRD·기술 결정은 최상위, 화면 구현은 중간, 카피 변형은 경량 | 모든 일을 최상위로 하면 한도가 먼저 닳아요 |
| 추론 강도 | 결정 1문1답은 high, 반복 수정은 low (/effort, model_reasoning_effort) | 모델을 바꾸기 전에 강도부터 조절해요 |
| 세션 시작 때 정하기 | 모델·강도는 첫 요청 전에 골라요 | 중간에 바꾸면 캐시가 깨져 사용량이 늘어요 |
| 엔진별 요청 스타일 | 클로드는 행동 동사와 이유를, 코덱스는 목표·제약·완료 조건 계약을 | 같은 요청서라도 강조점이 달라요 |
2주차 · 요청을 설계하기 — 28
상급 노하우 · 예시
심화 과제(선택): 같은 기술 결정 요청과 카피 변형 요청을 모델 2개 × 추론 강도 2단계로 돌려 시간·사용량·결과를 표로 비교해요
# 클로드 코드: PRD·기술 결정 세션
claude --model <최상위> --effort high
# .claude/agents/copywriter.md 카피 변형은 경량 모델
---
name: copywriter
model: haiku
tools: Read
---
# 코덱스: ~/.codex/config.toml
[profiles.decide] model_reasoning_effort = "high"
[profiles.fast] model_reasoning_effort = "low"
2주차 · 요청을 설계하기 — 29
과제와 다음 주
다음 수업 첫 20분에 A/B 비교를 두 명이 발표해요.
다음 주
URL을 넣으면 브랜드정보·할인·고객 유형·제품 초안이 채워지게 하고, 그 절차를 스킬로 만들어요.
2주차 · 요청을 설계하기 — 30