[FE-03] 피처 플래그 BFF Route Handler (BE 프록시 7종)
작업 내용 (설계 의도)
변경 사항
브라우저 → 동일 출처 BFF → BE 프록시 계층을 구현한다. 레포 관례(app/api/admin/mcp/tokens/route.ts + forwardBeResponse + zodValidationError)를 그대로 따른다. 컴포넌트가 BE를 직접 호출하지 않게 하는 필수 계층(no-direct-fetch). 근거 설계: ../design-fe-web.md “API 연동 표”.
web/app/api/admin/feature-flags/route.ts:GET(?status=&type= → BE로 전달),POST(body를CreateFeatureFlagInputSchema.parse후 forward, ZodError→zodValidationError).web/app/api/admin/feature-flags/[key]/route.ts:GET(상세),PUT(UpdateFeatureFlagInputSchema.parse후 forward).web/app/api/admin/feature-flags/[key]/archive/route.ts:POST.web/app/api/admin/feature-flags/[key]/activate/route.ts:POST.web/app/api/admin/feature-flags/[key]/audit-logs/route.ts:GET(?page=&size=).- 모든 핸들러는
forwardBeResponse("/admin/feature-flags...", {...})로 BE 경로에 프록시. BE 4xx(400/404/409)·5xx·503은 헬퍼가 사용자 메시지로 매핑. JWT는be-client가 쿠키에서 자동 첨부.
롤백
신규 라우트 파일 삭제로 롤백. 기존 BFF 무영향.
의존
- FE-01 (입력 스키마 parse)
다이어그램
처리 흐름
sequenceDiagram participant C as Client 훅 participant B as BFF Route Handler participant BE as Backend C->>B: POST /api/admin/feature-flags {body} B->>B: CreateFeatureFlagInputSchema.parse(body) B->>BE: forwardBeResponse POST /admin/feature-flags BE-->>B: 201 or 400/409 B-->>C: forward (사용자 메시지 매핑)
테스트 케이스
- POST에 유효 body 전달 시 BE로 프록시되고 BE 201 응답이 그대로 forward된다 (be-client mock)
- POST에 percentage>100 body 전달 시 zod 검증 400을 반환하고 BE를 호출하지 않는다
- 깨진 JSON body 전달 시 400을 반환한다
- GET ?status=ARCHIVED 전달 시 쿼리스트링이 BE 경로에 붙어 프록시된다
- BE가 404를 반환하면 404 + 사용자 메시지가 forward된다
- BACKEND_URL 미설정 시 503을 반환한다