Skip to content

refactor: 최종 View 리팩토링 #313

Open
clxxrlove wants to merge 62 commits into
developfrom
refactor/#312/TWI-92
Open

refactor: 최종 View 리팩토링 #313
clxxrlove wants to merge 62 commits into
developfrom
refactor/#312/TWI-92

Conversation

@clxxrlove
Copy link
Copy Markdown
Member

@clxxrlove clxxrlove commented May 21, 2026

🔗 관련 이슈

📙 작업 내역

  • 최종 결과물, 이번 Pass에서 작업한 내용은 Stats 관련 성능 개선, 성공
  • 이전 PR (refactor: 1차 대규모 View 리팩토링 #309, refactor: 2차 대규모 View 리팩토링 #311) 피드백 반영 완료 562fecc
  • 관련 문서 docs/perf-infra/2026-05-21-rendering-optimization-final-summary-ko.md
  • 성과 요약 (~ Pass 5)
    • Feature Example 기반 성능 측정 인프라를 구축하고 Xcode Instruments(Time Profiler, Animation Hitches)로 UI rendering 병목을 정량 분석.
    • ProofPhoto image decode, Home/Stats duplicated subtree rendering 이슈를 개선하여 typing stall -35%, longest hang -51%, Home hitches 0/2/4 → 0/0/0, Stats hitches -71%를 달성.

Rendering Optimization Final Report

Summary

이번 PR은 perf-infra 기반 UI rendering optimization series의 최종 결과를 정리합니다.

시리즈는 Pass 3 → Pass 4 → Pass 5까지 진행했고, Pass 5를 마지막 pass로 종료합니다. 추가 Pass 6는 계획하지 않습니다.

perf-infra 이전에는 rendering 병목을 안정적으로 비교할 수 있는 공통 측정 체계가 없었습니다. 이번 작업을 통해 Feature Example 앱 기반 seed, marker, PerfProfile, xctrace 수집 흐름을 마련했고, Time Profiler + Animation Hitches 기준으로 production 변경을 gate했습니다.

전체 전역 개선률은 계산하지 않습니다. Pass 3는 Profile, Pass 4/5는 PerfProfile을 사용했고 일부 workload도 달라졌기 때문입니다. 대신 같은 workload before/after가 있는 항목만 성과로 인용합니다.


Baseline / Methodology

  • Earliest documented baseline: baseline-render-pass-1 = 56b5b63
  • Authoritative metric: Xcode Instruments / xctrace
    • Time Profiler
    • Animation Hitches
  • SwiftUI Template:
    • launch-mode: candidate discovery에 유효
    • attach-mode: 이 환경의 XCUITest-driven interaction에서는 0-row limitation 확인
  • Production decision rule:
    • SwiftUI count만으로는 ship하지 않음
    • Time Profiler + Animation Hitches corroboration이 있어야 KEEP
    • 악화되거나 근거가 부족한 hypothesis는 REVERT / SKIP

Production Improvements Kept

Pass Area Change Result Status
Pass 3 Home HomePresentationLayer 중심 read-set split 측정 수치는 noise floor 내. Rendering win이 아니라 structural cleanup으로 유지 KEEP
Pass 3 GoalDetail TimelineView idle guard idle frame 9-12ms top user-code frame이 3/3 reps에서 제거 KEEP
Pass 4 ProofPhoto preview decode out of body + decoded preview state typing total stall 0.82s → 0.53s (-35%), longest hang 233ms → 114ms (-51%), ImageIO/JPEG decode top-frame 3/3 reps에서 제거 KEEP
Pass 4 Home GoalCardView outsideBorder duplicated-subtree render 제거 Animation Hitches 0/2/4 → 0/0/0, severe 133.34ms hitch 제거, swiftui-updates -40.7%, GoalCardView.body events -93.7% KEEP
Pass 5 Stats StatsCardView outsideBorder duplicated-subtree render 제거 Hitches 4/1/2 → 2/0/0 (-71%), hangs 1 → 0, app-update narrative 3/3 → 0/3, swiftui-updates -47.6% KEEP

Main Outcome

  • ProofPhoto large typing latency 개선

    • total stall -35%
    • longest hang -51%
    • ImageIO/JPEG decode가 typing TP top-frame에서 제거됨
  • Home self-run scroll 개선

    • measured scenario에서 Animation Hitches 제거
    • 133.34ms severe hitch 제거
    • "37 offscreen passes" narrative 제거
  • Stats self-run scroll 개선

    • hitches -71%
    • severe hang 제거
    • "Potentially expensive app update(s)" narrative 제거
  • Home / Stats에서 동일 계열의 outsideBorder duplicated-subtree render issue를 각각 독립 gate 후 수정

  • 위험한 Stats hypothesis는 ship하지 않고 revert


Reverted / Rejected Hypotheses

Hypothesis Decision Reason
Stats H-C5-a LazyVGrid → eager rows REVERT swiftui-updates는 -15%였지만 Hitches가 4/1/2 → 3/4/4로 악화, app-update narrative도 3/3 유지
ProofPhoto P4-3 downsample SKIP P4-2 후 ImageIO/JPEG decode top-frame이 사라졌고, 남은 stall은 keyboard-side UIKit
ProofPhoto P4-4 subtree isolation SKIP preview image subtree issue가 P4-2로 해결됨
C3 / C4 idle SwiftUI candidates SKIP TP / Hitches gate가 production action을 지지하지 않음
C1 / C6 / ProofPhoto keyboard residual CLOSED current rendering optimization scope가 아니거나 side effect로 noise floor 아래로 내려감

Regression Safety

  • 실패한 production attempt는 revert했습니다.
  • documented 범위에서 smoke / UITests를 통과했습니다.
  • ProofPhoto, Home, Stats 변경은 visual sanity를 확인했습니다.
  • 최종적으로 bundle exec fastlane ios ci_pr 통과 후 리뷰 반영 commit을 생성했습니다.
  • 이후 TestFlight 배포 경로 보정과 버전 1.1.3 갱신도 별도 chore commit으로 정리했습니다.

Final Conclusion

Rendering optimization series는 완료되었습니다.

Pass 3에서 측정 기반 후보를 정리했고, Pass 4에서 ProofPhoto와 Home의 실질 병목을 제거했으며, Pass 5에서 Stats의 남은 주요 render duplication issue를 닫았습니다.

Pass 5가 최종 pass이며 Pass 6는 계획하지 않습니다.

남은 candidate와 residual note는 future reference only이고, 이번 PR의 active scope가 아닙니다.

clxxrlove added 30 commits May 18, 2026 23:23
clxxrlove added 22 commits May 20, 2026 15:29
@linear
Copy link
Copy Markdown

linear Bot commented May 21, 2026

TWI-92

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 21, 2026

Review Change Stack

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 6720a5fd-c853-4157-bfed-5c6d0a6640c7

📥 Commits

Reviewing files that changed from the base of the PR and between 1b68a0d and 138d6b6.

⛔ Files ignored due to path filters (2)
  • Projects/Feature/ProofPhoto/Example/Resources/proof-photo-prefilled-large-second.jpg is excluded by !**/*.jpg
  • Projects/Feature/ProofPhoto/Example/Resources/proof-photo-prefilled-large.jpg is excluded by !**/*.jpg
📒 Files selected for processing (133)
  • .gitignore
  • Projects/App/Project.swift
  • Projects/Domain/Auth/Project.swift
  • Projects/Domain/PhotoLog/Interface/Sources/DTO/PhotoLogUpdateReactionResponseDTO.swift
  • Projects/Feature/Auth/Example/Sources/AuthApp.swift
  • Projects/Feature/Auth/ExampleUITests/Sources/AuthExampleSmokeTests.swift
  • Projects/Feature/Auth/Project.swift
  • Projects/Feature/GoalDetail/Example/Sources/GoalDetailApp.swift
  • Projects/Feature/GoalDetail/Example/Sources/GoalDetailExampleView.swift
  • Projects/Feature/GoalDetail/ExampleUITests/Sources/GoalDetailExampleColdLaunchTests.swift
  • Projects/Feature/GoalDetail/ExampleUITests/Sources/GoalDetailExampleNavigationTests.swift
  • Projects/Feature/GoalDetail/ExampleUITests/Sources/GoalDetailExampleRenderingTests.swift
  • Projects/Feature/GoalDetail/ExampleUITests/Sources/GoalDetailExampleSmokeTests.swift
  • Projects/Feature/GoalDetail/Project.swift
  • Projects/Feature/GoalDetail/Sources/Detail/FlyingReactionSupport.swift
  • Projects/Feature/GoalDetail/Sources/Detail/GoalDetailView.swift
  • Projects/Feature/GoalDetail/Sources/Detail/ReactionBarView.swift
  • Projects/Feature/GoalDetail/Testing/Sources/Source.swift
  • Projects/Feature/Home/Example/Sources/HomeApp.swift
  • Projects/Feature/Home/ExampleUITests/Sources/HomeExampleColdLaunchTests.swift
  • Projects/Feature/Home/ExampleUITests/Sources/HomeExampleFeedScrollRenderingTests.swift
  • Projects/Feature/Home/ExampleUITests/Sources/HomeExampleNavigationTests.swift
  • Projects/Feature/Home/ExampleUITests/Sources/HomeExampleRenderingProbeTests.swift
  • Projects/Feature/Home/ExampleUITests/Sources/HomeExampleScrollTests.swift
  • Projects/Feature/Home/ExampleUITests/Sources/HomeExampleSmokeTests.swift
  • Projects/Feature/Home/Project.swift
  • Projects/Feature/Home/Sources/Home/HomeCalendarSection.swift
  • Projects/Feature/Home/Sources/Home/HomeContentSection.swift
  • Projects/Feature/Home/Sources/Home/HomeEmptyContentSection.swift
  • Projects/Feature/Home/Sources/Home/HomeHeaderRow.swift
  • Projects/Feature/Home/Sources/Home/HomeNavigationBarSection.swift
  • Projects/Feature/Home/Sources/Home/HomePerfSupport.swift
  • Projects/Feature/Home/Sources/Home/HomePresentationLayer.swift
  • Projects/Feature/Home/Sources/Home/HomeReducer+Impl.swift
  • Projects/Feature/Home/Sources/Home/HomeView.swift
  • Projects/Feature/Home/Sources/Root/HomeCoordinatorView.swift
  • Projects/Feature/Home/Testing/Sources/Source.swift
  • Projects/Feature/MainTab/Example/Sources/MainTabExampleApp.swift
  • Projects/Feature/MainTab/Example/Sources/MainTabExampleView.swift
  • Projects/Feature/MainTab/ExampleUITests/Sources/MainTabExampleSmokeTests.swift
  • Projects/Feature/MainTab/Project.swift
  • Projects/Feature/MakeGoal/Example/Sources/MakeGoalApp.swift
  • Projects/Feature/MakeGoal/ExampleUITests/Sources/MakeGoalExampleSmokeTests.swift
  • Projects/Feature/MakeGoal/Project.swift
  • Projects/Feature/MakeGoal/Testing/Sources/Source.swift
  • Projects/Feature/Notification/Example/Sources/NotificationApp.swift
  • Projects/Feature/Notification/ExampleUITests/Sources/NotificationExampleSmokeTests.swift
  • Projects/Feature/Notification/Project.swift
  • Projects/Feature/Onboarding/Example/Sources/OnboardingApp.swift
  • Projects/Feature/Onboarding/ExampleUITests/Sources/OnboardingExampleSmokeTests.swift
  • Projects/Feature/Onboarding/Project.swift
  • Projects/Feature/Onboarding/Testing/Sources/Source.swift
  • Projects/Feature/ProofPhoto/Example/Sources/ProofPhotoApp.swift
  • Projects/Feature/ProofPhoto/ExampleUITests/Sources/ProofPhotoExampleRenderingTests.swift
  • Projects/Feature/ProofPhoto/ExampleUITests/Sources/ProofPhotoExampleSmokeTests.swift
  • Projects/Feature/ProofPhoto/Interface/Sources/ProofPhotoReducer.swift
  • Projects/Feature/ProofPhoto/Project.swift
  • Projects/Feature/ProofPhoto/Sources/ProofPhoto/ProofPhotoReducer+Impl.swift
  • Projects/Feature/ProofPhoto/Sources/ProofPhoto/ProofPhotoView.swift
  • Projects/Feature/ProofPhoto/Testing/Sources/Source.swift
  • Projects/Feature/Settings/Example/Sources/SettingsApp.swift
  • Projects/Feature/Settings/ExampleUITests/Sources/SettingsExampleSmokeTests.swift
  • Projects/Feature/Settings/Project.swift
  • Projects/Feature/Stats/Example/Sources/StatsApp.swift
  • Projects/Feature/Stats/ExampleUITests/Sources/StatsExampleColdLaunchTests.swift
  • Projects/Feature/Stats/ExampleUITests/Sources/StatsExampleNavigationTests.swift
  • Projects/Feature/Stats/ExampleUITests/Sources/StatsExampleRenderingTests.swift
  • Projects/Feature/Stats/ExampleUITests/Sources/StatsExampleScrollTests.swift
  • Projects/Feature/Stats/ExampleUITests/Sources/StatsExampleSmokeTests.swift
  • Projects/Feature/Stats/Project.swift
  • Projects/Feature/Stats/Sources/Coordinator/StatsCoordinatorView.swift
  • Projects/Feature/Stats/Sources/Stats/StatsView.swift
  • Projects/Feature/Stats/Testing/Sources/Source.swift
  • Projects/Shared/DesignSystem/Sources/Modifiers/View+BorderInOutSide.swift
  • Projects/Shared/PerfTestingSupport/Project.swift
  • Projects/Shared/PerfTestingSupport/Sources/PerfCounters.swift
  • Projects/Shared/PerfTestingSupport/Sources/UITestMode.swift
  • Projects/Shared/PerfTestingSupport/Sources/View+PerfAccessibility.swift
  • Projects/Shared/PerfTestingSupport/UITests/Sources/XCTestCase+Perf.swift
  • Projects/Shared/PerfTestingSupport/UITests/Sources/XCUIApplication+Perf.swift
  • Scripts/generate-proof-photo-large-fixture.swift
  • Scripts/verify-perf-targets.sh
  • Tuist/Package.resolved
  • Tuist/Package.swift
  • Tuist/ProjectDescriptionHelpers/InfoPlist/InfoPlist+Defaults.swift
  • Tuist/ProjectDescriptionHelpers/Module.swift
  • Tuist/ProjectDescriptionHelpers/Project/Project+MakeModule.swift
  • Tuist/ProjectDescriptionHelpers/Scripts/CrashlyticsScript.swift
  • Tuist/ProjectDescriptionHelpers/Target/Dependency/TargetDependency+External.swift
  • Tuist/ProjectDescriptionHelpers/Target/Dependency/TargetDependency+Modules.swift
  • Tuist/ProjectDescriptionHelpers/Target/Target+Feature.swift
  • Tuist/ProjectDescriptionHelpers/Target/Target+Shared.swift
  • docs/perf-infra/README.md
  • docs/perf-infra/inventory.md
  • docs/perf-infra/reports/2026-05-18-render-pass-3.md
  • docs/perf-infra/reports/2026-05-20-render-pass-4.md
  • docs/perf-infra/reports/2026-05-21-render-pass-5.md
  • docs/perf-infra/reports/2026-05-21-rendering-final-cumulative-report.md
  • docs/perf-infra/reports/2026-05-21-rendering-optimization-final-summary-ko.md
  • docs/perf-infra/reports/_workspace/baseline-device.md
  • docs/perf-infra/reports/_workspace/baseline-simulator.md
  • docs/perf-infra/reports/_workspace/compare-baseline-after.md
  • docs/perf-infra/reports/_workspace/pass3-baseline-collection-plan.md
  • docs/perf-infra/reports/_workspace/pass3-before.md
  • docs/perf-infra/reports/_workspace/pass3-commit3-comparison.md
  • docs/perf-infra/reports/_workspace/pass3-commit6-investigation.md
  • docs/perf-infra/reports/_workspace/pass3-commit7-comparison.md
  • docs/perf-infra/reports/_workspace/pass3-dryrun.md
  • docs/perf-infra/reports/_workspace/pass3-target-coverage.md
  • docs/perf-infra/reports/_workspace/pass4-baseline-analysis.md
  • docs/perf-infra/reports/_workspace/pass4-p4-2-comparison.md
  • docs/perf-infra/reports/_workspace/pass4-s-c3-txcalendardatecell.md
  • docs/perf-infra/reports/_workspace/pass4-s-c4-goaldetailview.md
  • docs/perf-infra/reports/_workspace/pass4-s-closeout.md
  • docs/perf-infra/reports/_workspace/pass4-s-plan-draft.md
  • docs/perf-infra/reports/_workspace/pass4-s-selfrun-swiftui-template-feasibility.md
  • docs/perf-infra/reports/_workspace/pass4-s-swiftui-template-audit.md
  • docs/perf-infra/reports/_workspace/pass4-s2-closeout.md
  • docs/perf-infra/reports/_workspace/pass4-s2-h-c2-a-comparison.md
  • docs/perf-infra/reports/_workspace/pass4-s2-home-selfrun-scroll-plan.md
  • docs/perf-infra/reports/_workspace/pass4-s2-home-selfrun-scroll-result.md
  • docs/perf-infra/reports/_workspace/pass4-s3-closeout.md
  • docs/perf-infra/reports/_workspace/pass4-s3-h-c5-a-after-gate.md
  • docs/perf-infra/reports/_workspace/pass4-s3-h-c5-a-plan.md
  • docs/perf-infra/reports/_workspace/pass4-s3-stats-selfrun-scroll-plan.md
  • docs/perf-infra/reports/_workspace/pass4-s3-stats-selfrun-scroll-result.md
  • docs/perf-infra/reports/_workspace/pass5-execution-plan.md
  • docs/perf-infra/reports/_workspace/pass5-h-c5-b-after-gate.md
  • docs/perf-infra/reports/_workspace/pass5-h-c5-b-plan.md
  • docs/perf-infra/reports/_workspace/pass5-rendering-candidate-handoff.md
  • docs/perf-infra/reports/_workspace/smell-inventory.md
  • docs/perf-infra/reports/_workspace/time-profiler-analysis.md
  • fastlane/Fastfile

📝 Walkthrough

핵심 아키텍처 변경

1. 성능 측정 인프라 도입 (SharedPerfTestingSupport)

새로운 Shared 모듈(PerfTestingSupport)을 도입하여 UITest 기반 성능 측정 인프라를 구축했습니다:

  • UITestMode: launch argument 기반 설정(-UITEST, -UITEST_SEED, -UITEST_DISABLE_ANIMATIONS 등)으로 테스트 모드 제어
  • View+PerfAccessibility: 7개의 성능 마커 메서드(perfRoot, perfReadyMarker, perfControl, perfCell, perfFeed, perfStateMarker, perfCounterMarkers) 추가로 accessibility identifier를 통한 UI 요소 추적
  • PerfCounters: 성능 카운터 관리(프로세스 전역 카운터 맵)
  • UITest 헬퍼: XCUIApplication.launchForPerf(), waitForFeatureReady(), measureActionLatency() 등 성능 테스트 유틸리티

모든 Feature(Home, Stats, GoalDetail, ProofPhoto 등)가 이 인프라에 의존성을 추가하여 각 기능의 성능 측정 capability를 확보합니다.

2. ProofPhotoReducer 상태 분리

ProofPhotoReducer.StatepreviewImage: UIImage? 프로퍼티 추가:

  • 기존: imageData를 저장한 뒤 렌더링 시마다 UIImage(data:)로 디코딩 반복
  • 변경: imageData는 업로드용 source-of-truth로 유지하고, previewImage에 한 번만 디코딩된 이미지를 캐시하여 성능 개선

ProofPhotoView에서도 previewImage 존재 여부를 기준으로 마커값 산정 및 이미지 렌더링 로직 업데이트.

3. Home View 리팩토링 (Read-Set Split)

기존 단일 body와 extension 기반 구조에서 sibling 서브뷰 아키텍처로 재구성:

  • 신규 컴포넌트:

    • HomeNavigationBarSection: 네비게이션 바 상태 읽기 격리
    • HomeCalendarSection: 달력 선택 로직 분리
    • HomeContentSection/HomeEmptyContentSection: 콘텐츠 영역 분리
    • HomeHeaderRow: 헤더 행 독립화
    • HomePresentationLayer: 모달/시트/풀스크린 커버 등 presentation 흐름 중앙화
    • HomePerfSupport: 성능 테스트 전용 UI 및 카운터 마커
  • 효과: 각 섹션이 필요한 상태만 구독하므로 불필요한 re-render 감소

4. Stats View 성능 최적화

  • StatsCardViewoutsideBorder 중복 composition 제거:

    • 기존: overlay { shape.stroke(...) }.overlay(self) → 뷰 두 번 합성
    • 변경: .background { RoundedRectangle.stroke(...) }.overlay(self) → 단일 합성
  • StatsView에 self-run scroll 시나리오 추가(UITestMode.isSwiftUISelfRunStatsScroll 플래그로 조건화)

5. GoalDetail View 최적화

  • FlyingReactionOverlay에 idle guard 추가:
    • reactions.isEmpty일 때 TimelineView 비활성화하여 idle 상태에서 60Hz 타이머 제거
    • 이전: 반응이 없어도 매 프레임 TimelineView.UpdateFilter.updateValue() 호출

6. 모든 Feature Example 앱 통합

모든 Example 앱에 SharedPerfTestingSupport 의존성 추가 및 성능 측정 마커 통합:

  • init()에서 UITestMode.configureApplication() 호출
  • .perfRoot(), .perfReadyMarker() 수정자 적용
  • 각 Feature별 Smoke, ColdLaunch, Scroll, Navigation, Rendering 시나리오 UITest 추가 (총 약 50개 이상의 새 UITest)

7. 의존성 및 프로젝트 설정 변경

  • Firebase: firebase-ios-sdkfirebase-ios-sdk-xcframeworks 미러로 전환
  • GoogleSignIn: GoogleSignInSwift 의존성 제거
  • Build Configuration: PerfProfile 구성 추가 (Release 유사 설정 + PERF_TESTING 컴파일 조건)
  • Tuist 헬퍼: Feature UI test 타겟 생성 헬퍼 추가

8. 테스트 커버리지 대폭 확대

모든 Feature에 UI 테스트 타겟(exampleUITests) 추가:

  • Smoke tests: 기본 렌더링 준비 상태 확인
  • Performance tests (measure): 콜드 런치, 스크롤 성능 측정
  • Rendering tests (xctrace): Time Profiler + Animation Hitches 추적
  • Navigation tests: 화면 전환 경로 및 준비 마커 검증
  • Probe tests: 성능 카운터 및 상태 마커 읽기

사용자 관점 변화

  • 외부 노출 동작: 없음 (모두 내부 성능 최적화 및 테스트 인프라)
  • 시각적 변화: 없음 (outsideBorder 수정도 시각적 동치성 유지)

관련 이슈

  • Closes #312 (TWI-92): Pass 5 rendering optimization 최종 완료
  • References #309, #311: 이전 Pass 결과

측정 결과 (문서 기준)

  • Home/Stats self-run 애니메이션 히치: 0/0/0 달성, 특정 severe hitch 제거
  • ProofPhoto typing-large 입력 stall: -35%, longest hang -51%
  • Production 변경 5건 KEEP, 1건 REVERT, 나머지 SKIP/CLOSED

Walkthrough

Shared/PerfTestingSupport 추가와 UITest 유틸 도입, 각 Feature 예제 앱에 perf 마커 연결 및 셀프런 하네스/렌더링 드라이버 테스트 신설. ProofPhoto 프리뷰 이미지 상태 분리, Home/Stats 리팩터링, Tuist/패키지/스크립트/문서 갱신.

Changes

퍼포먼스 인프라 및 전역 계측

Layer / File(s) Summary
PerfTestingSupport 모듈·유틸 및 프로젝트 연결
Projects/Shared/PerfTestingSupport/*, Tuist/..., Scripts/*, fastlane/Fastfile, .gitignore
Shared PerfTestingSupport(마커/카운터/UITest 런처/대기) 추가, PerfProfile 설정·의존성·패키지/스크립트 갱신, Crashlytics 경로/키 정리.
Feature 예제 앱 계측과 UITest 추가
`Projects/Feature/*/(Example
ExampleUITests)/*`
기능별 구현 변경(ProofPhoto/Home/Stats/GoalDetail)
Projects/Feature/*/Sources/*
ProofPhoto 미리보기용 previewImage 상태 도입 및 표시 분리, Home/Stats 셀프런 스크롤 하네스/마커, GoalDetail 오버레이 조건가드·마커 추가, Coordinator/View 리팩터링.
빌드/의존성/문서 업데이트
Tuist/*, docs/perf-infra/*, Projects/App/Project.swift
예제 UITest 타깃 생성 헬퍼/서명 자동화, Firebase/GoogleSignIn 의존성 조정, 버전/InfoPlist 도우미 추가, 성능 리포트/인벤토리/플랜 문서화.

Sequence Diagram(s)

sequenceDiagram
  participant ComponentA
  participant ComponentB
  ComponentA->>ComponentB: observable interaction
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

Suggested labels

🔨 refactor

Suggested reviewers

  • jihun32
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/#312/TWI-92

@clxxrlove
Copy link
Copy Markdown
Member Author

@coderabbitai summary

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 21, 2026

✅ Actions performed

Summary regeneration triggered.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant