[Refactor] 썸네일 디코드 크기 티어화 및 PhotoNavGrid 제네릭화 (#70) - #71
Conversation
Nuke는 resize processor의 크기를 캐시 키에 포함하므로, 같은 URL을 화면마다 다른 크기로 요청하면 캐시 엔트리가 각각 따로 쌓인다. 호출부에 흩어져 있던 디코드 크기를 enum 두 케이스로 못박아 파편화의 상한을 잡는다. - .grid (150×150) — 3열 정사각 타일 - .card (200×160) — 앨범 카드 커버 + 앨범 상세 배너 공용 PhotoGridTile이 첫 사용처. 크기를 티어가 소유하므로 타일은 ImageRequest를 직접 조립하지 않고 Nuke 의존도 걷어낸다.
앨범 상세 배너가 쓰던 390×140 전용 크기를 없애고 앨범 카드 커버와 같은 .card 티어로 합친다. 크기가 캐시 키에 들어가므로, 목록에서 이미 디코드해둔 커버 비트맵을 상세 배너가 그대로 재사용한다. 사진이 1~2장뿐인 앨범은 스트립이 티어 폭보다 넓어져 흐려지지만, 스크림과 타이틀이 덮는 배경이라 캐시 공유의 이득이 더 크다고 보고 감수한다. 두 뷰 모두 ImageRequest를 직접 조립하지 않게 되어 Nuke import를 걷어낸다.
Core/UIComponents의 공용 그리드가 Features/Home의 도메인 모델(Photo)을 직접 받고 있었다. 의존성 규칙은 Feature → Core 단방향인데 방향이 역전된 상태로, Step 4 멀티모듈 분리에서 그대로 Core ↔ Feature 순환 의존이 된다. 항목 타입을 Item: Identifiable & Hashable로 열고, 썸네일 URL을 꺼내는 방법은 호출부가 키패스(\.imageUrl)로 넘긴다. 줌 전환 식별자도 photoId 대신 item.id를 쓰므로 Core는 어떤 도메인 모델도 알지 않는다. 호출부 3곳(홈 그리드, 앨범 상세, 검색 결과) 갱신.
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Repository UI Review profile: CHILL Plan: Pro Plus Run ID: 📒 Files selected for processing (6)
Included review availability: Your plan provides up to 1 included review per hour; 0 remain after this review. Walkthrough썸네일 요청을 Changes썸네일 및 그리드 리팩터링
Estimated code review effort: 2 (Simple) | ~10 minutes Merge Risk: ⚪ Minimal · up to This change centralizes thumbnail sizing and makes the photo grid reusable without changing the existing image-loading path or introducing new production dependencies. No actionable merge-blocking risk remains after normal checks and review. Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches📝 Generate docstrings
🧪 Generate unit tests (beta)
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. Comment |
Close #70
✨ PR 유형
어떤 변경 사항이 있나요??
🛠️ 작업내용
1. 썸네일 디코드 크기를
ThumbnailTier로 통합Nuke는 resize processor의 크기를 캐시 키(
identifier)에 포함한다. 같은 URL을 화면마다 다른 크기로 요청하면 캐시 엔트리가 각각 따로 쌓인다. 호출부 세 곳에 흩어져 있던 크기를 enum 두 케이스로 못박아 파편화의 상한을 잡았다..grid.card앨범 상세 배너가 쓰던
390×140전용 크기를 없애고.card로 합쳤다. 앨범 목록에서 이미 디코드해둔 커버 비트맵을 상세 배너가 그대로 재사용한다.두 뷰가
ImageRequest를 직접 조립하지 않게 되어import Nuke도 걷어냈다(NukeUI만 남음).2.
PhotoNavGrid항목 타입 제네릭화Core/UIComponents의 공용 그리드가Features/Home/Domain의Photo를 직접 받고 있었다. 의존성 규칙은Feature → Core단방향인데 방향이 역전된 상태다.줌 전환 식별자도
photo.photoId→item.id로 바꿔 Core가 어떤 도메인 모델도 알지 않게 했다. 호출부 3곳(홈 그리드 · 앨범 상세 · 검색 결과) 갱신.📋 추후 진행 상황
이 PR이 머지된 뒤 에러 처리 계층 통합을 별도 이슈/PR로 올린다.
AppError·Loadable<T>·ErrorHandler를 도입해 "결과 없음"과 "불러오기 실패"가 같은 화면으로 보이는 문제, ViewModel마다errorMessage = error.localizedDescription을 반복하는 문제를 정리하는 작업이다. 그다음으로 로컬 목 서버 스크립트 커밋.📌 리뷰 포인트
.card티어 공유의 트레이드오프 — 사진이 1~2장뿐인 앨범은 배너 스트립이 티어 폭(200pt)보다 넓어져 약간 흐려진다. 스크림과 타이틀이 덮는 배경이라 캐시 공유의 이득이 더 크다고 판단했는데, 이 판단이 타당한지.grid150pt는 iPhone 세로 기준 실제 타일 폭 약 130pt 대비 여유가 있다.upscale이 기본 false라 원본이 티어보다 작으면 확대하지 않는다PhotoNavGrid가imageUrl클로저를 받는 방식 — 호출부는\.imageUrl키패스만 넘기므로 body 평가마다 클로저가 새로 만들어지지 않는다✅ Checklist
PR이 다음 요구 사항을 충족하는지 확인해주세요!!!
Summary by CodeRabbit