Skip to content

[Feat] 서버 음성 목록과 선택 연동 - #97

Draft
MinHeokChoi wants to merge 1 commit into
feat/#94-server-preference-foundationfrom
feat/#96-account-voice-selection
Draft

[Feat] 서버 음성 목록과 선택 연동#97
MinHeokChoi wants to merge 1 commit into
feat/#94-server-preference-foundationfrom
feat/#96-account-voice-selection

Conversation

@MinHeokChoi

Copy link
Copy Markdown
Contributor

✨ PR 유형

어떤 변경 사항이 있나요??

  • 새로운 기능 추가
  • 버그 수정
  • 사용자 UI 디자인 변경 및 추가
  • 코드에 영향을 주지 않는 변경사항
  • 코드 리팩토링
  • 주석 추가 및 수정
  • 문서 수정
  • 테스트 추가, 테스트 리팩토링
  • 빌드 부분 혹은 패키지 매니저 수정
  • 파일 혹은 폴더명 수정
  • 파일 혹은 폴더 삭제

🛠️ 작업내용

  • bearer GET /tts, PATCH /members/me/tts Target·DTO·RemoteDataSource를
    추가했습니다.
  • 응답의 양수 ttsId, nonempty 필드와 중복 voiceCode를 검증해 account-scoped
    SwiftData catalogue에 upsert합니다.
  • 서버 실패나 빈 account cache에서는 기존 bundled local voice 목록을 사용합니다.
  • local voice 선택을 먼저 저장한 뒤 versioned payload를 coalescing Outbox에
    enqueue하고, authoritative PATCH 응답이 memberId/ttsId/voiceCode와 모두 일치할
    때만 sent 처리합니다.
  • server/local mismatch는 자동 덮어쓰지 않고 사용자가 선택하게 합니다.
  • account 전환 중 이전 catalogue 응답이 새 계정 옵션으로 노출되지 않도록
    post-fetch/current-account guard를 적용했습니다.
  • 표시 이름 기반 자동 매핑을 금지했습니다. Swagger·저장소에 authoritative
    voiceCode→bundled voice 계약이 없어 production 호환표는 의도적으로 비어 있으며
    모든 서버 voice는 현재 incompatible disabled로 표시됩니다.
  • 로그아웃 상태에서는 기존 local voice 선택과 preview를 유지합니다.

검증

  • P7 XCTest: 12 passed
  • 전체 signed 직렬 XCTest: 376 passed, 0 failed/skipped
  • signed Keychain foundation: 14 passed
  • iPhone 16 Simulator Debug build: passed
  • generic iPhone Debug/Release build: passed
  • bash Scripts/check-iphone-functional-gate.sh: passed
  • exact V4 bash Scripts/check-swiftdata-boundary.sh: passed
  • plutil -lint Moru/Info.plist: passed
  • git diff --check: passed
  • 기존 VoiceProfile API 변경: 없음
  • 실제 서버/실제 iPhone: 미검증

📋 추후 진행 상황

  • 서버/제품에서 authoritative voiceCode↔bundled MP3 호환표를 확정해야 실제 서버
    voice 선택을 enable할 수 있습니다.
  • P8에서 서버 루틴 추천과 local fallback을 연결합니다.
  • 서버 음원 생성·다운로드·RoutinePlayer 연결은 계약 대기 범위입니다.

📌 리뷰 포인트

  • 표시 이름·추정 음색으로 server/local voice를 매핑하지 않는지 확인해 주세요.
  • local save가 Outbox enqueue보다 먼저이며 PATCH authoritative success만 sent인지
    확인해 주세요.
  • account 전환 race와 server/local mismatch가 자동 덮어쓰기를 만들지 않는지
    확인해 주세요.
  • 서버 실패·로그아웃에서 기존 bundled voice/preview가 유지되는지 확인해 주세요.

✅ Checklist

  • 커밋 메시지 컨벤션에 맞게 작성했습니다
  • 기존 VoiceProfile·RoutinePlayer·SwiftData V4 계약을 유지했습니다

Closes #96

DO NOT MERGE — v2 stacked PR 일괄 검토 대기

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 80e86771-7337-4f13-abc6-facebeedcf23

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#96-account-voice-selection

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant