[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&sizeListFeatureFlagAuditLogsResponse total 포함). 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로 총페이지가 계산 가능하다