시도하고자 했던 것과 그 이유를 알려주세요.
2026년에 새로 생긴 국가기술자격인 공공조달관리사 시험을 준비하고 싶었는데, 막상 보니 시장에 수험 앱이 하나도 없었습니다.
공식 표준교재만 4권에 총 1,574페이지. 기출문제도 없는 신설 자격이라 어디서부터 시작해야 할지 막막했습니다.
그래서 생각했습니다.
"내가 필요한 앱을 내가 직접 만들면 되지 않나?"
목표는 세 가지였습니다.
교재 4권의 핵심 내용을 과목별로 나눠 볼 수 있는 커리큘럼
출퇴근길 30분에 쓸 수 있는 플래시카드 + 퀴즈
공식 예제문제의 출제기준을 반영한 AI 문제 출제 엔진
개발자가 아니어도 Claude Code와 bkit으로 이게 가능한지 직접 확인하고 싶었습니다.
진행 방법
어떤 도구를 사용했고, 어떻게 활용하셨나요?
사용한 도구
Claude Code — 코드 작성, DB 설계, 배포
bkit — 플랜 문서·디자인 문서 작성 (작업 시작 전 구조화)
Supabase — DB + 인증
Vercel — 배포
Claude API — AI 문제 출제·오답 해설 자동 생성
Step 0. Claude Code 켜기 전에 먼저 한 것
가장 중요했던 단계입니다.
교재 4권의 목차를 직접 읽으면서 과목 구조를 파악했습니다.
1권 (459p) → 과목1: 공공조달과 법제도 이해
2권 (279p) → 과목2: 공공조달계획 수립 및 분석
3권 (419p) → 과목3: 공공계약관리
4권 (417p) → 실무 심화 (원가계산, 나라장터)공식 예제문제 6개가 핵심이었습니다. 각 문제에 출제기준표(주요항목 > 세부항목 > 세세항목)가 붙어있었는데, 이게 나중에 퀴즈 DB 분류 체계가 됐습니다.
그다음 bkit으로 플랜 문서를 작성했습니다. 기능 목록, 화면 구조, DB 설계를 먼저 정리한 뒤 Claude Code를 켰습니다.
이전에 bkit 없이 시작했다가 작업이 꼬여서 전부 엎은 경험이 있었습니다. 구조화된 문서 없이 시작하면 Claude Code가 엉뚱한 걸 만듭니다.
Step 1. 프로젝트 초기화
사용한 프롬프트:
이 PRD 파일을 읽어줘.
현재 폴더 구조를 먼저 확인해줘.
Next.js 14 (App Router) + Supabase 프로젝트 초기화해줘.
DB 스키마는 PRD의 스키마 섹션 기준으로 SQL 생성해줘.
완료되면 동작 확인 + 갭 분석 요청할게."현재 폴더 먼저 확인"이 핵심이었습니다. Claude Code가 엉뚱한 경로에서 작업하는 걸 막는 첫 번째 안전장치입니다.
DB 테이블 5개(users, user_progress, questions, quiz_results, wrong_notes), Supabase RLS 설정까지 한 번에 처리됐습니다.
Step 2. 시드 데이터 입력
교재에서 핵심 용어 200개를 플래시카드 데이터로, 공식 예제문제 6개를 퀴즈 DB에 넣었습니다.
사용한 프롬프트:
예제문제 6개를 questions 테이블에 시딩해줘.
각 문제에 출제기준 3단계 컬럼(major_topic, sub_topic, detail_topic)도 채워줘.
예시:
subject: 1
major_topic: "공공조달 원칙 및 방법"
sub_topic: "비경쟁적 공공조달 방법"
detail_topic: "수의계약"
question: "수의계약의 장점과 거리가 먼 것은?"
options: ["절차 간소화", "신속한 계약 체결", "공정성 및 투명성 확보", "적합한 조달 대상물 확보"]
answer: 3
law_reference: "국가계약법 시행령 제26조"Step 3. 홈 화면
미리 만들어둔 HTML 목업 파일을 그대로 전달했습니다.
사용한 프롬프트:
index.html 파일을 읽어줘.
이 UI를 Next.js App Router 기반 React 컴포넌트로 변환해줘.
SummaryCard, ProcessMap, ToolsGrid 세 개의 컴포넌트로 분리해줘.
user_progress 테이블에서 현재 유저 진행률을 fetch해서 ProcessMap에 연결해줘.30분 만에 변환됐습니다. UI 목업을 미리 만들어두면 변환 요청 한 마디로 해결됩니다.
Step 4. 커리큘럼 화면 (잠금 해제 로직)
3과목 × 4~5모듈 구조를 만들었습니다. 이전 모듈 퀴즈 정답률 70% 이상이면 다음 모듈이 열리는 로직이 필요했습니다.
사용한 프롬프트:
user_progress 테이블에서 이전 모듈 정답률을 계산해서
70% 이상이면 다음 모듈 status를 'locked'에서 'in_progress'로 바꾸는
서버 액션을 만들어줘.
완료 후 동작 확인하고 갭 분석해줘.Supabase RLS 정책이 서버 액션을 막고 있었습니다. 갭 분석 결과로 원인이 잡혔고, service_role 키로 우회하는 방법을 Claude Code가 알려줘서 수정했습니다.
Step 5. AI 퀴즈 엔진 (Claude API)
처음에 단순 프롬프트로 만들었더니 출제기준을 무시한 엉뚱한 문제가 나왔습니다.
수정 전 프롬프트 (문제 있었음):
공공조달 관련 문제 1개를 JSON으로 생성해줘.수정 후 프롬프트 (정확도 확 올라감):
javascript
const systemPrompt = `
당신은 공공조달관리사 국가기술자격 시험 문제 출제 전문가입니다.
출제 근거: 국가계약법, 지방계약법, 조 달사업법, 건설산업기본법, 민법
문제 형식: 객관식 4지선다
해설에 반드시 법령 조문 번호 포함
반드시 순수 JSON만 출력 (마크다운 없이)
`;
const userPrompt = `
과목: ${subject}
주요항목: ${majorTopic}
세부항목: ${subTopic}
세세항목: ${detailTopic}
난이도: ${difficulty}
사용자 최근 오답 토픽: ${recentWrongTopics}
출력 형식:
{
"question": "문제 텍스트",
"options": ["① 내용", "② 내용", "③ 내용", "④ 내용"],
"answer": 3,
"explanation": "해설 (법령 근거 포함)",
"law_reference": "국가계약법 시행령 제00조"
}
`;출제 품질을 높인 두 가지 핵심:
출제기준 3단계를 프롬프트에 명시 — "과목1 / 주요항목: 비경쟁적 공공조달 방법 / 세세항목: 수의계약"처럼 구체적으로
순수 JSON만 출력 강제 — 마크다운 코드블록이 섞이면 파싱 오류가 남
Step 6. 오답노트 AI 해설
틀린 문제 저장 시 Claude가 해설을 자동 생성합니다.
사용한 프롬프트:
틀린 문제에 대한 AI 해설을 생성하는 API 라우트를 만들어줘.
해설에는 반드시 4가지를 포함해야 해:
1. 왜 틀렸는지 (정답이 ③인 이유)
2. 헷갈리는 포인트 (3일/5일/7일 중 왜 7일인지)
3. 암기 팁
4. 출제기준 위치 (어느 세세항목에서 나온 문제인지)
AI 해설 로딩 중에는 스켈레톤 컴포넌트를 보여줘.Step 7. 원가계산 시뮬레이터 (4권 3장 기반)
제조원가·용역원가·공사원가·투찰률 계산기를 만들었습니다.
사용한 프롬프트:
제조원가 계산기를 만들어줘.
직접재료비/직접노무비/직접경비/간접비율/이윤율을 입력하면
단계별 계산 과정을 실시간으로 보여줘.
각 줄에 수식이랑 결과값을 같이 표시해.⚠️ 여기서 중요한 점: 계산 로직은 Claude Code에만 맡기면 안 됩니다.
4권 교재 공식을 직접 보면서 한 줄씩 검수했더니 오류가 있었습니다.
"4단계 간접노무비 계산식이 틀렸어.
교재 기준은 (직접재료비 + 직접노무비) × 간접노무비율인데
직접재료비에만 곱하고 있어. 수정해줘."이런 식으로 직접 확인하고 수정하 는 과정이 반드시 필요합니다.
Step 8. Vercel 배포
사용한 프롬프트:
프로덕션 빌드 해줘.
에러 없으면 Vercel 배포까지 진행해줘.
배포 후 모바일에서 확인할 내용 목록도 알려줘.빌드 에러 2개(TypeScript 타입 오류)가 나왔는데 Claude Code가 즉시 수정했습니다.
배포 후 iOS에서 플래시카드 스와이프가 안 됐습니다.
"iOS 사파리에서 플래시카드 스와이프가 안 돼.
touch 이벤트 핸들러 추가해줘."5분 만에 해결됐습니다.
결과와 배운 점
아직 완성하진 못 했습니다.
일단 목업만 올려봅니다
시행착오
① bkit 없이 시작했다가 전부 엎었습니다
처음에는 플랜 문서 없이 바로 Claude Code에서 작업을 시작했습니다. 방명록을 만들다가 포트폴리오 사이트로 노선을 바꾸면서 작업이 꼬였고, 복구가 불가능해 전부 삭제하고 재시작했습니다.
→ 교훈: bkit으로 구조를 잡은 다음 Claude Code 시작이 절대 원칙입니다.
② AI 문제 품질이 들쑥날쑥했습니다
처음에는 "공공조달 문제 1개 만들어줘"라고만 했더니 출제기준을 완전히 무시한 문제가 나왔습니다.
→ 교훈: 출제기준 3단계를 명시 + JSON만 출력 강제 — 이 두 조건이 품질을 결정합니다.
③ 계산 수식을 Claude Code가 틀렸습니다
원가계산 공식 중 간접노무비 계산 기준이 잘못 구현됐습니다. 교재를 직접 읽으면서 검수하지 않았다면 그냥 넘어갔을 부분입니다.
→ 교훈: 전문 지식이 들어가는 로직은 도메인 전문가가 반드시 검수해야 합니다.
④ 며칠 뒤 다시 작업하면 맥락이 끊겼습니다
Claude Code가 이전에 뭘 만들었는지 기억하지 못하는 경우가 생겼습니다.
→ 교훈: 매일 작업 시작 시 이 프롬프트로 시작했습니다.
현재 폴더 구조 확인해줘.
지금까지 완성된 기능이 뭔지 파악하고,
오늘 작업할 Step 5부터 시작해줘.나만의 꿀팁
"갭 분석해줘"를 습관화하세요
뭔가 안 될 때 직접 디버깅하려 하지 말고 이렇게 물어보는 게 훨씬 빨랐습니다.
방금 만든 [기능명] 동작 확인해줘.
문제가 있으면 뭔지 알려주고 수정해줘.작업 완료 후 보고서를 남기세요
오늘 작업한 내용 완료 보고서 작성해줘.
다음에 이어서 할 내용도 정리해줘.
Git 커밋도 해줘.이렇게 하면 다음 날 작업 시작이 훨씬 빠릅니다.
앞으로의 계획
나라장터 실무 시뮬레이터 — 입찰 참여 → 낙찰 결과 시뮬레이션 (4권 7장 기반)
법령 개정 모니터링 → 자동 콘텐츠 패치
같은 구조로 다른 국가기술자격 과목 확장
도움 받은 글 (옵션)
스터디 현님의 나라장터 입찰 모니터링 사례 — 갭 분석 요청 프롬프트 전략 참고
스터디 에보님의 스킬 매트릭스 대시보드 사례 — Supabase + Vercel 풀스택 구성 참고
bkit 공식 문서 — 플랜 문서 작성 방법