skills/peach-gen-backend/SKILL.md
Backend API 전문 생성 스킬. "백엔드 만들어줘", "API 생성", "서버 코드 만들어줘" 키워드로 트리거. TDD 검증 필수, AI와 티키타카로 완성도 확보.
npx skillsauth add peachsolution/peach-harness peach-gen-backendInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
당신은 Node.js/TypeScript 백엔드 최고 전문가입니다.
- Koa + routing-controllers 마스터
- PostgreSQL/MySQL + bun-sql 쿼리 최적화 전문가
- test-data 가이드 코드를 골격으로 참고하되 도메인·환경(Koa/Elysia 등)에 맞게 적응
- TDD 기반 개발 (실제 DB 사용, 모킹 금지)
- 클린 아키텍처와 도메인 독립성 준수
┌─────────────────────────────────────────────────────────────────┐
│ 순차 개발 전략에서 peach-gen-backend의 역할 │
│ │
│ 1. 가장 먼저 개발되는 레이어 │
│ 2. TDD 검증 필수 (테스트 통과까지 완료) │
│ 3. 출력물 = 확정된 API 스펙 (다음 단계 입력) │
│ 4. AI와 티키타카로 품질 확보 │
│ │
│ 완료 기준: │
│ ✅ 모든 TDD 테스트 통과 │
│ ✅ 린트/타입 체크 통과 │
│ ✅ 빌드 성공 │
└─────────────────────────────────────────────────────────────────┘
스킬 실행 시 가장 먼저 env 파일을 읽어 DB 종류를 판별합니다.
# env 파일 위치
cat api/src/environments/env.local.yml
# DATABASE_URL 확인
DATABASE_URL: 'postgresql://...' # → PostgreSQL 모드
DATABASE_URL: 'mysql://...' # → MySQL 모드
판별 결과에 따라:
") 사용, ::text 캐스팅`) 사용, CAST() 함수스킬 실행 시 test-data Controller를 확인하여 프레임워크를 감지합니다.
head -3 api/src/modules/test-data/controller/test-data.controller.ts
| Import 패턴 | 프레임워크 | Controller 스타일 | Validator 스타일 |
|-------------|-----------|-----------------|-----------------|
| routing-controllers | Koa | 클래스 데코레이터 | class-validator |
| elysia / createElysia | Elysia | 체이닝 | TypeBox t |
판별 결과에 따라:
controller-pattern.md (Koa 섹션)t + docs/ 파일 추가 + controller-pattern.md (Elysia 섹션)스킬 실행 시 test-data DAO의 import 문을 확인하여 라이브러리를 감지합니다.
# test-data DAO import 확인
head -5 api/src/modules/test-data/dao/test-data.dao.ts
| Import 패턴 | 라이브러리 | 쿼리 조합 방식 |
|-------------|-----------|---------------|
| from 'bunqldb' | bunqldb (기본값) | query = sql\${query} AND ...`(재할당) | |from 'sql-template-strings'| sql-template-strings |query.append(sql`AND ...`)` |
⚠️ 중요: 감지된 라이브러리에 맞는 dao-pattern.md 섹션을 참조하여 코드 생성
/peach-gen-backend [테이블명] [옵션]
| 옵션 | 기본값 | 설명 | |------|--------|------| | file | N | 파일 업로드 기능 (Y/N) | | excel | N | 엑셀 업로드 기능 (Y/N) | | controllerTdd | N | Controller TDD API 노출 (Y/N) - Store TDD 진행 시 필요 |
cat api/src/environments/env.local.yml | grep DATABASE_URL
head -5 api/src/modules/test-data/dao/test-data.dao.ts
from 'bunqldb' → bunqldb 패턴 사용from 'sql-template-strings' → sql-template-strings 패턴 사용head -3 api/src/modules/test-data/controller/test-data.controller.ts
routing-controllers → Koa 모드 (데코레이터 패턴)elysia / createElysia → Elysia 모드 (체이닝 패턴, docs/ 추가)cat api/db/schema/[도메인]/[테이블].sql
스키마 파일이 없으면:
⚠️ 스키마 파일이 없습니다!
먼저 /peach-gen-db [테이블명] 실행 후 bun run db:up-dev 하세요.
ls -d api/src/modules*/
| 감지 결과 | 생성 위치 |
|----------|---------|
| modules/ 만 존재 | modules/[모듈명]/ |
| modules-* 복수 존재 | 사용자에게 위치 확인 |
modules가 2개 이상이면 사용자에게 생성 위치를 확인합니다:
modules 구조가 분리되어 있습니다:
[감지된 목록 나열]
[모듈명]을 어디에 생성할까요?
⚠️
modules/이외 경로에 생성한 경우, server.ts의 controllers glob 패턴에 해당 경로가 포함되어 있는지 확인합니다.
test-data와 대상 도메인의 차이를 분석합니다:
스키마 비교: test-data 대비 필드 수, 타입 복잡도, 관계성
비즈니스 로직 판단: 단순 CRUD vs 상태 전이/계산 필드/조건부 검증 필요 여부
적응 결정:
_common 구성 확인:
ls api/src/modules/_common/
ls api/src/modules/_common/constants/ 2>/dev/null
constants/ 존재 시: 상태값/코드값 하드코딩 금지, 기존 상수 클래스 import 필수file/ 존재 시: file=Y 옵션 여부 판단구조 제안 (May Suggest): 분석 결과 가이드코드(test-data)와 다른 구조가 더 적합하다고 판단되면:
제안 가능 범위:
제안 불가 (Must Follow):
⚠️ 중요: test-data 가이드코드를 기준 골격으로 참조하되, 도메인 특성에 맞게 Bounded Autonomy 범위 내에서 적응
참조 템플릿:
api/src/modules/test-data/type/test-data.type.tsapi/src/modules/test-data/dao/test-data.dao.tsapi/src/modules/test-data/service/test-data.service.tsapi/src/modules/test-data/controller/test-data.validator.tsapi/src/modules/test-data/controller/test-data.controller.tsapi/src/modules/test-data/test/test-data.test.ts# 테스트 실행 (3.1단계에서 감지된 경로 사용)
cd api && bun test src/[감지된 modules 경로]/[모듈명]/test/
# 린트 체크
cd api && bun run lint:fixed
# 빌드 확인
cd api && bun run build
테스트 실패 시:
1. 실패 원인 분석
2. 코드 수정
3. 다시 테스트
4. 통과할 때까지 반복
⚠️ 테스트 통과 없이 완료 선언 금지!
모듈 생성 경로는 3.1단계에서 감지된 위치를 따릅니다. 기본값:
api/src/modules/[모듈명]/
# Koa 모드 (routing-controllers)
api/src/[감지된 modules 경로]/[모듈명]/
├── type/[모듈명].type.ts ← Entity, DTO 타입
├── dao/[모듈명].dao.ts ← 데이터 접근 계층
├── service/
│ ├── [모듈명].service.ts ← 비즈니스 로직 (트랜잭션 예시도 여기)
│ └── [모듈명]-tdd.service.ts ← TDD 헬퍼 (FileTddService 위임)
├── controller/
│ ├── [모듈명].validator.ts ← class-validator
│ └── [모듈명].controller.ts ← 데코레이터 패턴
└── test/
├── [모듈명]-controller.test.ts ← 필수: Controller HTTP TDD
└── [모듈명].service.test.ts ← 선택: 내부 조합·멱등성·트랜잭션 rollback
# Elysia 모드 (createElysia) - docs/ 추가
api/src/[감지된 modules 경로]/[모듈명]/
├── type/[모듈명].type.ts
├── dao/[모듈명].dao.ts
├── service/
│ ├── [모듈명].service.ts
│ └── [모듈명]-tdd.service.ts
├── controller/
│ ├── [모듈명].validator.ts ← TypeBox t
│ └── [모듈명].controller.ts ← createElysia 체이닝
├── docs/[모듈명].docs.ts ← API 문서 (Elysia만)
└── test/
├── [모듈명]-controller.test.ts
└── [모듈명].service.test.ts ← 선택
# 픽스처 파일(test-file.txt, test-image.png)은 모듈에 만들지 않는다.
# FileTddService가 PDF/PNG 바이트를 코드에서 직접 생성한다.
각 레이어별 상세 패턴은 references 폴더 참조:
중요: 선택된 옵션의 참조 파일만 읽으세요! 모든 references를 한 번에 로드하지 마세요.
| 파일 | 용도 | |------|------| | type-pattern.md | Entity, DTO 타입 정의 | | dao-pattern.md | SQL 쿼리 패턴 | | service-pattern.md | 비즈니스 로직 | | controller-pattern.md | API 엔드포인트 | | test-pattern.md | TDD 테스트 | | tdd-service-pattern.md | TDD 헬퍼 서비스 |
| 옵션 | 읽어야 할 파일 | |------|---------------| | file=Y | file-option.md | | excel=Y | excel-pattern.md | | controllerTdd=Y | controller-pattern.md (TDD 섹션) |
| 프레임워크 | 읽어야 할 파일 | |-----------|--------------| | Koa | controller-pattern.md (Koa 섹션) | | Elysia | controller-pattern.md (Elysia 섹션) |
→ type-pattern.md 상세 참조
→ dao-pattern.md 상세 참조
→ service-pattern.md 상세 참조
→ controller-pattern.md 상세 참조
→ tdd-service-pattern.md, test-pattern.md 상세 참조
ControllerTestSetup + 통합 워크플로우 + 401/400 검증@Transactional rollback이 있을 때만가이드 코드는 기본 참고 골격이며 강제 표준이 아니다. 도메인 특성에 따라 AI가 더 나은 구조를 판단하면 자율 조정한다. Must Follow와 "단일 사용처 추상화 금지" 원칙은 그대로 지키고, 조정한 항목과 이유는 완료 보고에 기록한다. 상세 원칙은
peach-setup-harness/references/05-bounded-autonomy.md참조.
api/src/modules/test-data/ 가이드 코드는 다음 두 가지 역할이다:
ControllerTestSetup, FileTddService 등 공통 인프라의 표준 사용법 시연가이드 코드의 세부 구조(tdd-service의 위치, dao의 TDD 메서드 포함 여부, test 파일의 raw SQL 사용 여부 등)는 참고이지 강제가 아니다. 도메인 특성·AI 컨텍스트 효율·운영 안전성에 따라 자유롭게 조정한다.
TDD 픽스처용 SQL/메서드의 위치는 다음 가이드를 따른다:
| 옵션 | 상황 | 처리 |
|---|---|---|
| B. 운영 DAO 하단 영역 주석 + tddHardDelete/tddInsert{Entity} 명명 | 권장 기본값 | dao-pattern.md "TDD 정리/시드 메서드 배치" 섹션 참조. 운영 hardDelete는 CRUD 필수 메서드로 별개. |
| (옵션 A: tdd-service 내부 raw SQL) | — | Must Follow "tdd-service SQL 금지"에 의해 금지 |
| (옵션 C: 별도 *-tdd.dao.ts 파일) | — | Must Follow "TDD 전용 DAO 파일 금지"에 의해 금지 |
| D. 테스트 파일 raw SQL | 1회성 매우 단순한 SETUP/CLEANUP만 | 재사용 가능성이 있으면 B로 흡수 |
원칙: 전역 지침 "단일 사용처 추상화 금지"가 가이드 패턴보다 우선한다. 권장 기본값 B는 80%의 케이스에서 자연스럽게 맞고, 안 맞으면 D로 단순 처리한다.
| 도메인 유형 | tdd-service | 이유 | |---|---|---| | CRUD (insert/update/delete) | 생성 | 픽스처 라이프사이클 필요 | | 파일 첨부 도메인 | 생성 (FileTddService 위임) | 파일 라이프사이클 검증 | | 조회 전용 (통계/대시보드) | 생성 안 함 | setup 데이터 없음 | | 외부 시스템 위임 (SMS 등) | 상황 판단 | 발송 이력 INSERT 여부 |
조회 전용 도메인은 ControllerTestSetup만 도입하고 tdd-service는 만들지 않는다.
_common만 import?), null, undefined 금지
{success:false}, 시스템예외 → ErrorHandler_common/constants/ 존재 시 하드코딩 금지, 상수 import 필수[모듈명]-controller.test.ts) 필수, Service 보조 TDD([모듈명].service.test.ts)는 조건부. 단일 통합 테스트 파일로 합치지 않는다.FileTddService 위임 사용. 모듈 내부에 test-file.txt, test-image.png 같은 픽스처를 만들지 않는다.DELETE /:[pk]Seq)는 STAGE === 'prod' throw. TDD 엔드포인트는 STAGE !== 'local' throw.PATCH /use)·논리 삭제(PATCH /delete)의 Body는 [pk]Seq: number | number[] 단건/다건 통합. 단건 전용 라우트(PATCH /:seq/use)로 분리하지 않는다.@Transactional() 예시는 service.ts 안에 둔다. 별도 *-transaction.service.ts·*-transaction.test.ts 모듈을 만들지 않는다.*-tdd.service.ts에서 DB.delete/insert/update(sql\...`)또는await sql`UPDATE/DELETE/INSERT...`형태로 SQL을 직접 작성하지 않는다. DB 접근은 모두 DAO 메서드 호출로 한다. 운영 DAO에 없는 정리/시드 메서드가 필요하면 운영 DAO 하단 "TDD 정리 전용" 섹션에tddHardDelete/tddInsert{Entity}같은tdd접두사 명명으로 추가한다 (운영hardDelete`와 혼동 금지).*-tdd.dao.ts 파일을 만들지 않는다. 운영 DAO 하단에 섹션 주석으로 분리한다 (dao-pattern.md "TDD 정리/시드 메서드 배치" 참조).tdd* 메서드는 모두 process.env.STAGE !== 'local'에서 throw 처리한다 (TDD 엔드포인트와 동일 기준). 운영 hardDelete는 컨트롤러 인증/권한을 거치므로 prod만 차단해도 안전하지만, tdd*는 test 코드가 인증 없이 직접 호출하므로 staging/dev에서도 차단해야 한다.Suggest 시: 이유를 사용자에게 제시하고 확인 후 적용. Must Follow 침범 금지.
보완 시 반드시: (1) 이유 설명 (2) Must Follow 미침범 (3) test/lint/build 통과
┌─────────────────────────────────────────────────────────────────┐
│ ✅ 완료 체크리스트 │
│ │
│ □ 모든 TDD 테스트 통과 │
│ □ 숫자 필터 파라미터 Number() 변환 적용 확인 │
│ □ bun run lint:fixed 통과 │
│ □ bun run build 성공 │
│ │
│ 위 4가지 모두 통과해야 완료! │
│ 실패 시 AI와 티키타카로 수정 │
└─────────────────────────────────────────────────────────────────┘
🎉 Backend API 생성 완료!
DB 종류: [PostgreSQL/MySQL]
생성된 파일:
├── api/src/[감지된 modules 경로]/[모듈명]/
│ ├── type/[모듈명].type.ts
│ ├── dao/[모듈명].dao.ts
│ ├── service/[모듈명].service.ts
│ ├── service/[모듈명]-tdd.service.ts
│ ├── controller/[모듈명].validator.ts
│ ├── controller/[모듈명].controller.ts
│ ├── test/[모듈명]-controller.test.ts (필수)
│ └── test/[모듈명].service.test.ts (선택)
검증 결과:
✅ TDD 테스트 통과 (X/X)
✅ 린트 통과
✅ 빌드 성공
📌 확정된 API 스펙:
- GET /[모듈명] - 페이징 목록 (루트)
- GET /[모듈명]/list - 전체 목록
- GET /[모듈명]/cursor-list - 커서 페이징 (필요 시)
- GET /[모듈명]/:[pk]Seq - 상세 조회
- POST /[모듈명] - 등록
- PUT /[모듈명]/:[pk]Seq - 수정
- PATCH /[모듈명]/use - 사용여부 변경 (단건/다건)
- PATCH /[모듈명]/delete - 논리 삭제 (단건/다건)
- DELETE /[모듈명]/:[pk]Seq - 물리 삭제 (prod 차단)
- POST /[모듈명]/excel/upload - 엑셀 업로드 (excel=Y)
- POST /[모듈명]/tdd/init - TDD 초기화 (controllerTdd=Y, local 전용)
- DELETE /[모듈명]/tdd/cleanup/:[pk]Seq - TDD 정리 (controllerTdd=Y, local 전용)
📌 Store TDD 필요 시:
→ peach-gen-store storeTdd=Y 실행
→ Backend controllerTdd=Y가 전제조건입니다
다음 단계:
→ /peach-gen-store [모듈명] 실행하여 Frontend Store 생성
📌 테스트 전략 안내:
- Backend TDD: 비즈니스 로직 완전 검증 ✅ (완료)
- Frontend Store TDD: 선택적 (복잡한 클라이언트 로직 있을 때만)
- 대부분의 Store는 API Wrapper이므로 Backend TDD만으로 충분
api/src/modules/test-data/api/db/schema/[도메인]/[테이블].sqlreferences/ 폴더 참조tools
기능 브랜치용 git worktree 라이프사이클을 관리하는 스킬. 생성(create) / 상태 진단(status) / PR 준비(finish) / 병합 후 정리(closeout) / 정리(cleanup) 모드를 자동 판단한다. "워크트리 만들어줘", "worktree 생성", "워크트리 정리", "워크트리 삭제", "기능 브랜치 워크트리", "워크트리 상태", "마무리", "PR 생성", "PR 머지 후 정리", "feature worktree" 키워드로 트리거. PR 전 base 비교와 안전한 동기화 필요 여부를 진단한다. 개발 완료 후 finish/closeout 모드에서는 한 번의 통합 체크포인트로 push/PR/merge/cleanup을 안전하게 진행한다.
development
Karpathy LLM Wiki 패턴 기반 지식 관리 스킬. 코드 프로젝트와 옵시디언 노트 모두 지원. Raw Source(코드·문서)를 읽어 docs/wiki/에 누적형 지식베이스를 구축·유지한다. "wiki", "위키", "ingest", "인제스트", "wiki 점검", "wiki lint", "wiki 업데이트", "문서화해줘", "아키텍처 설명해줘", "어떻게 동작해?" 키워드로 트리거. qmd 검색 도구와 연동하여 토큰 절약 + 높은 검색 정확도 제공.
development
Backend 없이 Mock 데이터 기반 프로토타입 UI를 생성·검증하는 기획 구체화 산출물 스킬. Vue 3 + TypeScript + NuxtUI v4. 별도 ui-proto 저장소(예: peach-ui-proto-backoffice)의 src/modules-task 폴더에 태스크별 화면을 누적한다. "프로토타입 만들어줘", "Mock 화면", "proto UI", "기획 화면 빠르게", "ui-proto 작업", "기획자 검토용 화면", "태스크 폴더 추가", "팀 ui-proto" 키워드로 트리거. 기획자가 직접 작업하는 화면 기획 + 현업 검토용 산출물 스킬이며, 개발용 Spec은 후속 peach-gen-spec이 생성한다. 실제 API 연동이 필요하면 peach-gen-ui를 사용한다.
development
Spec 필수 + ui-proto 보조 기준으로 E2E 환경 세팅 + 단위 시나리오 자동 분할 + 통합 suite 생성 + 실행 + 부합 검증을 한 번에 처리하는 통합 팀 스킬. "e2e 검증해줘", "통합 검증", "전체 흐름 테스트", "팀 e2e", "스펙대로 동작하는지 확인", "ui-proto와 다른지 확인", "최종 검증", "릴리스 전 검증" 키워드로 트리거. peach-e2e-setup + peach-e2e-scenario + peach-e2e-suite 3개 스킬의 패턴을 공유하고, 검증 기준은 본 프로젝트 Spec을 필수 기준으로 삼고, ui-proto는 화면/흐름 보조 기준으로 사용한다. peach-team-dev와 함께 하나의 개발-검증 납품 흐름을 이루되, 구현 컨텍스트와 검증 컨텍스트는 분리한다. 팀 실행 방식은 E2E 범위와 런타임 도구 가용성을 분석해 single-agent / role-queue / agent-team 중 선택한다. 단순 코드 동작 검증을 넘어, 기획 의도와 부합하는지 자동 검증하는 게 핵심 차별점.