一键导入
integrate-api-contract
프론트엔드/백엔드 간 REST API 컨트랙트 변경을 통합하는 워크플로우. 한쪽 PR(또는 OpenAPI 변경)을 받아 반대쪽 레포에 반영. backend-fos 전용 (frontend-fos는 integrate-ux 사용).
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
菜单
프론트엔드/백엔드 간 REST API 컨트랙트 변경을 통합하는 워크플로우. 한쪽 PR(또는 OpenAPI 변경)을 받아 반대쪽 레포에 반영. backend-fos 전용 (frontend-fos는 integrate-ux 사용).
用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
基于 SOC 职业分类
| name | integrate-api-contract |
| description | 프론트엔드/백엔드 간 REST API 컨트랙트 변경을 통합하는 워크플로우. 한쪽 PR(또는 OpenAPI 변경)을 받아 반대쪽 레포에 반영. backend-fos 전용 (frontend-fos는 integrate-ux 사용). |
integrate-ux의 backend-fos 변형. UX 디자이너 PR 통합 대신 API 컨트랙트 변경 통합을 다룬다. 트리거 시나리오:
spring-cloud-contract 또는 OpenAPI schema validation 테스트로 회귀 방지# cwd: <backend repo root>
# 프론트엔드 PR을 backend 관점에서 본다
gh -R {frontend-repo} pr view {PR번호} --json title,body,changedFiles
gh -R {frontend-repo} pr diff {PR번호} -- 'src/lib/server/api/**' 'src/services/**' 'src/types/**'
확인할 것:
./gradlew openApi (또는 SpringDoc UI)로 현재 스펙 추출. 직전 main 스펙과 diff:
# cwd: <backend repo root>
./gradlew generateOpenApi
diff -u openapi-spec.previous.json openapi-spec.current.json | head -200
사용자가 명시적으로 "이런 컨트랙트로 frontend·backend 둘 다 만들자"고 시작.
변경 사항을 명시적으로 정리 — docs/api-contract-{plan이름}.md (임시 파일):
## API Contract — {plan이름}
### {METHOD} {path}
- **Request**:
```json
{ "field1": "string", "field2": 123 }
{ "id": "uuid", ... }
INVALID_INPUT), 403 (NOT_FAMILY_MEMBER)@LoginUser 필수
이 파일은 **task 종료 시 삭제** (임시). 영구 보관할 결정은 `docs/adr.md` 또는 `docs/code-architecture.md`로.
### 3. backend 영향 분석
새 엔드포인트인가, 기존 확장인가:
- **새 엔드포인트**: Domain → Infra → Application → Presentation 4 phase
- **응답 스키마 변경**: Response DTO + `static from(Entity)` 변경 — 기존 호출자 영향 grep
- **인증 정책 변경**: `@LoginUser` / `@ValidateFamilyAccess` 적용 위치
```bash
# cwd: <backend repo root>
# 영향받는 Controller / Service / Repository 그리기
grep -rn "{path}" src/main/java/
반드시 논의:
spring-cloud-contract 도입 여부 (프로젝트 정책)docs/data-schema.md — 스키마 변경 반영docs/code-architecture.md — 새 엔드포인트 등록docs/adr.md — 컨트랙트 변경 정책 결정 (예: "v2 prefix vs 비파괴 확장" 등)docs/api-contract-{plan}.md 작성 (task 완료 후 삭제)표준 phase 구조:
| Phase | 내용 | 모델 |
|---|---|---|
| 1 | Domain 변경 (Entity 필드 추가, Value Object) | sonnet |
| 2 | Infra (Flyway 마이그레이션, Repository 구현) | sonnet |
| 3 | Application (Service, @Transactional, Event 발행) | sonnet |
| 4 | Presentation (Controller, Request/Response DTO, SpringDoc 어노테이션) | sonnet |
| 5 | 통합 테스트 (AbstractControllerTest 상속) | sonnet |
| N-1 | ./gradlew test build 검증 + Checkstyle | haiku |
| N | 커밋 + push + frontend 추적 PR/issue 생성 | haiku |
build-with-teams 스킬로 task를 실행한다 (Claude Agent Teams 파이프라인 — 계획/평가/실행/검증).
backend 머지 후 frontend 레포에 추적 작업:
# cwd: <frontend repo root>
gh issue create \
--repo {frontend-repo} \
--title "feat(api): adopt {endpoint} from backend plan{N}" \
--body "..."
또는 frontend 레포에서 별도 /integrate-api-contract Case A 발동.
docs/openapi.json 등) — 다음 PR diff에서 변경 즉시 검출 가능jsonPath assertion)spring-cloud-contract 도입 시 frontend가 stub 사용 가능각 backend plan이 frontend issue/PR과 짝을 이룸:
| backend plan | frontend 추적 |
|---|---|
| plan{N} (backend 새 엔드포인트) | issue#{M} 또는 PR#{M} |
이 매핑은 docs/code-architecture.md 또는 tasks/{plan}/index.json의 새 필드 frontend_tracking에 기록.
backend가 응답에서 필드를 제거 → frontend의 TypeScript 타입은 빌드 시점에 안 잡힘 (서버 응답 스키마는 런타임 확인) → 프로덕션에서 undefined 참조 에러.
해결: 제거 전에 frontend에서 해당 필드 사용을 모두 제거 + deploy. 두 단계 배포 강제.
기존 익명 엔드포인트에 @LoginUser 추가 → 기존 frontend 비로그인 호출이 401.
해결: 새 엔드포인트로 분리 또는 양쪽 동시 배포.
Jackson 정책 변경이 모든 응답에 영향. 매우 위험.
해결: @JsonNaming 클래스별 적용으로 점진 마이그레이션. 전역 정책 변경은 별도 plan으로 분리.
| integrate-ux | integrate-api-contract | |
|---|---|---|
| 적용 레포 | frontend (UI 있음) | backend (또는 양방향) |
| 트리거 | UX 디자이너 PR | 프론트엔드 PR / OpenAPI diff |
| 핵심 작업 | 디자인 → 코드 변환 + Shadcn 통일 | 컨트랙트 정의 → 4-tier 구현 |
| 머지 정책 | rebase + 사용자 PR diff 리뷰 후 | 하위 호환 시 단독, 깨는 변경 시 양쪽 동시 |
| 추적 | UX PR close + 댓글 | 반대 레포 issue/PR 생성 |