Skip to content

refactor: 2차 대규모 View 리팩토링#311

Merged
clxxrlove merged 53 commits into
developfrom
refactor/#310/TWI-91
May 27, 2026
Merged

refactor: 2차 대규모 View 리팩토링#311
clxxrlove merged 53 commits into
developfrom
refactor/#310/TWI-91

Conversation

@clxxrlove
Copy link
Copy Markdown
Member

🔗 관련 이슈

📙 작업 내역

  • 이전 PR (refactor: 1차 대규모 View 리팩토링 #309)으로 리베이스 후 작업했음
  • ProofPhoto, Home, Stats에 대한 검증, 리팩토링 수행
  • ProofPhoto와 Home에서는 SwfitUI Template를 통한 큰 성과를 봤고, Stats의 경우에도 큰 성과를 기대했지만, 여러 시도 후 실패
    • Stats는 현재 구조적으로 큰 문제가 있고, (stamp grid / LazyVGrid) Pass 4에서 해결하기에는 너무 큰 문제여서 Pass 5로 잠정 연기
  • 이하 AI 레포트, 자세한 사항은 docs/perf-infra/reports/2026-05-20-render-pass-4.md

Summary

Pass 4 Rendering Optimization을 최종 종결합니다.

이번 Pass는 ProofPhoto image pipeline 최적화에서 시작했고, 이후 SwiftUI Template launch-mode / self-run 기반의 app-wide rendering audit까지 확장되었습니다.

최종 결과는 다음과 같습니다.

Track Result Notes
ProofPhoto P4-2 KEEP preview decode를 body 밖으로 이동했습니다. typing stall은 0.82s → 0.53s로 35% 감소했고, longest hang은 233ms → 114ms로 51% 감소했습니다.
ProofPhoto P4-3 / P4-4 SKIP P4-2 이후 image pipeline 쪽 잔여 병목이 사라졌습니다. 남은 비용은 keyboard-side UIKit 영역으로 판단했습니다.
Pass 4-S SwiftUI Template Audit Closed / inventory only launch-mode SwiftUI Template을 검증했고, attach-mode 0-row 한계를 재확인했습니다. 후보 inventory만 남기고 production 변경은 하지 않았습니다.
Pass 4-S2 Home H-C2-a KEEP GoalCardView의 outsideBorder 중복 렌더링을 제거했습니다. Animation Hitches가 0/2/4 → 0/0/0으로 줄었고, 133ms hitch도 제거되었습니다.
Pass 4-S3 Stats H-C5-a REVERT LazyVGrid를 eager rows로 바꾸는 실험을 진행했지만, SwiftUI count 일부 감소와 달리 Hitches가 증가하여 revert했습니다.

Key Changes

ProofPhoto

  • large fixture 기반 rendering scenario를 추가했습니다.
  • typing-large / preview-large / reselect-large trace를 수집했습니다.
  • UIImage(data:) 호출을 SwiftUI body 평가 경로에서 제거했습니다.
  • previewImage를 reducer state에 저장해 image ingestion 시점에 한 번만 decode하도록 변경했습니다.
  • upload path는 기존 imageData를 계속 사용하도록 보존했습니다.

Home

  • SwiftUI Template self-run scroll harness를 추가했습니다.
  • GoalCardViewoutsideBorder 사용을 local .background { RoundedRectangle.stroke(...) }로 교체했습니다.
  • shared outsideBorder modifier는 변경하지 않았습니다.
  • duplicated subtree composition을 제거해 Home scroll hitch를 개선했습니다.

Stats

  • Stats self-run scroll harness를 추가했습니다.
  • C5 후보를 gate까지 진행했습니다.
  • ablation 실험을 통해 stamp grid / LazyVGrid 쪽이 주요 원인임을 확인했습니다.
  • H-C5-a production hypothesis를 시도했지만 after-gate에서 실패했습니다.
  • 실패한 변경은 revert했고, post-revert smoke test도 통과했습니다.

Measurement Results

ProofPhoto P4-2

Metric Before After Delta
typing total stall 0.82s 0.53s -35%
longest hang 233ms 114ms -51%
Brief Unresponsiveness >=150ms 3/3 reps 1/3 reps reduced
ImageIO/JPEG decode in typing TP top frames present removed 3/3 eliminated

Home H-C2-a

Metric Before After Delta
swiftui-updates 204,598 121,310 -40.7%
GoalCardView.body events 2,642 166 -93.7%
Animation Hitches rows 0 / 2 / 4 0 / 0 / 0 -100%
133.34ms severe hitch present eliminated fixed
UITests - 8/8 pass clean

Stats H-C5-a

Metric Before After Result
swiftui-updates 641,276 545,597 -15%, KEEP 기준 미달
Animation Hitches 4 / 1 / 2 3 / 4 / 4 악화
Potentially expensive app update(s) 3/3 reps 3/3 reps unchanged
Verdict - - REVERT

Methodology Outcome

이번 Pass에서는 rendering 최적화 방법론도 함께 검증했습니다.

  • SwiftUI Template launch-mode는 candidate discovery 용도로 사용할 수 있음을 확인했습니다.
  • SwiftUI Template attach-mode는 XCUITest-driven interaction에서 여전히 0 row를 반환한다는 한계를 재확인했습니다.
  • self-run scenario를 사용하면 public SwiftUI API 또는 reducer action을 통해 interaction 시점의 SwiftUI attribution을 수집할 수 있음을 확인했습니다.
  • SwiftUI Template count만으로는 production 변경을 정당화하지 않습니다.
  • Time Profiler + Animation Hitches가 최종 keep/revert 판단 기준입니다.

Pass 4-S2는 positive example입니다. SwiftUI signal, Time Profiler, Animation Hitches가 모두 개선되어 변경을 keep했습니다.

Pass 4-S3는 negative example입니다. SwiftUI signal은 움직였지만 TP/Hitches가 corroborate하지 않았고, 실제 Hitches가 악화되어 변경을 revert했습니다.

Validation

  • 공식 trace collection을 contamination check와 함께 완료했습니다.
  • ProofPhoto after-traces는 24/24 clean이었습니다.
  • Home after-gate는 SwiftUI x3, TP x3, Hitches x3로 완료했습니다.
  • Stats after-gate를 완료했고, 실패한 production hypothesis는 revert했습니다.
  • Stats post-revert smoke test가 통과했습니다.
  • 최종 closeout 시점의 working tree는 clean입니다.

Follow-up

Pass 4는 종료되었습니다.

남은 rendering 후보는 Pass 5 handoff 문서로 이관했습니다.

docs/perf-infra/reports/_workspace/pass5-rendering-candidate-handoff.md

Pass 5는 Pass 4를 ad-hoc으로 이어서 진행하지 않고, 위 handoff 문서를 기준으로 별도 계획과 승인 후 시작해야 합니다.

clxxrlove added 30 commits May 18, 2026 23:23
@linear
Copy link
Copy Markdown

linear Bot commented May 20, 2026

TWI-91

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 20, 2026

Review Change Stack

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro Plus

Run ID: 33a11787-5ca1-48a2-ab41-9eb92ea11c09

📥 Commits

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

⛔ 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 (119)
  • .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/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/Components/Card/Goal/GoalCardView.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/_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-rendering-candidate-handoff.md
  • docs/perf-infra/reports/_workspace/smell-inventory.md
  • docs/perf-infra/reports/_workspace/time-profiler-analysis.md

📝 Walkthrough

요약

이 PR은 Pass 4 렌더링 성능 최적화를 마무리하는 2차 대규모 View 리팩토링으로, 다음과 같은 아키텍처 및 성능 개선사항을 포함합니다.

핵심 아키텍처 변경

ProofPhotoReducer 상태 변경

  • ProofPhotoReducer.StatepreviewImage: UIImage? 속성 추가
  • 이미지 데이터는 imageData로 유지하되, 프리뷰 렌더링용 디코드는 한 번만 수행해 previewImage에 캐시
  • .galleryPhotoLoaded, .captureCompleted 액션 처리에서 previewImage 설정 추가
  • returnButtonTappedpreviewImage 초기화

Home Feature 리팩토링

  • HomeView의 presentation 로직을 HomePresentationLayer ViewModifier로 분리 (read-set 격리)
  • GoalCardView의 외곽 테두리 렌더링 방식 변경: .outsideBorder().background { RoundedRectangle().stroke() } (중복 서브트리 제거)
  • HomeCoordinatorView 네비게이션 라우팅 로직을 IfLetStore → 명시적 store.scope() 형태로 전환

Stats Feature 개선

  • StatsCoordinatorView 라우팅 로직을 IfLetStore → 명시적 scoping으로 업데이트
  • StatsView에 조건부 self-run scroll 기능 추가 (LazyVGrid 관련 후보 실험)

의존성 및 테스팅 인프라

새로운 PerfTestingSupport 공유 모듈

  • UITestMode: 프로세스 인자 기반 UITest/성능 테스트 모드 판별
  • PerfCounters: 프로브 전용 성능 카운터 (PERF_TESTING 빌드에서만)
  • View+PerfAccessibility: perf 마커 modifier 확장 (perfRoot, perfReadyMarker, perfStateMarker, perfCell, perfControl 등)
  • XCTestCase+Perf: waitForFeatureReady(), awaitPerfMarker(), readPerfCounter() 헬퍼
  • XCUIApplication+Perf: launchForPerf(seed:scenario:disableAnimations:) 실행 헬퍼

Feature별 UITest 추가

  • Auth, GoalDetail, Home, MainTab, MakeGoal, Notification, Onboarding, ProofPhoto, Settings, Stats: 각각 smoke 테스트, 콜드 런치 테스트, 네비게이션 테스트, 렌더링 테스트 추가
  • ProofPhoto: 대형 픽스처 및 이미지 재선택 시나리오 포함

상태 변이 및 액션 흐름

ProofPhoto

  • 갤러리/캡처 완료 시 previewImage 설정으로 즉시 렌더링 가능 상태 반영
  • 선택 해제 시 previewImage = nil로 리셋

Home

  • 캘린더/피드 섹션을 독립적 부분으로 분리하여 업데이트 격리
  • self-run 스크롤 하네스로 결정적 성능 시나리오 구성 (PERF_TESTING 빌드에서만)

테스트 커버리지

  • 총 70+ UITest 케이스 신규 추가 (smoke, cold launch, rendering, navigation, scroll)
  • 성능 메트릭 측정 (Clock, Memory, CPU)
  • 프로브 기반 마커/카운터 검증

측정 결과 (Pass 4 완료)

  • ProofPhoto P4-2: typing stall 0.82s → 0.53s (-35%), 최장 hang 233ms → 114ms (-51%)
  • Home H-C2-a: swiftui-updates -40.7%, GoalCardView.body events -93.7%, animation hitches 제거
  • Stats H-C5-a: 실험 후 hitches 악화로 revert (생산 코드 변경 없음)

문서화

  • docs/perf-infra/ 하위에 종합 성능 측정 방법론, Pass 3-4 상세 리포트, 워크스페이스 아티팩트 정리
  • Pass 5 후보 handoff 문서 포함

주요 변경 파일: Projects/Feature/Home, ProofPhoto, Stats 및 공유 모듈 (PerfTestingSupport, DesignSystem), 테스트 타겟 전반, Tuist 설정 (모듈 추가, 의존성 재구성)

TCA 수정사항: 라우팅 패턴 현대화 (IfLetStore → explicit scoping), 상태 계층 분리 (presentation layer), seed 기반 의존성 주입

Walkthrough

공용 PerfTestingSupport 추가와 UITest 헬퍼 도입. 각 Feature 예제앱에 perfRoot/ready/state 마커와 하네스 연결. ProofPhoto 프리뷰 디코드 상태 저장 및 뷰 분기 수정. Home/Stats에 self-run 스크롤/마커 적용. Tuist 패키지 의존성 재구성과 여러 UITests 추가. 문서/스크립트 포함.

Changes

Perf infra and feature wiring

Layer / File(s) Summary
공용 PerfTestingSupport 도입 및 UITest 헬퍼
Projects/Shared/PerfTestingSupport/*, UITests/*
UITestMode, View perf 마커 확장, 카운터/핑, XCTestCase+Perf, XCUIApplication.launchForPerf 추가. 프로젝트/타깃 매니페스트와 기본 Settings, Target helpers 확장.
Feature 예제앱 퍼포먼스 마커/하네스 적용
Projects/Feature/*/Example/*, Testing/*
Auth/GoalDetail/Home/MainTab/MakeGoal/Notification/Onboarding/ProofPhoto/Settings 예제앱에 perfRoot/ready 및 시드 상수 추가. Home/Stats self-run 분기와 프로브 하네스, 네비게이션 perf 마커.
구현 변경(렌더링 제어/상태 저장)
GoalDetail/*, ProofPhoto/*, DesignSystem/*
GoalDetail FlyingReactionOverlay idle 시 TimelineView 중단. ProofPhoto에 previewImage 상태 추가·동기화 및 뷰 분기. GoalCardView 외곽선 렌더 경로 정리.
ProofPhoto/Stats/Home/GoalDetail UITests 추가
Projects/Feature/*/ExampleUITests/*
각 기능에 cold launch, smoke, navigation, rendering 드라이버, 프로브/스크롤 테스트 추가. 공용 UITest 헬퍼 활용.
Tuist 패키지/의존성 및 스크립트/문서
Tuist/*, Scripts/*, docs/perf-infra/*
Firebase/GoogleSignIn을 xcframework 미러로 전환, External 의존성 정리. xctrace 수집 스크립트/대형 픽스처 생성 스크립트와 상세 리포트/가이드 문서 추가. .gitignore 업데이트.

Sequence Diagram(s)

sequenceDiagram
  rect rgba(66, 135, 245, 0.5)
  participant Dev
  participant Xcode as Xcode/UITests
  participant App as Feature Example App
  participant Infra as PerfTestingSupport
  end
  Dev->>Xcode: run UITest (launchForPerf)
  Xcode->>App: inject -UITEST args + seed
  App->>Infra: UITestMode.configureApplication()
  App->>App: render root .perfRoot/.perfReadyMarker
  Xcode->>App: waitForFeatureReady(slug)
  App->>Infra: emit perfStateMarker/counters during flow
  Xcode->>Xcode: measure metrics / record xctrace
Loading

Estimated code review effort

🎯 5 (Critical) | ⏱️ ~120 minutes

Possibly related PRs

  • Keepiluv/Keepiluv-iOS#304: Firebase/GoogleSignIn 의존성 제거 및 xcframework 미러로 전환 패턴이 본 PR의 Tuist 변경과 직접 연관.
  • Keepiluv/Keepiluv-iOS#169: Stats 기능 기반 위에 본 PR의 Stats 뷰/코디네이터 퍼포먼스 계측과 UITests가 추가됨.

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/#310/TWI-91

@github-actions github-actions Bot added the D-3 label May 20, 2026
@clxxrlove
Copy link
Copy Markdown
Member Author

@coderabbitai summary

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 20, 2026

✅ Actions performed

Summary regeneration triggered.

Copy link
Copy Markdown
Contributor

@jihun32 jihun32 left a comment

Choose a reason for hiding this comment

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

토큰 다 녹았겠네 ㅋㅋㅋㅋ 고생했어
근데 저번 PR도 그렇고 이번도 그렇고 View 내부에 퍼포먼스 측정을 위한 코드들이 많은데 이건 리팩토링 다 하면 지우는거야? 아니라면 따로 분리를 해야될 거 같음

Comment on lines +78 to +93
// Pass 4-S2 H-C2-a: avoid the shared `outsideBorder` modifier whose
// implementation re-overlays `self` inside the stroke (see
// `View+BorderInOutSide.swift`). During Home self-run scroll that
// duplicated subtree composition correlated with the
// "37 offscreen passes" hitch narrative and the 133 ms cold-cache
// hitch. The `.background { stroke }` form below is the local
// equivalent: stroke drawn at the view's bounds (half inside, half
// outside), the inside half hidden by the clipped content above,
// the outside half visible — same width / color / outside-edge
// alignment as `outsideBorder`, but without the second `self`
// composition. Shared `outsideBorder` modifier is intentionally
// unchanged; other call sites keep their existing behavior.
.background {
RoundedRectangle(cornerRadius: Constants.cornerRadius)
.stroke(Constants.borderColor, lineWidth: Constants.borderWidth * 2)
}
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.

기존 outsideBorder보다 이게 더 좋은 거 같은데 아예 outsideBorder 로직을 이거로 변경해서 다 적용하는게 좋을듯

Copy link
Copy Markdown
Member Author

Choose a reason for hiding this comment

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

@jihun32 오키오키
1차 2차 최종이 연계작업이라 리뷰들 전부다 보고 최종에 반영해서 올릴게~~!! 리뷰 고마웡

@clxxrlove clxxrlove merged commit 9b3e841 into develop May 27, 2026
7 checks passed
@clxxrlove clxxrlove deleted the refactor/#310/TWI-91 branch May 27, 2026 11:49
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.

2 participants