1인 개발자가 클로드코드로 SaaS 11개 만든 기록
시리즈 Claude Code 워크플로 현재 위치 11 / 29
- git worktree로 AI 세션 여러 개를 동시에 돌리기: 브랜치 충돌과 stash 공유 사고를 피하는 운영 규칙
- AI에게 기억을 심는 법: 메모리 파일로 삽질 교훈을 세션 간에 유지하기
- 스킬로 반복 작업 자동화: 이슈 착수부터 종료까지 한 명령으로 묶은 dev-issue 사례
- 코드 그래프(graft)로 AI의 탐색 비용 줄이기: grep/read 대비 토큰 절감 체감
- AI 코드 리뷰를 규칙으로 고정하기
- 반복되는 Git 워크플로우와 브랜치 정리 자동화
- 같은 요청을 여러 저장소에 반복하는 법: 한 줄 프롬프트 + 기준 문서 하나
- 이슈 하나를 한 줄로 개발 끝내는 법 — 내가 가장 많이 쓰는 Claude Code 스킬들
- 블로그 글을 스무 번 부탁하고 나서, 스킬로 만들었다
- 마라톤 세션이 토큰을 먹는 구조: 로그로 찾고, /compact와 서브에이전트로 줄이기
- 1인 개발자가 클로드코드로 SaaS 11개 만든 기록
- 이슈 하나에 30~60분, 어디서 새고 있었나: skill-creator로 dev-issue 스킬을 만든 과정
- 도면을 AI에게 읽히려다 AI를 뺀 이야기
- 스쿼시 머지 vs 머지 커밋: 1인 개발자의 PR 전략
- "난이도가 높아서 오래 걸리는 거야?" — AIFid 개발 기록으로 따져 본 소요 시간
- 엑셀 간편장부를 웹 ERP로 옮기기 (AICassa)
- Impeccable 스킬 적용한 게시글 상세 화면 구조 개선
- CLAUDE.md로 팀 규칙을 AI에게 가르치는 법
- AI티 나는 디자인 패턴 걷어내기: overused-font 훅 오탐 처리와 접근성 대비 수정
- CI4 브랜드 에러 페이지: 설계서 한 장에서 구현까지
- Claude에 MCP로 디자인 툴 붙이기 — DesignCraft·PhotoCraft 설치부터 명함, 카툰 효과까지
- AI 실수 복구: 메인 체크아웃을 dev 상태로 되돌린 기록
- 870줄 CLAUDE.md를 116줄로 줄인 실전 리팩터링
- AI로 AI 강의안을 만들다 — 실용인문학 5·6강 준비기
- Claude Code 토큰 절감 실전: 3개월 로그 분석과 5단계 전략
- 개발 기록을 재료로 AI가 쓰는 블로그 글 만들기
- Claude Vision으로 영수증·세금계산서 자동 장부 입력 구현
- AI가 만든 실제 실수 4가지 패턴과 교훈
- GitHub 이슈·PR 기반의 월간 작업일지 자동 생성 Claude 스킬 만들기
시리즈 제품 개발기 현재 위치 11 / 20
- 엑셀 간편장부를 웹 ERP로 옮기기 (AICassa)
- 혼자 쓰는 맛집 앱 Pagus 만들기
- 감으로 잡던 견적을 코드로: CNC 목공과 AILign 개발 이야기
- AIPicto: 도연님의 그림책을 위한 온라인 구독 플랫폼
- PHP 개발자, TypeScript와 R3F로 3D 가구 배치 앱 만들기
- 녹화형 AI 화상면접 솔루션 기획 노트 — AILego
- AIvance 제품 이름은 왜 라틴어일까: Cassa에서 Cella까지
- 1인 개발자가 11개 SaaS를 운영하는 비밀: 공통 골격과 MSA 분할 전략
- "난이도가 높아서 오래 걸리는 거야?" — AIFid 개발 기록으로 따져 본 소요 시간
- 개별로는 통과하는데 전체에서만 죽는다 — AIFid 테스트 스위트가 composer test를 멈춘 날들
- 1인 개발자가 클로드코드로 SaaS 11개 만든 기록
- 도면을 AI에게 읽히려다 AI를 뺀 이야기
- 팬리스 우분투로 DC 모터를 인터넷에서 제어하기
- 저장소 아키텍처를 archify로 그려 README에 링크한 날
- Apache 403 해결과 php spark 로 슈퍼관리자 자동 발급하기
- UX와 보안을 동시에 잡는 그림책 게스트 열람 방안
- 혼자 하는 유지보수, 단가와 한도를 어떻게 정할까
- SEO + GEO 동시 적용: 정적 페이지에서 AI 검색 노출까지 한 방법
- 코어를 건드리지않고 확장하는 CodeIgniter 4 플러그인 구조와 핵심 설계 포인트
- GitHub 이슈·PR 기반의 월간 작업일지 자동 생성 Claude 스킬 만들기
2026년 10월 20일 · @martin
기획부터 배포·운영까지 혼자 맡으며, AI에게 맡긴 일과 직접 챙긴 일을 어떻게 나눴는지 정리합니다.
다시 코드를 잡기까지
PHP를 26년 가까이 다뤘습니다. CodeIgniter 책을 쓰고, CI Korea 포럼을 운영하고, 여러 행사에서 강연도 했습니다. 그러다 한동안 현업 개발에서 손을 놓고 있었습니다.
약 1년 전, 클로드코드를 계기로 다시 개발을 시작했습니다. 지금은 파주 집 다락방에서 혼자 AIvance라는 이름으로 SaaS 제품을 만들고 있습니다. 그동안 클로드코드로 만든 솔루션이 11개가 되었습니다.
이 글은 그 과정에서 무엇을 AI에게 넘겼고, 무엇은 끝까지 제 손에 남겨뒀는지에 대한 기록입니다.
무엇을 만들었나
제품 이름은 모두 'AI + 라틴어' 규칙으로 지었습니다. 이름을 정하는 규칙 하나만 있어도 제품이 늘어날 때 정체성이 흐트러지지 않습니다.
|
제품 |
한 줄 설명 |
대상 |
|---|---|---|
|
테마·관리자·게시판·소셜로그인을 갖춘 CI4 웹에이전시 솔루션 |
기업 홈페이지·CMS |
|
|
AI로 업무 효율을 높이는 쇼핑몰 솔루션 |
이커머스 |
|
|
성형광고 및 일반 광고 솔루션 |
병의원·광고주 |
|
|
로마의 신원 증표 tessera에서 이름을 딴 토큰 인증 서비스 |
서비스 간 인증 |
|
|
라틴어 licet(허가되다)에서 이름을 딴 온·오프라인 라이선스 인증 서비스 |
소프트웨어 판매자 |
|
|
흩어진 매입·매출을 AI가 정리하는 간편장부 ERP |
간이사업자 |
|
|
AIFid |
고객사 웹사이트에 위젯을 심어 실시간 채팅 상담을 하는 멀티테넌트 SaaS |
고객지원 조직 |
|
AILign |
원자재부터 도면까지 계산하는 목공·CNC 견적 솔루션 |
공방·CNC 업체 |
|
AILego |
적응형 질문과 AI 평가로 인재를 고르는 녹화형 화상면접 솔루션 |
채용 담당자 |
|
AICella |
가구를 2D·3D로 배치하고 동선 여유를 미리 확인하는 룸 플래너 |
일반 소비자 |
|
AIPicto |
그림책 프로젝트 |
(대상) |
제품 라인 밖에서도 "그때그때 생각나서" 만든 것들이 있습니다. varius라는 모노레포에 따로 모아 두었고, 그중 두 개는 실제로 운영 중입니다.
|
프로젝트 |
한 줄 설명 |
상태 |
|---|---|---|
|
구글 포토 사진의 GPS를 추출해 날짜별 이동 동선을 지도에 그려주는 서비스 |
운영 중 |
|
|
카카오 지도 기반 파주 인근 로컬 맛집 지도, 후기·운영자 관리 포함 |
운영 중 |
|
|
rtic |
외부 인터넷과 자택 리눅스 서버를 잇는 WebRTC 양방향 인터콤 |
개인용 |
|
AIvance 회사 홈페이지 |
운영 중 |
제품보다 기반을 먼저 만들었다
11개를 혼자 만들 수 있었던 가장 큰 이유는 첫 제품 전에 공통 기반부터 깔았기 때문입니다.
ci4-board라는 API 보일러플레이트를 한 달 동안 AI와 함께 만들었습니다. JWT 인증, 구글·카카오·네이버 소셜로그인, API 버저닝, Swagger 문서, 다국어, 통합 테스트 149개가 들어 있습니다. 이후 제품들은 이 위에서 출발했습니다.
같은 방식으로 웹 쪽은 AICreo를 기반으로 삼았습니다. 새 제품인 AILign은 AICreo 위에 기능을 플러그인으로 얹는 구조로 설계했습니다.
인증·로그인·문서화 같은 반복 작업을 매번 새로 시키면 AI도 매번 조금씩 다르게 만듭니다. 기반을 고정해 두니 AI가 할 일이 '제품 고유의 기능'으로 좁혀졌습니다.
AI에게 맡긴 일
기준은 단순했습니다. 정답의 형태가 명확하고, 테스트로 검증할 수 있는 일은 AI에게 넘겼습니다.
- 구현 코드 작성: 명세에 따라 컨트롤러, 서비스, 리포지토리 계층을 작성하는 일
- 테스트 작성과 실행: 테스트는 코드가 바뀔 때마다 자동으로 돌도록 설정했습니다
- 레거시 이식: AILicet의 CI3 코드를 CI4로 옮기는 작업
- 문서화: API 문서, README, 명세 초안 정리
- 반복 설정: 가상호스트, 배포 스크립트, 환경 설정 파일
- 리서치 정리: 경쟁 서비스 비교, 모델별 요금 비교 같은 조사
제품 안의 AI 기능도 같은 원칙을 따랐습니다. AICassa의 세금계산서 파싱은 Claude Vision으로 처리하되, Sonnet을 기본으로 쓰고 실패하면 Opus로 넘기도록 구성했습니다. 이를 위해 CI4에 AiService 계층을 두어 모델을 바꿔 끼울 수 있게 했습니다.
직접 챙긴 일
반대로, 틀렸을 때 되돌리기 어렵거나 사업 판단이 들어가는 일은 직접 결정했습니다. AI는 선택지를 펼쳐주는 데까지만 썼습니다.
- 무엇을 만들지: 부동산 분양관리 아이템은 조사까지 했지만 월정액 모델과 맞지 않아 접었습니다. 철강 ERP는 업계 지인 인터뷰로 검증하는 중입니다.
- 아키텍처의 경계: 웹 채팅 상담 솔루션 AIFid는 처음에 Node.js 풀스택으로 구상했습니다. 검토 끝에 어드민과 상담 API는 CI4, 실시간 전송만 Node.js WebSocket이 맡는 하이브리드로 바꿨습니다.
- MVP 범위: AILign은 계산 엔진까지 욕심내지 않고 '견적서 발행 도구'로 시작하기로 했습니다. 공방 대부분이 감으로 견적을 내는 현실을 봤기 때문입니다.
- 과금과 배포 모델: AILign은 설치형이 아닌 호스팅형으로, 플러그인을 일회성·구독·크레딧으로 판매하는 구조로 정했습니다.
- 보안과 인증 정책: AITessera의 토큰 서명 방식(RSA/ECDSA)과 요청 제한(인증 분당 10회, 일반 분당 120회)은 직접 정했습니다.
- 결제 연동: 토스페이먼츠는 계약 전에 샌드박스로 흐름을 직접 확인했습니다.
- 브랜드: 로고, 제품명, 한 줄 소개는 AI의 시안을 참고하되 최종 선택은 제가 했습니다.
정리하면, AI는 '어떻게'에 강하고 저는 '무엇을, 왜'를 붙잡았습니다.
클로드코드와 일하는 방식
혼자 일하면 "이렇게 해줘"를 매번 반복하게 됩니다. 그 반복을 줄이는 장치를 하나씩 쌓았습니다.
- 명세 문서 먼저: 새 프로젝트는 코드보다
docs/SPEC.md와CLAUDE.md(개발지시서)를 먼저 씁니다. AILign은 명세를 v0.3까지 다듬고 나서 개발을 시작했습니다. - CLAUDE.md 계층: 모든 프로젝트에 공통인 규칙은 사용자 수준에, 프로젝트 고유 규칙은 프로젝트 수준에 둡니다. 한국어 응답 일관성도 여기서 잡았습니다.
- 훅:
.claude/settings.json에 PreToolUse·PostToolUse 훅을 걸어 테스트가 자동으로 돌게 했습니다. - 커스텀 스킬: 반복되는 작업은 스킬로 만들었습니다(아래 표). 첫 스킬은 MSA 공통 에러 응답 규약인
api-error-contract입니다. RFC 9457 Problem Details를 기반으로, 에러 코드를..형식으로 통일했습니다. - 서브에이전트와 컨텍스트 관리: 작업 단위를 나누고, 한 세션에 너무 많은 맥락이 쌓이지 않게 관리합니다.
지금 쓰는 스킬들
스킬은 직접 만든 것과 가져다 쓰는 것을 합쳐 10개가 넘습니다. 용도별로 나누면 이렇습니다.
|
분류 |
스킬 |
하는 일 |
|---|---|---|
|
이슈 사이클 |
start-issue |
이슈 요구사항 파악, dev 최신화, feature 브랜치 생성, 관련 파일 미리 탐색 |
|
이슈 사이클 |
dev-issue |
탐색 → 설계 → TDD 구현 → 검증 → PR → 머지 → 이슈 종료를 한 사이클로 |
|
이슈 사이클 |
finish-issue |
PR 생성·머지, 브랜치·워크트리 정리, 이슈 코멘트와 종료, dev 최신화 |
|
이슈 사이클 |
end-issue |
작업 내역을 이슈 코멘트로 남기고 이슈를 닫은 뒤 커밋 |
|
이슈 사이클 |
prune-branch |
병합이 끝난 로컬·원격 브랜치를 PR 상태까지 확인해 정리 |
|
공통 규약 |
api-error-contract |
실패 응답이 생기는 모든 API 작업에 에러 규약 적용 |
|
보안 |
snyk-fix |
보안 취약점 수정 |
|
코드 탐색 |
graft |
저장소 인덱스를 기반으로 탐색 |
|
디자인 |
impeccable |
프론트엔드 화면 설계, UX 리뷰, 다듬기 |
|
문서화 |
archify |
아키텍처·시퀀스·데이터 흐름 다이어그램을 HTML로 생성 |
가장 효과가 큰 것은 이슈 사이클 스킬입니다. start-issue, end-issue, prune-branch 같은 작은 스킬을 먼저 만들고, 이를 엮어 dev-issue와 finish-issue라는 상위 스킬을 만들었습니다. 이제 "이슈 231 개발" 한 줄이면 브랜치 생성부터 이슈 종료까지 한 흐름으로 끝납니다.
스킬에는 저장소만의 사정도 적어 둡니다. 예를 들어 feature → dev를 Squash merge로 합치기 때문에 git branch --merged로는 병합 여부를 알 수 없습니다. 그래서 prune-branch에 PR 상태까지 확인하라고 적어 두었고, AI가 이 함정에 빠지지 않습니다.
여러 제품이 같은 에러 형식, 같은 계층 구조를 쓰게 되니 AI가 만든 코드를 리뷰하는 시간이 눈에 띄게 줄었습니다.
varius 모노레포에서는 한 걸음 더 나갔습니다. 루트와 프로젝트마다 CLAUDE.md와 AGENTS.md를 함께 두어, 클로드코드와 Codex 어느 쪽으로 작업해도 같은 규칙을 따르게 했습니다. 규칙을 도구가 아니라 저장소에 두면, 도구를 바꿔도 일하는 방식은 그대로 남습니다.
가장 규모가 큰 AIFid에서는 품질 게이트를 로컬로 끌어왔습니다. 커밋할 때 PSR-12로 자동 정리하고, dev로 푸시할 때 PHPStan(level 6)과 전체 테스트를 돌리며, main으로의 직접 푸시는 막았습니다. 테스트는 작업 폴더마다 별도 DB를 쓰게 해서, 워크트리 여러 개에서 AI가 동시에 테스트를 돌려도 서로의 스키마를 건드리지 않습니다. 이렇게 해서 CI4 백오피스, Node 채팅엔진, React 상담원 콘솔, Preact 위젯으로 이뤄진 구조를 M0부터 M6까지 로드맵대로 마쳤습니다.
배포와 운영도 혼자
서버는 Ubuntu, 스택은 CI4와 PHP 8.2 이상입니다. 개발 도구는 PhpStorm, 품질 관리는 PHPUnit과 PHPStan을 씁니다.
- 로컬 환경: macOS에 Apache 가상호스트를 구성해 여러 프로젝트를 MSA 형태로 로컬에서 함께 띄웁니다.
- CI/CD: Ubuntu 26.04 서버에 GitHub Actions 셀프호스티드 러너를 직접 띄워 테스트를 돌립니다. 통과하면 ED25519 배포 키와 SSH로 운영 서버에 배포한 뒤 spark 명령까지 실행합니다.
- 운영 서버: aivance.kr 아래 creo, copia, cura 같은 서브도메인으로 제품을 나눠 올렸습니다. PHP는 Ondrej PPA로 8.5까지 올렸습니다.
- 장애 대응: 다른 사이트의 가상호스트 ServerAlias 충돌로 aivance.kr이 엉뚱하게 연결된 적이 있습니다. 원인을 좁히는 데 AI 도움을 받았지만, 운영 서버에서 설정을 고치는 것은 직접 했습니다.
배포 파이프라인을 처음 한 번 제대로 만들어 두니, 이후 제품은 같은 방식을 복사해 쓰면 됐습니다.
돌아보며
1년 전 다시 코드를 잡을 때는 혼자서 제품 하나를 끝까지 만들 수 있을지도 확신이 없었습니다. 지금은 제품 11개가 저장소에 있고, 곁가지로 만든 Iter와 Pagus는 실제로 운영 중입니다. 그 사이 분명해진 것들을 정리합니다.
잘 된 것
- 기반이 속도를 만든다. ci4-board를 만드는 데 한 달을 썼지만, 그 한 달이 이후 모든 제품의 출발점이 됐습니다. AILign은 아예 AICreo 위에 플러그인으로 얹었습니다. 기반을 고정하면 AI의 결과물이 일정해지고, 제품마다 처음부터 다시 시작할 필요가 없습니다.
- 명세가 곧 지시다. AI에게 잘 시키는 능력은 결국 잘 기획하는 능력입니다. AILign은 명세를 v0.3까지 다듬은 뒤 개발을 시작했고, AIFid는 문서로 정한 M0~M6 로드맵을 그대로 따라 끝냈습니다.
- 규칙은 대화가 아니라 저장소에 남긴다. 채팅으로 한 당부는 세션이 끝나면 사라집니다.
CLAUDE.md,AGENTS.md, 훅, 스킬에 적어 둔 규칙은 다음 세션에도, 다른 AI 도구에도 그대로 이어집니다. - 검증은 기계에게, 판단은 사람에게. 코드 정리, 정적 분석, 테스트는 로컬 훅과 셀프호스티드 러너가 빠짐없이 돌립니다. 덕분에 저는 AI가 짠 코드 한 줄 한 줄보다 설계가 맞는지에 시간을 씁니다.
여전히 사람의 몫인 것
- 되돌리기 어려운 결정. 아키텍처의 경계, MVP 범위, 과금 모델, 보안 정책은 AI가 선택지를 잘 펼쳐줘도 결국 제가 정해야 했습니다.
- 무엇을 만들지 고르는 일. 조사까지 마치고 접은 아이템도 있습니다. 철강 ERP처럼 현장의 목소리를 들어야 하는 아이템은 지금도 업계 지인 인터뷰로 검증하고 있습니다.
- 고객을 만나는 일. 만드는 속도는 AI 덕분에 몇 배로 빨라졌습니다. 하지만 고객을 찾고, 쓰게 만들고, 돈을 받는 일은 이제 시작입니다. 다음 기록은 아마 이 이야기가 될 것입니다.
26년의 경험은 어디에 쓰였나
흔히 AI가 경력을 무의미하게 만든다고 합니다. 제 경험은 반대였습니다. 코드를 치는 손은 AI가 대신했지만, 어디서 문제가 터질지 미리 아는 눈은 대신하지 못했습니다. 인증을 어떻게 나눌지, 실시간 처리를 어디까지 PHP로 감당할지 같은 판단은 오래 부딪혀 본 경험에서 나왔습니다. AI는 경험을 대체하지 않았고, 경험이 낼 수 있는 속도를 바꿔 놓았습니다.
지금은 이 경험을 바탕으로 'AI 개발환경 구축 컨설팅'을 준비하고 있습니다. 혼자서도 팀처럼 일하는 방법이 궁금한 분들께 이 기록이 작은 참고가 되었으면 합니다.

댓글 0
아직 댓글이 없습니다. 첫 댓글을 남겨 보세요.