Skip to content

[Feat] [운세] Fortune 홈 후속 상세 및 사주풀이 3종 구현 (#79) - #94

Merged
seungwone merged 16 commits into
releasefrom
feature/79-fortune-home-followups
Aug 15, 2026
Merged

seungwone merged 16 commits into
releasefrom
feature/79-fortune-home-followups

Conversation

@seungwone

@seungwone seungwone commented Aug 14, 2026 •

Copy link
Copy Markdown
Collaborator

변경 내용

  • DesignSystem
    • 만세력 천간·지지와 오행 테마, 음양 기호를 계산해 표시하는 DSSajuPillarCell을 추가하고, 명세·플레이그라운드·스펙 테스트를 등록했습니다.
  • FortuneFeature
    • 운세 리포트와 카테고리별 상세운 바텀시트, 상대방 궁합·택일·연도별 운세의 화면, TCA 상태, FortuneClient DTO/Live API 연동을 구현했습니다.
    • 프로필 수정 뒤 궁합의 내 사주를 즉시 다시 조회하고, 재조회에 실패하면 기존 정보는 유지하면서 오류 배너를 표시합니다.
    • 사주 입력 CTA 컨테이너는 투명하게 유지하고, disabled 버튼은 DesignSystem 기본 불투명 표면을 사용합니다.
  • App 조립 및 라우팅
    • 궁합의 내 정보 변경은 탭 전환 없이 App 레이어에서 동일 Fortune 흐름 위 MyPageEditView를 제시합니다.
    • 저장 성공은 profileUpdated delegate를 통해 현재 Compatibility path의 mySajuRefreshRequested로 전달합니다.

설계 결정

  • DSSajuPillarCell은 MyPage와 Fortune 사이의 Feature 구현체 의존성을 만들지 않도록 DesignSystem 공용 컴포넌트로 분리했습니다.
  • 화면 전환과 오버레이 조립은 App(MainTab)에 두고, Fortune과 MyPage는 delegate 및 Interface 계약으로만 연결했습니다.

테스트

  • tuist generate --no-open
  • xcodebuild build-for-testing ... -scheme FortuneFeature
  • xcodebuild test-without-building ... -scheme FortuneFeature -only-testing:FortuneFeatureTests
  • xcodebuild build-for-testing ... -scheme Todakun
  • xcodebuild test-without-building ... -scheme Todakun -only-testing:TodakunTests/MainTabFeatureTests
  • mise exec -- swiftlint lint --strict --config .swiftlint.yml
  • ./scripts/sync-and-validate.sh
  • MainTabFeatureTests, FortuneFeatureTests, FortuneFollowupFeatureTests, MyPageFeatureTests의 관련 상태 전이 테스트 보강
  • 실제 서버 데이터 기준 화면 렌더링·스크롤·80% 바텀시트·탭 이동은 사용자 수동 검증 예정

PR Preflight Review

  • Status: Completed
  • Mode: 기존 Full Review + 독립 gpt-5.6-sol high 읽기 전용 리뷰
  • Accepted findings:
    • 사주 재조회 실패 시 이전 데이터를 조용히 유지하던 경로에 오류 배너와 회귀 테스트 추가
  • Confirmed:
    • App만 Fortune/MyPage 조립과 탭 이동을 소유하며 Feature 구현체 간 직접 import가 없습니다.
    • 성공 경로의 myInfoEditRequested → presentEdit → profileUpdated → mySajuRefreshRequested 상태 전이가 연결돼 있습니다.
    • CTA 투명 컨테이너와 DesignSystem disabled 버튼의 불투명 표면이 함께 유지됩니다.
  • Residual risk:
    • 내 정보 로딩 중 궁합 화면을 먼저 이탈하는 경합과 API 요청 중 interactive pop의 취소 처리는 실제 기기에서 추가 확인이 필요합니다.

제외 범위 및 후속 작업

  • 실제 공유, EventKit 캘린더 내보내기, 홈 알림 화면은 이 PR 범위에서 제외합니다.
  • 캘린더는 진행 중인 별도 이슈 #93을 침범하지 않습니다.
  • 토닥이·행운 액션은 탭 이동만 제공하며 목적 화면 구현은 후속 범위입니다.

연결된 이슈

체크리스트

  • 필요한 빌드·단위 테스트·정적 검증을 실행했습니다.
  • 아키텍처 검증을 통과했습니다.
  • PR 독립 리뷰를 수행했습니다.
  • 실제 기기 UI 수동 검증이 필요합니다.

- AuthSession 모듈 의존성을 ComposableArchitecture에서 경량 Dependencies로 교체
- DesignSystem bell 아이콘 svg 파일명 대소문자 매핑 불일치 수정
- 사주 만세력 기둥 천간/지지 및 오행 컬러를 표시하는 DSSajuPillarCell 구현
- DSSajuElement 오행(목·화·토·금·수) 테마 및 음양 표기 지원
- Figma 명세 문서(Docs) 및 Example 플레이그라운드·카탈로그 등록
- DesignSystemTests에 Specification 매핑 단위 테스트 추가
- 카테고리별 상세운 바텀시트(FortuneCategoryDetailView) UI 및 레이아웃 구현
- 행운 아이템(클로버), 주의 아이템(경고), AI 토닥이 플로팅 버튼 3D 에셋 추가
- 상대방 궁합(CompatibilityView) 내 정보/상대방 사주 및 결과 화면 구현 (#81)
- 택일 운세(DayFortuneView) 목적 및 날짜 선택, 결과 화면 구현 (#80)
- 연도별 운세(YearFortuneView) 연도 선택 및 결과 화면 구현 (#82)
- FortuneClient Live 엔드포인트 연동 및 DTO 매핑 구현 (#84)
- 마이페이지 및 궁합 화면에 DSSajuPillarCell 적용
- CompatibilityFeature 내 정보 변경 액션을 상위 FortuneFeature 델리게이트로 연결 (#83)
- MainTabFeature에서 myPageRequested 수신 시 마이페이지 탭으로 전환 처리
- FortuneCategoryDetailFeature todakRequested delegate 상위 라우팅 누락 수정
- CompatibilityFeature 초기화/목록 조회 Effect에 CancelID 및 취소 방어 적용
- DSSajuPillarCell 10천간 12지지 22자 음양(+/-) 동적 계산 로직 추가
- FortuneCategoryDetailView 하드코딩된 RGB 색상을 Color.ds 토큰으로 대체
- DSSajuPillarCell 22자 오행 파싱 및 MainTab/FortuneFeature 델리게이트 단위 테스트 보강
@seungwone seungwone self-assigned this Aug 14, 2026
@coderabbitai

coderabbitai Bot commented Aug 14, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 074c603d-454b-4a34-88d8-736c29666093

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

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.

@github-actions github-actions Bot added the enhancement 기능 개발, 리팩토링, 설정 변경 등 전반적인 작업 label Aug 14, 2026
@seungwone
seungwone changed the base branch from main to release August 14, 2026 15:03
- FortuneReportView reportBody 본문에 categorySection(detail) 추가
- 상대방 등록 API 전송 시 동료 관계 코드를 COLLEAGUE로 수정
- 시간 모름 시 birthTime 값을 UNKNOWN으로 전송하도록 수정 및 불필요한 isTimeUnknown 필드 제거
- 궁합 결과 화면의 사주 구조도를 Grid 레이아웃으로 변경하여 가변 이름 지원 및 컬럼 밀림 방지
- 상대방 선택 휠피커 바텀시트 추가 버튼 복원 및 닫힘 시 커밋 UX 적용
- DSSajuBasicFieldsView 컴포넌트 신규 구현을 통해 성별, 음/양력, 생년월일, 태어난 시간 입력 폼 공통화
- BirthDate 및 BirthDatePolicy를 Core/Model에 구축하여 윤년, 말일 정규화, 미래 날짜 및 만 14세 유효성 검증 단일화
- FortuneFeature(궁합), MyPageFeature(상대방 관리/수정), OnboardingFeature에 공통 폼 마이그레이션 및 레거시 중복 코드 정리
- UnicodeScalar+Korean을 Core/Utils로 공통화하여 한글 이름 검증 단일화
- 폼 상태 전이, 미래 날짜/만 14세 정책, 궁합/상대방 사주 관리 단위 및 통합 테스트 보강
- 궁합 화면에서 내 정보 수정 후 저장 결과를 즉시 반영합니다.\n- CTA 컨테이너의 투명 배경은 유지하고 disabled 버튼은 DesignSystem 기본 표면을 사용합니다.\n- MainTab·Fortune·MyPage 상태 전이 테스트를 보강합니다.
- 프로필 수정 후 궁합 내 사주 재조회 실패를 오류 배너로 전달합니다.\n- 기존 사주 정보는 유지하는 회귀 테스트를 추가합니다.
- App이 궁합 경로 식별자로 편집 요청의 수명을 관리하도록 변경\n- 뒤로가기와 탭 전환 시 대기 중인 편집 표시와 전용 대시보드 로드를 폐기\n- 늦은 응답이 편집 화면을 다시 표시하지 않도록 회귀 테스트 추가
@seungwone
seungwone marked this pull request as ready for review August 15, 2026 11:51
@seungwone
seungwone requested a review from MoonGoon72 as a code owner August 15, 2026 11:51
@seungwone
seungwone merged commit 95d760c into release Aug 15, 2026
5 checks passed
@seungwone
seungwone deleted the feature/79-fortune-home-followups branch August 15, 2026 11:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment