Skip to content

[Refactor] 배경 경로가 계획을 싣는 로직을 전경과 공유하게 한다 - #237

Merged
MinHeokChoi merged 2 commits into
mainfrom
refactor/tts-plan-publication
Sep 24, 2026
Merged

MinHeokChoi merged 2 commits into
mainfrom
refactor/tts-plan-publication

Conversation

@MinHeokChoi

Copy link
Copy Markdown
Contributor

✨ PR 유형

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

  • 코드 리팩토링

스택 PR 5/5 · base: test/foreground-preparation-branches

🛠️ 작업내용

[Refactor] 배경 경로가 계획을 싣는 로직을 전경과 공유하게 한다

prepareNow의 꼬리 28줄이 publishPreparedPlan을 인라인으로 한 벌 더 갖고
있었다. 둘 다 "시작할 때 잡아 둔 단계와 실을 때의 단계를 견줘서, 내려받는
동안 로컬이 바뀌었으면 싣지 않는다"를 한다. 한쪽만 고치면 배경으로 데운
안내와 재생 직전에 데운 안내가 서로 다른 기준으로 실린다.

그냥 호출로 바꾸면 동작이 달라진다. publishPreparedPlan은 실패를 Bool로만
알려 주는데, 두 실패는 뜻이 다르다. 로컬 단계가 바뀌었거나 사라졌으면 들고
있던 계획은 틀린 것이라 버려야 하고, 저장소 읽기가 잠깐 실패한 것뿐이면
버리면 안 된다 — 버리면 다음 재생에서 안내가 통째로 없어진다. prepareNow는
이 둘을 구분하고 있었고 publishPreparedPlan은 아니었다.

그래서 PlanPublication(published / rejectedStalePlan / unavailable)을 두고
두 호출자가 각자 해석하게 했다. 전경은 어느 실패든 "지금 들려줄 수 없다"로
같으므로 기존 동작 그대로다.

한계를 적어 둔다. rejectedStalePlan이 배경에서 계획을 버리는 동작은 테스트로
고정하지 못했다.
이 가드는 다운로드가 진행되는 동안 로컬이 바뀐 경우에만
작동하는데, 그 상황에서 localAudioURLs는 지문 불일치로 어차피 nil을 돌려주므로
버리든 말든 밖에서 구별되지 않는다. 시도한 테스트가 변이를 잡지 못해 지웠다 —
무는 게 없는 테스트는 없느니만 못하다. 이 분기는 이번 변경 전에도 덮여 있지
않았고, 동작은 코드를 읽어 보존했다.

Co-Authored-By: Claude noreply@anthropic.com

규모 — 1 file changed, 44 insertions(+), 38 deletions(-)

📋 추후 진행 상황

prepareNow와 prepareForegroundNow의 앞부분(바인딩 조회·원격 요청)이 아직 갈라져 있습니다. 다만 그쪽은 실패 의미가 정당하게 다르므로(배경은 스텝 단위로 계속, 전경은 첫 문제에서 즉시 반환) 무리해서 합치면 조건부가 늘어납니다. 별도 판단이 필요합니다.

📌 리뷰 포인트

동작이 바뀌지 않았는지 확인해 주세요. publishPreparedPlan이 실패를 Bool로만 알려 주던 것을 3-케이스로 바꿨습니다. 두 실패의 뜻이 다르기 때문입니다 — 로컬 단계가 바뀌었으면 들고 있던 계획을 버려야 하고, 저장소 읽기가 잠깐 실패한 것뿐이면 버리면 안 됩니다(버리면 다음 재생에서 안내가 통째로 사라집니다).

전경은 어느 실패든 결과가 같아 기존 동작 그대로입니다.

한계를 밝힙니다. rejectedStalePlan이 배경에서 계획을 버리는 동작은 테스트로 고정하지 못했습니다. 이 가드는 다운로드 중에 로컬이 바뀐 경우에만 작동하는데, 그 상황에서 localAudioURLs는 지문 불일치로 어차피 nil을 돌려주므로 버리든 말든 밖에서 구별되지 않습니다. 시도한 테스트가 변이를 잡지 못해 지웠습니다 — 무는 게 없는 테스트는 없느니만 못합니다. 이 분기는 변경 전에도 덮여 있지 않았고, 동작은 코드를 읽어 보존했습니다.

✅ Checklist

  • 커밋 메시지 컨벤션에 맞게 작성했습니다
  • 유지-보수를 위해 주석처리를 잘 작성하였는가?

