Skip to content

다운로드 로직을 리펙토링 합니다.#268

Merged
Kimyonhae merged 6 commits into
devfrom
refactor/download-logic
Jun 2, 2026
Merged

다운로드 로직을 리펙토링 합니다.#268
Kimyonhae merged 6 commits into
devfrom
refactor/download-logic

Conversation

@Kimyonhae

Copy link
Copy Markdown
Collaborator

✨ 작업 요약

한 줄로 무엇을 추가/변경했는지

  • 온디바이스 AI(MLX) 매크로 빌드 에러 해결을 위한 리팩토링 및 다운로드 중복 방지, Whisper 영속성 버그 수정 등 전반적인 온디바이스 인프라 및 앱 설정을 안정화했습니다.

📋 구체적인 내용

  • 추가/변경된 동작:

    1. MLX Downloader / Tokenizer 리팩토링 (매크로 제거)
      • tuist testxcodebuild test 중 컴파일러가 매크로 플러그인(MLXHuggingFaceMacros)을 로딩할 때 발생하는 아키텍처/플랫폼 미스매치 에러(produced malformed response)를 우회했습니다.
      • 매크로가 생성하는 실제 보일러플레이트 코드를 분석 및 추출하여 수동 구현체인 MLXHubDownloader.swiftMLXTokenizerLoader.swift 파일로 온전히 분리했습니다.
      • MLXModelProvider에서 inline 매크로 사용 부분을 지우고 위 독립 파일 구조체들을 호출하도록 리팩토링하여 빌드 의존성 및 코드 가독성을 대폭 끌어올렸습니다.
    2. 온디바이스 다운로드 중복 방지 적용
      • 진행 중인 다운로드 작업은 고유 UUID로 식별하여 새로운 요청 시 기존 작업을 취소(cancel)하도록 개선했습니다.
      • 현재 downloading 상태인 경우 추가 작업 실행 없이 early return 처리하여 안정성을 확보했습니다.
    3. Whisper 모델 영속성(Persistence) 버그 수정 및 로드 타이밍 최적화
      • 디스크 캐시에 없는 잘못된 경로를 참조하여 Single Source of Truth(SSOT)가 깨지는 영속성 오류를 수정하여 추천 모델 상태 검사 및 삭제 동작이 올바르게 매치되도록
        보정했습니다.
      • 기존 화면을 닫을 때(dismiss) 모델을 비동기적으로 해제/로드하던 타이밍에서 녹음 화면에 새로 진입할 때 로드하도록 생명주기 진입 타이밍을 조정하여 리소스
        사용량을 개선했습니다.
    4. 앱 로고 및 아이콘 구성 최적화
      • tuist generate를 실행할 때마다 최상위 루트 디렉토리에 둔 앱 로고가 유실되던 문제를 막기 위해, 리소스를 Resource 내부 경로에 안전하게 안착시키고 Tuist 스킴
        설정을 수정했습니다.
    5. 도메인 모델 경량화 및 스타일 정리
      • OnDeviceStatus 도메인 모델 내 불필요한 runTime 필드를 제거했습니다.
      • 테스트 완주를 방해하던 디버그용 임시 예외(네트워크 실패, unknown) 주석화 처리 및 전반적인 swiftformat 컨벤션을 통일했습니다.
  • 영향 받는 화면/모듈:

    • Data 모듈 (Infrastructure/OnDevice/MLXSupport, Whisper)
    • Domain 모듈 (Entities, Usecases)
    • App 모듈 (녹음 진입 화면 및 Tuist 리소스/아이콘 설정)

🔗 연관 이슈

  • closed #

🧩 설계·구현 노트

왜 이렇게 구현했는지, 대안과 비교한 점 (선택)

  • 선택한 방식

    • 매크로 코드 직접 확장 수동 분리: MLXHuggingFace 라이브러리의 #hubDownloader(), #huggingFaceTokenizerLoader() 매크로 플러그인은 Xcode/SPM/Tuist 아키텍처
      환경에 따라 빌드 불안정성이 매우 큽니다. 매크로의 동작 방식(HubBridge 및 TokenizerBridge 래핑)을 파악하여 독립적인 MLXHubDownloader, MLXTokenizerLoader Swift
      구조체로 선언함으로써 매크로 컴파일 의존성을 100% 제거하고 빌드를 완벽히 안정화했습니다.
    • UUID 기반 다운로드 식별: 다중 요청 시 비동기 레이스 컨디션 및 중복 트래픽 유발 문제를 방지하기 위해 태스크 식별자를 지정하고, 이전 태스크를 안전하게 캔슬 및
      얼리 리턴하는 정석적인 동시성 제어 방식을 택했습니다.
  • 고려했다가 제외한 방식

    • xcodebuild 및 Tuist 캐시 전체 리셋/매크로 컴파일 검증 플래그 추가: 이는 개별 개발자 로컬 환경 및 CI 환경마다 빌드가 오락가락하는 근본적인 문제를 해결하지 못하며,
      협업 환경에서 매번 캐시 제거 작업을 유도해야 하므로 제외했습니다.

✅ 확인 사항

PR 전 직접 확인한 것

  • 정상 플로우 동작 확인 (tuist generate 및 프로젝트 정상 구성 확인)
  • 엣지 케이스 / 빈 값·에러 처리 확인
  • (UI 변경 시) 스크린샷 또는 GIF 첨부
  • (로직 추가 시) 테스트 추가 여부 (tuist test 109개 테스트 통과 완료)

👀 리뷰 포인트

  • 설계·구조 적절성 (매크로 우회용 분리 파일 구조의 명확성)
  • 로직·엣지 케이스 (다운로드 중복 방지 및 cancel 동시성 처리 로직)
  • 예외/에러 핸들링 (Whisper 영속성 오류 해결 및 존재 유무 분기 처리)
  • UI/UX (해당 시)
  • 성능·의존성 (해당 시) (Swift 매크로 의존성 제거를 통한 컴파일 속도 향상 및 빌드 깨짐 방지)

특히 봐줬으면 하는 부분

  • MLXHubDownloader.swiftMLXTokenizerLoader.swift로 깔끔하게 모듈화되어 분리된 파일 배치 구조가 프로젝트 아키텍처 컨벤션과 매끄럽게 어우러지는지 중점적으로
    검토해 주시면 감사하겠습니다.

📚 참고

Kimyonhae added 6 commits June 2, 2026 21:11
- dismisss 아닌 녹음 화면 진입 시
- 존재하지 않는 파일을 찾고 있었기 때문에 source of Trueth 실패
- 추천 모델 까지만 확인하고 삭제도 동일
- 사용하지 않는 핑드 값을 제거합니다.
- 진행중인 다운로드는 UUID 를 통해 식별하여 cancel
- 마지막으로 downloading상태면 return 적용
- 매크로 자동 코드가 SPM에서 tuist test에 계속 빌드 실패로 나와 내부 수동 코드를 직접 파일에 추가했습니다.
@Kimyonhae Kimyonhae self-assigned this Jun 2, 2026
@Kimyonhae Kimyonhae added the 🐛 Bug 크래시, 에러 로그, 예상과 다른 오동작을 수정합니다. label Jun 2, 2026

@gemini-code-assist gemini-code-assist Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Code Review

This pull request removes the runtime state from OnDeviceStatus to simplify model status tracking, replaces compile-time macros with manual implementations for MLXHubDownloader and MLXTokenizerLoader, and refactors download task management in OnDeviceStatusUseCase to better handle cancellations. Feedback on these changes highlights two key issues: first, simplifying the directory check in WhisperKitProvider by removing the vocab.json and config.json checks may cause crashes if a download is incomplete; second, using @MainActor in the progress handler of MLXHubDownloader could degrade UI performance due to excessive main-thread dispatches.

Important

The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.

@tuist

tuist Bot commented Jun 2, 2026

Copy link
Copy Markdown

🛠️ Tuist Run Report 🛠️

Tests 🧪

Scheme Status Cache hit rate Tests Skipped Ran Commit
ChaGok-Workspace 0 % 130 2 128 e8dee42d5

Builds 🔨

Scheme Status Duration Commit
ChaGok-Workspace 4m 26s e8dee42d5

@Kimyonhae Kimyonhae merged commit 3967730 into dev Jun 2, 2026
2 checks passed
@Kimyonhae Kimyonhae deleted the refactor/download-logic branch June 2, 2026 22:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🐛 Bug 크래시, 에러 로그, 예상과 다른 오동작을 수정합니다.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant