[BE-08] 관리 REST API Controller (FeatureFlagAdminApiController)
작업 내용 (설계 의도)
변경 사항
운영자용 플래그 CRUD·상태전이·감사 조회 REST API(FR-7·FR-8). 근거 TDD: ../TDD.md API 계약. base /admin/feature-flags → 기존 SecurityConfig /admin/** hasRole("ADMIN")가 이미 커버(SecurityConfig 변경 불필요). actor는 SecurityContext principal.id를 command에 주입.
FeatureFlagAdminApiController(~ApiController.kt): POST(생성 201)·GET 목록(?status&type,FeatureFlagResponse[]배열)·GET 상세·PUT 수정·POST archive·POST activate·GET audit-logs(?page&size→ListFeatureFlagAuditLogsResponsetotal 포함). Request→Command 변환 후 UseCase 호출, Response 그대로 반환(Entity 직접 반환 금지).- Request DTO:
CreateFeatureFlagRequest·UpdateFeatureFlagRequest(strategy strategyType 판별 역직렬화 — Jackson@JsonTypeInfo/@JsonSubTypes또는 커스텀).toCommand(actorUserId). - 상태코드: 201/200/400(검증)/404/409(상태 충돌) — 예외는 BusinessException→GlobalExceptionHandler 자동 매핑.
의존
- BE-05 (UseCase·Command·Response)
다이어그램
클래스 의존
flowchart LR Controller["FeatureFlagAdminApiController"] --> CreateUC["CreateFeatureFlagUseCase"] Controller --> UpdateUC["UpdateFeatureFlagUseCase"] Controller --> ArchiveUC["ArchiveFeatureFlagUseCase"] Controller --> ActivateUC["ActivateFeatureFlagUseCase"] Controller --> GetUC["GetFeatureFlagUseCase"] Controller --> ListUC["ListFeatureFlagsUseCase"] Controller --> AuditUC["GetFeatureFlagAuditLogsUseCase"]
테스트 케이스 (MockMvc)
- POST /admin/feature-flags는 유효 요청에 201과 FeatureFlagResponse를 반환한다
- percentage>100 요청은 400을 반환한다
- 중복 key 생성 요청은 400을 반환한다
- GET 목록은 플래그가 없을 때 빈 배열을 반환한다
- GET /{key}는 없는 키에 404를 반환한다
- POST /{key}/archive는 이미 ARCHIVED면 409를 반환한다
- PUT /{key}는 strategyType 판별로 전략을 갱신한다(GLOBAL_TOGGLE→PERCENTAGE_ROLLOUT)
- GET /{key}/audit-logs는 content·totalElements·totalPages를 담은 페이지 응답을 최신순으로 반환한다
- GET /{key}/audit-logs는 page·size 쿼리로 페이지네이션되고 total로 총페이지가 계산 가능하다