Skip to content

♻️ [Refactor] Watch 앱이 ActivityDomain 출석 UseCase 사용 — 일정 모델 공용 위치 확정 (#1212) - #1279

Open
JEONG-J wants to merge 1 commit into
developfrom
refac/1212
Open

♻️ [Refactor] Watch 앱이 ActivityDomain 출석 UseCase 사용 — 일정 모델 공용 위치 확정 (#1212)#1279
JEONG-J wants to merge 1 commit into
developfrom
refac/1212

Conversation

@JEONG-J

@JEONG-J JEONG-J commented Aug 30, 2026

Copy link
Copy Markdown
Contributor

🔗 관련 이슈

Closes #1212

✨ PR 유형

♻️ Refactor — 모듈 경계/의존성 정리 (기능 동작 변경 없음, watchOS 지원 축 확장)

📷 스크린샷 or 영상(UI 변경 시)

해당 없음 — 워치 출석 목록 화면이 추가되었지만 디자인 토큰(CoreDesignSystem)이 iOS 전용이라 SwiftUI 기본 스타일로만 뼈대를 세운 상태입니다. 워치 전용 토큰·비주얼은 #1205 에서 확정되며, 그때 스크린샷을 붙일 수 있습니다.

🛠️ 작업내용

1. 결론 — 일정 모델은 옮기지 않는다 (플랫폼 축만 넓힌다)

이슈의 핵심 질문은 "출석 UseCase 와 일정 모델의 공용 위치를 어디로 확정할 것인가" 였습니다. 세 가지 안을 검토한 뒤 (A) 모델을 옮기지 않고 Domain 타겟의 지원 플랫폼만 넓히는 안을 택했습니다.

내용 판단
A (채택) HomeDomain·NoticeDomain·CoreDomainDomain 타겟만 [.iPhone, .appleWatch] 로 개방 파일 이동 0건, #981 경계 유지
B 일정 모델을 CoreDomain 으로 승격 import HomeDomain 66개 파일 연쇄 수정 + "Home* 단일 소유자" 경계 파괴
C CoreScheduleDomain 신설 #981 이 명시적으로 부결한 "전용 Schedule 모듈 신설" 그 자체

근거는 실측입니다. 세 모듈의 Domain 소스는 Foundation / UMCFoundation / NoticeDomain / SwiftData 만 import 하고 있어(UIKit·MapKit·StoreKit·Moya 0건) watchOS 제약이 없었고, UMCFoundation 은 이미 멀티플랫폼으로 watchOS 빌드가 통과하는 상태였습니다. Data·Presentation 타겟은 Moya·MapKit 의존이 있으므로 iOS 전용 그대로 둡니다.

2. 잠복해 있던 watchOS 링크 실패 해소

ActivityDomain 은 destinations 에 .appleWatch 를 선언해 두고도 HomeDomain·CoreDomaincondition: .when([.ios]) 로만 의존하고 있었습니다. 정작 소스 7개 파일이 import HomeDomain#if os(iOS) 가드 없이 사용해서, 워치 타겟이 링크하는 순간 깨지는 상태였습니다. 변경 전 실제로 재현했습니다.

error: unable to resolve module dependency: 'HomeDomain'
error: unable to resolve module dependency: 'CoreDomain'
** BUILD FAILED **

domainExtraDependencies / domainTestDependencies.when([.ios]) 조건 4곳을 제거해 해소했습니다.

3. 출석 시간대 판정을 순수 함수로 추출 — 워치가 같은 규칙을 실행

ChallengerAttendanceUseCase.isWithinAttendanceTime 안에만 있던 판정 로직을 AttendanceTimeWindow 의 이니셜라이저 3종으로 꺼냈습니다.

  • init(startsAt:endsAt:isAllDay:now:) — 클라이언트 상수(AttendancePolicy) 폴백 규칙. 기존 UseCase 본문과 분기까지 동일합니다.
  • init(policy:startsAt:endsAt:isAllDay:now:) — 서버 정책(checkInStartAt/onTimeEndAt/lateEndAt) 우선, nil 이면 위로 폴백
  • init(schedule:now:)ScheduleDetailData 편의 진입점

UseCase 는 이제 이 이니셜라이저에 위임만 합니다. 동작은 그대로이고, 판정 규칙의 소스가 하나로 모였습니다.

이 구조 덕분에 워치는 Repository·네트워크 스택(iOS 전용 ActivityData)을 조립하지 않고도 iOS 와 문자 그대로 같은 도메인 규칙을 실행합니다.

4. 워치 출석 화면이 실제로 ActivityDomain 을 호출

UMCWatchAppActivityDomain·HomeDomain 을 링크하고, WatchAttendanceViewModel.timeWindow(for:now:)AttendanceTimeWindow(schedule:now:) 를 직접 호출합니다. 스텁이 아니라 실제 도메인 호출이며, apply(schedules:)#1210/#1207 의 WatchConnectivity 수신부가 그대로 꽂히는 이음매입니다. ContentView 는 이 화면을 띄우도록 바꿨습니다.

5. 검증

# 명령 결과
1 tuist generate --no-open 성공
2 ActivityDomain @ watchOS Sim 빌드 BUILD SUCCEEDED (변경 전 FAILED)
3 UMCWatchApp @ watchOS Sim 빌드 BUILD SUCCEEDED
4 UMCApp @ iPhone 17 Pro 빌드 BUILD SUCCEEDED
5 cd UMCApp && make test TEST SUCCEEDED (ActivityDomain 233 tests / 43 suites 포함)

판정 로직 테스트 15종(경계값·종일 일정·정책 nil 폴백 동치성·위임 경로)을 새로 추가했습니다.

6. 문서

docs/claude/build-and-modules.md 의 "경계 정책 — 일정(Schedule)" 을 (#981 확정 · #1212 갱신) 으로 넓히고, 어떤 타겟이 왜 watchOS 로 열렸는지 표로 정리한 플랫폼(destination) 정책 절을 새로 넣었습니다.

📋 추후 진행 상황

이 PR 은 경계 확정과 재사용 경로 확보까지입니다. 다음은 형제 이슈가 이어받습니다.

사람만 할 수 있는 잔여 작업(서명·디자인 승인 등)은 없습니다.

📌 리뷰 포인트

  1. 플랫폼 개방 범위가 맞는지Domain 타겟만 열고 Data·Presentation 은 iOS 로 두는 선이 적절한지. NoticeHomeDomainNoticeDomain 에 의존해서 딸려 열렸습니다.
  2. 판정 로직 추출이 동작 보존인지ChallengerAttendanceUseCase 의 기존 본문과 init(startsAt:endsAt:isAllDay:now:)isAllDay 분기까지 동일한지 대조 부탁드립니다. ChallengerAttendanceViewModel 은 호출 횟수를 검증하는 기존 테스트가 있어 의도적으로 손대지 않았습니다.
  3. ♻️ [Refactor] WatchConnectivity 도메인 페이로드 계약 정의 · 양방향 수신 경로 구현 (#1210) #1274 와의 충돌 회피Core/WatchConnectivity 무수정 방침이 맞는지.

✅ Checklist

PR이 다음 요구 사항을 충족하는지 확인해주세요!!!

- 일정 모델을 옮기지 않고 HomeDomain·NoticeDomain·CoreDomain 의 Domain 타겟을
  [.iPhone, .appleWatch] 로 개방 — #981 의 "Home* 단일 소유자" 경계 유지
- ActivityDomain 의 HomeDomain·CoreDomain 조건부 의존(.when([.ios])) 제거로
  watchOS 링크 실패(unable to resolve module dependency) 해소
- AttendanceTimeWindow 시간대 판정을 순수 이니셜라이저로 추출하고
  ChallengerAttendanceUseCase 가 위임 — 판정 규칙 단일 소스화(동작 불변)
- UMCWatchApp 이 ActivityDomain·HomeDomain 을 링크하고 출석 목록 화면에서
  AttendanceTimeWindow(schedule:now:) 를 직접 호출
- 판정 로직 테스트 15종 추가 · 경계/플랫폼 정책을 build-and-modules.md 에 반영
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔨 Refactor 코드 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

♻️ Refactor: Watch 앱이 ActivityDomain 출석 UseCase 사용 — 일정 모델 공용 위치 확정

1 participant