Loading...
Loading...
Frontend Store 전문 생성 스킬. "스토어 만들어줘", "Store 생성", "프론트 상태관리" 키워드로 트리거. Backend API 기반 생성, TDD 검증 필수.
npx skill4agent add peachsolution/peach-harness peach-gen-store당신은 Vue3/Pinia 상태관리 최고 전문가입니다.
- Pinia Option API 스타일 마스터
- TypeScript 타입 시스템 전문가
- API 연동과 상태 동기화 최적화
- test-data.store.ts 패턴의 완벽한 구현┌─────────────────────────────────────────────────────────────────┐
│ 순차 개발 전략에서 peach-gen-store의 역할 │
│ │
│ 전제조건: Backend API 완료 (TDD 통과) │
│ │
│ 1. Backend API 스펙 기반으로 생성 │
│ 2. TDD 검증 필수 (API 연동 테스트) │
│ 3. 출력물 = 확정된 Store 인터페이스 (다음 단계 입력) │
│ 4. AI와 티키타카로 품질 확보 │
│ │
│ 완료 기준: │
│ ✅ vue-tsc 타입 체크 통과 (필수) │
│ ⚪ TDD 테스트 통과 (복잡한 클라이언트 로직 있을 때만) │
└─────────────────────────────────────────────────────────────────┘/peach-gen-store [테이블명] [옵션]| 옵션 | 기본값 | 설명 |
|---|---|---|
| file | N | 파일 업로드 기능 (Y/N) |
| storeTdd | N | Store TDD 액션 생성 (Y/N) - Backend controllerTdd=Y 필요 |
# Backend 파일 존재 확인
ls api/src/modules/[모듈명]/
# API 스펙 확인 (Type 파일)
cat api/src/modules/[모듈명]/type/[모듈명].type.ts⚠️ Backend API가 없습니다!
먼저 /peach-gen-backend [테이블명] 실행하세요.front/src/modules/test-data/type/test-data.type.tsfront/src/modules/test-data/store/test-data.store.tsfront/src/modules/test-data/test/test-data.test.ts# 타입 체크
cd front && bunx vue-tsc --noEmit
# 테스트 실행 (있는 경우)
cd front && bun test src/modules/[모듈명]/test/타입 에러 또는 테스트 실패 시:
1. 에러 원인 분석
2. 코드 수정
3. 다시 검증
4. 통과할 때까지 반복
⚠️ 타입 체크 통과 없이 완료 선언 금지!front/src/modules/[모듈명]/
├── type/[모듈명].type.ts ← Entity, DTO 타입
├── store/[모듈명].store.ts ← Pinia Store
└── test/[모듈명].test.ts ← TDD 테스트 (선택적)useApi().get('/[모듈명]', params)useApi().get('/[모듈명]/list', params)useApi().get('/[모듈명]/' + seq)useApi().get('/[모듈명]/cursor-list')useApi().post('/[모듈명]', data)useApi().put('/[모듈명]/' + seq, data)useApi().patch('/[모듈명]/use')useApi().patch('/[모듈명]/delete')useApi().delete('/[모듈명]/' + seq)// ✅ Pinia Option API 스타일 (권장)
export const use[모듈명]Store = defineStore('[모듈명]', {
state: () => ({
listData: [] as ListItem[],
listTotalRow: 0,
detailData: null as Entity | null,
}),
actions: {
async paging(params: PagingDto) {
const { $api } = useNuxtApp();
const res = await $api.get('[모듈명]/paging', { params });
if (res.value?.data) {
this.listData = res.value.data.list;
this.listTotalRow = res.value.data.totalRow;
}
return res;
},
// ...
},
});
// ❌ Setup 스타일 (사용 금지)
export const use[모듈명]Store = defineStore('[모듈명]', () => {
// ...
});uploadFileLocaluploadFileS3getDownloadUrl?nullundefined_commonlistDatalistTotalRowdetailData┌─────────────────────────────────────────────────────────────────┐
│ ✅ 완료 체크리스트 │
│ │
│ □ bunx vue-tsc --noEmit 통과 (필수) │
│ □ TDD 테스트 통과 (storeTdd=Y인 경우만) │
│ │
│ 위 조건 모두 통과해야 완료! │
│ 실패 시 AI와 티키타카로 수정 │
└─────────────────────────────────────────────────────────────────┘🎉 Frontend Store 생성 완료!
생성된 파일:
├── front/src/modules/[모듈명]/
│ ├── type/[모듈명].type.ts
│ └── store/[모듈명].store.ts
검증 결과:
✅ 타입 체크 통과
📌 확정된 Store 인터페이스:
- use[모듈명]Store()
- state: listData, listTotalRow, detailData
- actions: paging, list, detail, insert, update, updateUse, softDelete
다음 단계:
→ /peach-gen-ui [모듈명] 실행하여 Frontend UI 생성전제조건: Backend controllerTdd=Y 필요 대부분의 Store는 API Wrapper이므로 TDD 불필요. Backend TDD로 충분.
useApi().post('/[모듈명]/tdd/init')useApi().delete('/[모듈명]/tdd/cleanup/' + seq)중요: 선택된 옵션의 참조 파일만 읽으세요! 모든 references를 한 번에 로드하지 마세요.
| 파일 | 용도 |
|---|---|
| store-pattern.md | Pinia Store 구조 |
| type-pattern.md | Entity, DTO 타입 정의 |
| 옵션 | 읽어야 할 파일 |
|---|---|
| file=Y | file-option.md |
| storeTdd=Y | test-pattern.md |
front/src/modules/test-data/api/src/modules/[모듈명]/type/