검증: 시뮬레이터 smoke 1,067개 통과(실패 0, 실기기 전용 3건 skip). 정적 게이트 3종 통과.

앞 PR이 머지되면 이 PR의 base는 자동으로 main이 된다. 순서대로 머지한다.

🤖 Generated with Claude Code

MinHeokChoi and others added 2 commits September 12, 2026 21:42
prepareForegroundNow는 여섯 갈래로 끝나는데, 그 enum은 private이라 밖에서
볼 수 없다. 그래서 각 갈래를 만들어내는 입력과 밖으로 드러나는 결과를 짝지어
고정했다. prepareNow와 합치기 전에 이 여섯이 서 있어야 한다.

  .prepared               → 바인딩·응답·캐시가 다 있을 때
  .unavailable            → 바인딩도 서버로 보낼 의도도 없을 때 (로컬 루틴)
  .pendingBinding         → 그룹 생성이 큐에 올라가 바인딩을 기다릴 때
  .pendingGeneration      → 서버가 아직 만들고 있을 때
  .retryableRemoteRequest → 상태 조회가 실패했을 때
  .retryableDownload      → 내려받기가 실패했을 때

뒤의 네 갈래는 밖에서 모두 .retryablePending으로 보인다. 그래서 단언만으로는
엉뚱한 갈래로 가도 통과한다. 변이로 확인했다 — 네 갈래를 하나씩 .unavailable로
바꿔 보니 각각 제 테스트가 잡았고, 그룹 바인딩 대기 분기를 지웠을 때도 그렇다.
확인 뒤 제품 코드는 원복했다.

실패를 만들 수단이 없어 스텁 둘을 보강했다. WarmupRemoteStub.failAllResponses와
FailingWarmupDownloader. 이 둘이 없어서 마지막 두 갈래는 여태 한 번도 실행되지
않았다.

스모크 1,067개 통과.

Co-Authored-By: Claude <noreply@anthropic.com>
prepareNow의 꼬리 28줄이 publishPreparedPlan을 인라인으로 한 벌 더 갖고
있었다. 둘 다 "시작할 때 잡아 둔 단계와 실을 때의 단계를 견줘서, 내려받는
동안 로컬이 바뀌었으면 싣지 않는다"를 한다. 한쪽만 고치면 배경으로 데운
안내와 재생 직전에 데운 안내가 서로 다른 기준으로 실린다.

그냥 호출로 바꾸면 동작이 달라진다. publishPreparedPlan은 실패를 Bool로만
알려 주는데, 두 실패는 뜻이 다르다. 로컬 단계가 바뀌었거나 사라졌으면 들고
있던 계획은 틀린 것이라 버려야 하고, 저장소 읽기가 잠깐 실패한 것뿐이면
버리면 안 된다 — 버리면 다음 재생에서 안내가 통째로 없어진다. prepareNow는
이 둘을 구분하고 있었고 publishPreparedPlan은 아니었다.

그래서 PlanPublication(published / rejectedStalePlan / unavailable)을 두고
두 호출자가 각자 해석하게 했다. 전경은 어느 실패든 "지금 들려줄 수 없다"로
같으므로 기존 동작 그대로다.

한계를 적어 둔다. rejectedStalePlan이 배경에서 계획을 버리는 동작은 **테스트로
고정하지 못했다.** 이 가드는 다운로드가 진행되는 동안 로컬이 바뀐 경우에만
작동하는데, 그 상황에서 localAudioURLs는 지문 불일치로 어차피 nil을 돌려주므로
버리든 말든 밖에서 구별되지 않는다. 시도한 테스트가 변이를 잡지 못해 지웠다 —
무는 게 없는 테스트는 없느니만 못하다. 이 분기는 이번 변경 전에도 덮여 있지
않았고, 동작은 코드를 읽어 보존했다.

Co-Authored-By: Claude <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Sep 12, 2026 •

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Advanced

Run ID: a215cc45-03d8-46b0-a6e6-679b0ae3fb05


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

@MinHeokChoi
MinHeokChoi changed the base branch from test/foreground-preparation-branches to main September 23, 2026 23:59
@MinHeokChoi
MinHeokChoi merged commit 86c3800 into main Sep 24, 2026
5 checks passed
@MinHeokChoi
MinHeokChoi deleted the refactor/tts-plan-publication branch September 24, 2026 00:00
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