"AI로 코딩한다"는 말이 흔해졌지만, 막상 어떻게 활용했는지 구체적으로 공유하는 글은 많지 않습니다.
저는 최근 onebite-saju라는 AI 사주 운세 서비스를 만들었습니다. 생년월일시를 입력하면 만세력 기반으로 사주 8글자를 추출하고, Gemini AI가 개인화된 운세 리포트를 생성해주는 서비스입니다.
이 프로젝트를 처음부터 끝까지 Claude Code와 함께 만들었습니다. 113개의 커밋, 13개 이상의 개발 단계, 카카오 로그인부터 결제 시스템까지,
이 글에서는 AI를 어떻게 활용했는지, 실제로 어떤 점이 좋았고 어떤 한계가 있었는지 솔직하게 공유합니다.
위의 이미지 같이
onebite-saju는 사주 서비스입니다.
| 영역 | 기술 |
|---|---|
| 프레임워크 | Next.js 15 (App Router) |
| 런타임 | React 19, TypeScript |
| 스타일링 | TailwindCSS v4, shadcn/ui |
| 인증 | Supabase Auth (카카오 OAuth) |
| DB | Supabase (PostgreSQL + RLS) |
| AI | Google Gemini API |
| 결제 | Toss Payments |
| 만세력 | lunar-javascript |
| 상태관리 | Zustand |
| 폼 | React Hook Form + Zod |
| 애니메이션 | Framer Motion |
| 배포 | Vercel |
가장 많이 달라진 점은 개발 방식 자체였습니다.
기존의 개인 프로젝트라면 그냥 파일을 열고 코딩을 시작했을 겁니다. 하지만 AI와 함께할 때는 다른 접근이 필요했습니다. AI가 맥락을 잃지 않으려면 구조가 있어야 했고, 그 구조를 만드는 과정 자체가 개발 품질을 높여줬습니다.

PRD → ROADMAP → Task 문서 기반 개발
아이디어
↓
Claude와 함께 PRD(제품 요구사항 문서) 작성
↓
PRD 기반으로 ROADMAP 단계 설계
↓
각 단계를 Task 파일로 세분화
↓
Task 파일대로 구현 → 완료 체크

위의 이미지는 ROADMAP.md 파일 일부입니다.
docs/PRD.md에는 서비스 목적, 사용자 여정, 기능 명세를 정리했습니다. docs/ROADMAP.md에는 Phase 1부터 단계별 개발 계획을 작성했습니다.
그리고 각 기능마다 tasks/014-supabase-setup.md 같은 Task 파일을 만들어 수락 기준, 구현 단계, 테스트 체크리스트를 명시했습니다.
이렇게 하면 AI에게 "Task 014 구현해줘"라고 말하면 맥락을 충분히 전달할 수 있었고, 세션이 바뀌어도 이어서 작업할 수 있었습니다.
위의 사진은 해당 lunar-javascript 를 이용하여, UI로 나타낸 것 입니다.
사주 서비스의 핵심은 정확한 만세력 계산입니다. lunar-javascript 라이브러리로 년/월/일/시 천간지지 8글자, 십성, 신살까지 계산하는 로직은 동양 역학 도메인 지식이 없으면 혼자 구현하기 어렵습니다.
Claude에게 만세력의 개념과 필요한 계산 방식을 설명하고, 라이브러리 문서를 함께 보면서 구현했습니다. 혼자였다면 며칠이 걸렸을 작업이 몇 시간 만에 완성됐습니다.

이미지에서 주목할 점은,, 꾸준한 개선을 반복하여, 239~654 줄에 프롬프트입니다.
커밋 히스토리를 보면 Gemini 프롬프트를 여러 번 수정한 흔적이 있습니다.
처음 프롬프트로 생성한 리포트는 너무 일반적이었습니다. "이 응답이 왜 별로인지, 어떻게 개선하면 좋을지" Claude에게 물어보면서 프롬프트를 계속 다듬었습니다. 결국 사용자 이름을 부르는 개인화된 공감 메시지, 구체적인 행동 조언, 계절감 있는 표현 등이 추가됐습니다.
프롬프트 엔지니어링을 AI와 함께 한다는 게 처음엔 어색했는데, 이 방식이 꽤 효과적이었습니다.
perf(auth): getUser() → getSession()으로 초기화 race condition 제거
인증 초기화 과정에서 가끔 로그인 상태가 맞지 않는 버그가 있었습니다. 증상을 설명했더니 Claude가 바로 getUser()가 매번 서버를 호출하기 때문에 초기화 시점에 race condition이 생길 수 있다는 것을 짚어줬습니다. getSession()으로 교체하는 것으로 해결됐는데, 혼자라면 원인 파악에 훨씬 오래 걸렸을 겁니다.
이미지 최적화, 폰트 서브셋, 코드 스플리팅 등 성능 관련 작업은 AI가 체계적으로 점검해줬습니다. "이 페이지가 느린 것 같은데 뭘 봐야 해?"라고 물으면 우선순위를 정해서 개선 방향을 제안해줬습니다.
Toss Payments 연동은 처음 해보는 작업이었습니다. 클라이언트 결제 요청 → 서버 결제 승인 → DB 상태 업데이트 흐름을 이해하고 구현하는 과정을 Claude와 함께 단계별로 진행했습니다. 공식 문서를 해석하고 코드에 맞게 적용하는 시간이 크게 줄었습니다.
솔직히 말하면 100% 신뢰하면 안 됩니다.

이번에 프로젝트 보안 점검을 요청했을 때, AI가 .env 파일이 Git 저장소에 노출됐다고 CRITICAL 경고를 냈습니다. 실제로 GitHub 저장소를확인해보니 .env 파일은 없었습니다. .gitignore가 제대로 작동하고 있었고, 로컬에 파일이 존재한다는 것을 저장소에 커밋됐다고 잘못 판단한 겁니다.
이런 경우가 간혹 있습니다. AI의 결과물은 항상 직접 확인해야 합니다.

context 는 항상 잘 확인하고, compact 해주기..!
세션이 길어지거나 파일이 많아지면 AI가 이전 맥락을 잃고 이미 만든 컴포넌트를 다시 만들거나, 기존 패턴과 다른 방식으로 구현하는 경우가 생겼습니다. Task 파일로 맥락을 명시적으로 전달하는 방식이 이 문제를 어느 정도 해결해줬습니다.
만세력 계산 결과가 맞는지, 사주 해석이 실제로 타당한지는 AI가 검증해줄 수 없었습니다. 도메인 전문 지식이 필요한 부분은 직접 공부하고 검증하는 과정이 필요했습니다.
개인적으로 느낀 건, AI가 개발 속도를 높여주는 건 맞지만 판단력을 대신해주지는 않는다는 겁니다. 오히려 AI가 빠르게 코드를 만들어주기 때문에 "이게 정말 맞는 방향인가"를 더 자주, 더 꼼꼼히 생각하게 됐습니다.
한입사주(onebite-saju)는 "AI로 AI 서비스를 만든" 프로젝트입니다. Claude로 코드를 작성하고, 그 코드 안에서 Gemini가 운세 리포트를 생성합니다.
처음 아이디어를 떠올렸을 때는 만세력 계산, AI 프롬프트 엔지니어링, 결제 시스템까지 혼자 다 구현하는 게 부담스러웠습니다. AI와 함께했기 때문에 기획부터 배포까지 현실적인 기간 안에 완성할 수 있었습니다.
AI 개발 도구가 빠르게 발전하고 있습니다. 이 글이 AI를 활용한 개발을 시작하려는 분들에게 조금이나마 참고가 됐으면 합니다.
사주.. 또 제가 좋아라하는데!
아이디어를 구체화하는데까지의 그 시간을 ai가 정말 획기적으로 줄여주는것 같아요!