Skip to content

[#579] HomeView에 TCA를 적용한다#607

Merged
opficdev merged 21 commits into
developfrom
refactor/#579-HomeView-TCA
Jun 14, 2026
Merged

[#579] HomeView에 TCA를 적용한다#607
opficdev merged 21 commits into
developfrom
refactor/#579-HomeView-TCA

Conversation

@opficdev

@opficdev opficdev commented Jun 14, 2026

Copy link
Copy Markdown
Owner

🔗 연관된 이슈

🎯 의도

  • HomeView의 상태 관리와 presentation 흐름을 HomeFeature 중심의 TCA 구조로 이관
  • 시트·풀스크린커버·웹페이지 입력 동선을 일관된 state/action 기반으로 정리

📝 작업 내용

📌 요약

  • HomeViewModel 제거와 HomeFeature / HomeFeature+Effects / HomeFeature+Dependencies 도입
  • HomeViewCoordinatorStoreOf<HomeFeature> 소유 및 Home 화면 의존성 주입 경로 정리
  • AlertState, SheetState, FullScreenCoverState, CasePathable 적용과 ModalType 제거
  • 웹페이지 입력 흐름의 contentPicker 내부 내비게이션 이동과 URL 입력/추가/삭제/되돌리기 로직의 reducer/effect 이관
  • HomeViewsheet / fullScreenCover 바인딩 구조 정리와 상단 내비게이션 영역·row 패딩 UI 정돈
  • HomeFeature 기준 테스트 지원 코드와 assertion / test case 추가

🔍 상세

  • HomeFeature.Statealert, sheet, fullScreenCover, loading을 두고 Home 화면의 presentation 상태를 TCA state로 통합
  • fetchData를 Todo 카테고리 설정, 최근 수정 Todo, 저장 웹페이지 로드 이펙트 병합 구조로 재구성
  • 최근 수정 Todo 로드, 웹페이지 추가/삭제/되돌리기, 카테고리 순서 저장, 네트워크 상태 관찰을 run 기반 effect로 분리
  • HomeViewCoordinator에서 기존 ViewModel 대신 HomeFeature store를 생성하고, Todo editor / Search feature store 조립 책임만 유지
  • showTodoEditor, showSearchView 같은 bool 제어 제거와 FullScreenCoverState 기반 destination 관리로 변경
  • 웹페이지 입력 화면을 별도 alert/modal 분기 대신 contentPicker 내부 webPageInput destination으로 연결
  • sheetContent, coverContent 분리를 통해 HomeView의 presentation 렌더링 경로를 store scope 기반으로 정리
  • content picker 헤더/row inset, 상단 내비게이션 영역 높이, 뷰 내부 선언 순서를 화면 사용 흐름 기준으로 정리
  • HomeFeatureTests, HomeFeatureTestSupport, HomeFeatureTestAssertions 추가를 통한 fetch, presentation, 카테고리 정렬, 웹페이지 처리, 네트워크 관찰 검증 추가

📸 영상 / 이미지 (Optional)

@opficdev opficdev self-assigned this Jun 14, 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

이번 풀 리퀘스트는 기존 MVVM 패턴의 HomeViewModel을 Composable Architecture(TCA) 기반의 HomeFeature 리듀서로 마이그레이션하는 작업을 수행합니다. 이에 따라 HomeView가 TCA Store와 바인딩되도록 수정되었으며, 테스트 코드 역시 TestStore를 활용하도록 업데이트되었습니다. 리뷰어 피드백에서는 TCA 권장 사항에 따라 뷰에서 다중 액션을 연속으로 보내는 대신 단일 액션을 통해 리듀서 내에서 상태를 일괄 변경하도록 개선할 것과, 불필요한 DispatchQueue.main.async 호출을 제거하여 코드를 단순화할 것을 제안하고 있으며, 이는 모두 타당한 개선 사항입니다.

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.

Comment thread Application/DevLogPresentation/Sources/Home/Home/HomeView.swift
Comment thread Application/DevLogPresentation/Sources/Home/Home/HomeFeature.swift Outdated
Comment thread Application/DevLogPresentation/Sources/Home/Home/HomeView.swift
@github-actions

Copy link
Copy Markdown

❌ iOS CI failed.

Tests failed

Failed schemes:

  • DevLogPresentation (ios-test-Persistence-Presentation)
cd /Users/runner/work/SwiftUI_DevLog/SwiftUI_DevLog/Application/DevLogPresentation
/Users/runner/work/SwiftUI_DevLog/SwiftUI_DevLog/Application/DevLogPresentation/Tests/Home/HomeFeatureTestSupport.swift:269:16: error: cannot find type 'Date' in scope
createdAt: Date = Date(timeIntervalSince1970: 0),
^~~~
/Users/runner/work/SwiftUI_DevLog/SwiftUI_DevLog/Application/DevLogPresentation/Tests/Home/HomeFeatureTestSupport.swift:270:16: error: cannot find type 'Date' in scope
updatedAt: Date = Date(timeIntervalSince1970: 10)
SwiftCompile normal arm64 Compiling\ LoadingFeatureTests.swift,\ CategoryManageFeatureTests.swift,\ HomeFeatureTestAssertions.swift,\ HomeFeatureTestSupport.swift,\ HomeFeatureTests.swift,\ TodoDetailFeatureTests.swift,\ TodoEditorFeatureTestDoubles.swift,\ TodoEditorFeatureTests.swift,\ TodoListFea
SwiftCompile normal arm64 /Users/runner/work/SwiftUI_DevLog/SwiftUI_DevLog/Application/DevLogPresentation/Tests/Common/LoadingFeatureTests.swift (in target 'DevLogPresentationTests' from project 'DevLogPresentation')

Check the uploaded test log artifacts for full diagnostics.

@github-actions

Copy link
Copy Markdown

❌ iOS CI failed.

Tests failed

Failed schemes:

  • DevLogPresentation (ios-test-Persistence-Presentation)
✔ Test "TodayFeature fetchData는 현재 TodayViewModel과 같은 요약과 섹션 상태를 만든다" passed after 0.175 seconds.
◇ Test "현재 TodayViewModel setSectionScope는 동일 탭 재선택 시 all로 되돌린다" started.
✘ Test "현재 TodayViewModel setSectionScope는 동일 탭 재선택 시 all로 되돌린다" recorded an issue at TodayFeatureTestAssertions.swift:38:5: Expectation failed: (fetchUseCaseSpy.queries.map(\.dueDateFilter) → [DevLogCore.TodoQuery.DueDateFilter.withoutDueDate, DevLogCore.TodoQuery.DueDateFilter.withDueDate]) == ([.
± inserted [DevLogCore.TodoQuery.DueDateFilter.withDueDate], removed [DevLogCore.TodoQuery.DueDateFilter.withDueDate]
✘ Test "현재 TodayViewModel setSectionScope는 동일 탭 재선택 시 all로 되돌린다" recorded an issue at TodayFeatureTestAssertions.swift:40:5: Expectation failed: (fetchUseCaseSpy.queries.map(\.sortTarget) → [DevLogCore.TodoQuery.SortTarget.updatedAt, DevLogCore.TodoQuery.SortTarget.dueDate]) == ([.dueDate, .updatedA
± inserted [DevLogCore.TodoQuery.SortTarget.dueDate], removed [DevLogCore.TodoQuery.SortTarget.dueDate]
✘ Test "현재 TodayViewModel setSectionScope는 동일 탭 재선택 시 all로 되돌린다" recorded an issue at TodayFeatureTestAssertions.swift:41:5: Expectation failed: (fetchUseCaseSpy.queries.map(\.sortOrder) → [DevLogCore.TodoQuery.SortOrder.latest, DevLogCore.TodoQuery.SortOrder.oldest]) == ([.oldest, .latest] → [DevLo
± inserted [DevLogCore.TodoQuery.SortOrder.oldest], removed [DevLogCore.TodoQuery.SortOrder.oldest]
✘ Test "현재 TodayViewModel setSectionScope는 동일 탭 재선택 시 all로 되돌린다" failed after 0.087 seconds with 3 issues.
◇ Test "TodayFeature setSectionScope는 현재 TodayViewModel과 같은 토글 동작을 유지한다" started.
✔ Test "TodayFeature setSectionScope는 현재 TodayViewModel과 같은 토글 동작을 유지한다" passed after 0.046 seconds.
◇ Test "현재 TodayViewModel displayOptions 변경은 필터링 결과와 저장 상태를 갱신한다" started.
✘ Test "현재 TodayViewModel displayOptions 변경은 필터링 결과와 저장 상태를 갱신한다" recorded an issue at TodayFeatureTestAssertions.swift:38:5: Expectation failed: (fetchUseCaseSpy.queries.map(\.dueDateFilter) → [DevLogCore.TodoQuery.DueDateFilter.withDueDate]) == ([.withDueDate, .withoutDueDate] → [DevLogCore.TodoQu
± removed [DevLogCore.TodoQuery.DueDateFilter.withoutDueDate]
✘ Test "현재 TodayViewModel displayOptions 변경은 필터링 결과와 저장 상태를 갱신한다" recorded an issue at TodayFeatureTestAssertions.swift:39:5: Expectation failed: (fetchUseCaseSpy.queries.map(\.completionFilter) → [DevLogCore.TodoQuery.CompletionFilter.incomplete]) == ([.incomplete, .incomplete] → [DevLogCore.TodoQu
± removed [DevLogCore.TodoQuery.CompletionFilter.incomplete]
✘ Test "현재 TodayViewModel displayOptions 변경은 필터링 결과와 저장 상태를 갱신한다" recorded an issue at TodayFeatureTestAssertions.swift:40:5: Expectation failed: (fetchUseCaseSpy.queries.map(\.sortTarget) → [DevLogCore.TodoQuery.SortTarget.dueDate]) == ([.dueDate, .updatedAt] → [DevLogCore.TodoQuery.SortTarget.dueD
± removed [DevLogCore.TodoQuery.SortTarget.updatedAt]
✘ Test "현재 TodayViewModel displayOptions 변경은 필터링 결과와 저장 상태를 갱신한다" recorded an issue at TodayFeatureTestAssertions.swift:41:5: Expectation failed: (fetchUseCaseSpy.queries.map(\.sortOrder) → [DevLogCore.TodoQuery.SortOrder.oldest]) == ([.oldest, .latest] → [DevLogCore.TodoQuery.SortOrder.oldest, DevL
± removed [DevLogCore.TodoQuery.SortOrder.latest]
✘ Test "현재 TodayViewModel displayOptions 변경은 필터링 결과와 저장 상태를 갱신한다" recorded an issue at TodayFeatureTestAssertions.swift:42:5: Expectation failed: (fetchUseCaseSpy.queries.map(\.pageSize) → [20]) == [20, 20]

Check the uploaded test log artifacts for full diagnostics.

@opficdev opficdev merged commit f25b2cc into develop Jun 14, 2026
5 checks passed
@opficdev opficdev deleted the refactor/#579-HomeView-TCA branch June 14, 2026 17:43
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.

HomeView에 TCA를 적용한다

1 participant