Skip to content

[Fix] #261 - QA 반영, tuist 27.0 관련 오류 수정 hook 적용 - #262

Merged
Naknakk merged 10 commits into
developfrom
Fix/#261
Sep 11, 2026
Merged

Naknakk merged 10 commits into
developfrom
Fix/#261

Conversation

@Naknakk

@Naknakk Naknakk commented Sep 11, 2026

Copy link
Copy Markdown
Collaborator

💡 Issue


💭 Summary

QA에서 나온 자잘한 결함들을 한 번에 반영했어요.

빌드(Xcode 26.6)·피드·컬렉션·온보딩 네 갈래에 걸쳐 있어요. 각 커밋이 단일 주제라 커밋 단위로 따라 읽으면 편해요.


🔑 Key Changes

🛠 빌드 — Xcode 26.6 대응

  • 외부 SPM 패키지 deployment target을 앱과 같은 17.0으로 강제했어요.
  • Tuist가 SPM 리소스 번들 타깃에 남기는 낡은 값(13.1)은 Package.swift로 못 덮어서(tuist#11163), Scripts/patch-spm-deployment-target.sh로 generate 직후 덮어요.
  • post-checkout 훅이 자동 generate를 돌릴 때 이 patch도 이어서 돌려요. 그래서 브랜치 전환 후에도 Xcode IDE 빌드가 안 깨져요.

📰 피드

  • 연결 작품 별점을 글쓴이 별점으로 유지해요. 상세를 다녀와 복귀할 때 별점이 작품 전체 평점으로 바뀌던 오염을 잡았어요.
  • 글쓴이가 별점을 안 매겼으면 별점 표기 자체를 생략해요.
  • 피드 탭을 재탭하면 지금 보이는 서브탭(소소피드/내 피드)만 최상단으로 스크롤해요. 숨은 탭의 스크롤 깊이는 그대로 보존돼요.

🗂 컬렉션

  • "작품 추가" 화면에서 검색 전에 지금까지 고른 '추가한 작품' 리스트를 보여줘요. 삭제 배지로 바로 뺄 수 있고, 작가는 있을 때만 표기해요.
  • 검색바와 네비게이션 바 사이 간격을 8pt 넣었어요.

🚪 온보딩

  • 장르 선택 그리드를 화면 폭에 맞춰 가변 셀로 바꿨어요. SE처럼 세로가 짧은 기기는 60 고정 예외예요.
  • 로그인 인트로 배너 캐러셀이 첫 프레임에서 이미지-인디케이터가 어긋나던 desync를 잡았어요.

📱 Simulation


🧑‍🧒‍🧒 To Reviewer

리뷰 진행

  • Codex CLI로 코드 리뷰 + 문서 감사를 병렬로 돌렸어요.
  • 코드 리뷰는 🔴🟡🔵 모두 0으로 깨끗했어요.
  • 문서 감사에서 나온 🟡 1건(CollectionNovel.author 표시 사용처 서술 오기)은 이 PR에서 정정했어요.

봐주시면 좋은 포인트

  • 피드 별점 필드명 불일치: 같은 "글쓴이 별점"을 목록 API는 novelRating, 상세 API는 feedWriterNovelRating으로 내려줘요. 그래서 TotalFeed.updated(from:)에서 매퍼를 안 고치고 이 지점에서만 글쓴이 값을 집어와요(상세 화면은 전체 평점이 계속 필요해서요).
  • 피드 재탭 최상단 스크롤: 시스템 자동 "탭 재탭→최상단"이 상시 mount된 두 ScrollView 중 첫 번째만 잡는 문제를, 투명 미끼 ScrollView + 명시 신호로 우회했어요. 자세한 계약은 FeedFeature/CLAUDE.md에 정리돼 있어요.
  • Xcode 26.6 patch: generate 뒤 patch를 매번 돌려야 IDE 빌드가 살아요. 이제 post-checkout 훅이 자동으로 붙지만, 수동으로 tuist generate를 돌렸을 땐 직접 Scripts/patch-spm-deployment-target.sh도 돌려주세요.

※ Reference

  • tuist/tuist#11163 — SPM 리소스 번들 타깃 deployment target 오버라이드 미해결 이슈

Naknakk and others added 10 commits September 11, 2026 18:37
- Tuist/Package.swift: PackageSettings.baseSettings로 외부 패키지 IPHONEOS_DEPLOYMENT_TARGET을 앱과 동일한 17.0으로 오버라이드
- Scripts/patch-spm-deployment-target.sh 신설: baseSettings가 못 덮는 SPM 리소스 번들 타깃 15개(13.1)를 tuist generate 직후 패치(tuist/tuist#11163, Tuist 4.206 기준 미해결 — CLI 빌드는 통과하지만 Xcode IDE 빌드만 하드 에러)
- CLAUDE.md: generate 직후 스크립트 실행 절차 기록

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPJ34KGxJb2HR3t7kyN7fP
앱 실행 직후 scrollPosition(id:) 초기값(selection=1)이 첫 레이아웃 패스에서
적용되지 않아 ScrollView가 맨 앞(banner4 복제본)에 주차된 채 인디케이터만
selection=1을 반영하던 문제. ScrollViewReader로 감싸 onAppear 다음 런루프에
scrollTo(anchor: .leading)로 초기 위치를 강제해 해결(각 배너 .id(index) 부여).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPJ34KGxJb2HR3t7kyN7fP
선호 장르 3×3 그리드를 화면 폭에 맞춰 가변 배치. 좌우 여백 39·열 간격 24·
행 간격 25 고정, 원 배지 지름 = (화면폭−39×2−24×2)/3로 열을 꽉 채우고
아이콘·체크마크는 원 크기에 비례 스케일(라벨 title3 고정). 서브타이틀↔그리드
간격 50, 타이틀 여백은 기존 20 유지. iPhone SE처럼 세로가 짧은 기기(높이로 판별)는
세로 공간이 부족해 여백 39는 유지하되 원 지름을 60으로 고정. SE·17 Pro·17 Pro Max
시뮬레이터로 실측 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPJ34KGxJb2HR3t7kyN7fP
TotalFeed.updated(from:)이 상세 복귀 셀 동기화 시 detail.connectedNovel.basicInfo를
통째로 넣어 별점이 글쓴이 별점에서 작품 전체 평점으로 바뀌던 버그 수정. id·제목·장르는
basicInfo에서, rating은 feedWriterRating으로 채운 ConnectedNovel을 새로 조립.
(목록 API는 글쓴이 별점을 novelRating, 상세 API는 feedWriterNovelRating으로 내려주는
필드명 불일치 — 상세 화면은 두 값 다 쓰므로 매퍼는 그대로 두고 이 지점에서만 교정.)

WSSLinkNovel.novelRating을 Float? 로 바꿔 nil/0이면 별점 표기를 생략(상세
FeedDetailLinkNovelBlock의 if > 0과 동일 규칙). 호출부 4곳(소소피드·타유저 피드·
타유저 피드 목록·작품 상세 피드 탭)의 ?? 0 뭉갬 제거.

TotalFeedTests: 버그를 검증하던 stale 단언 정정 + 글쓴이 별점 사용/미평가 시 nil
전용 테스트 2건 추가. FeedDomain·FeedFeature CLAUDE.md에 함정 기록.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DPJ34KGxJb2HR3t7kyN7fP
SwiftUI TabView 자동 "탭 재탭→최상단"이 화면 안 첫 번째 ScrollView 하나에만
걸려, 상시 mount된 두 리스트 중 먼저 선언된 내 피드에만 동작하던 문제(소소피드는
안 되고, 내 피드는 숨어 있어도 재탭마다 리셋)를 명시 신호 + 미끼 2단계로 해결.

- MainTabView: 커스텀 TabView(selection:) Binding으로 피드 탭 재탭을 감지해
  feedReselectSignal(카운터) 증가 → FeedRootView→Factory→SosoFeedView로 전달.
- SosoFeedView: 각 리스트를 ScrollViewReader+최상단 앵커로 감싸 보이는 서브탭만
  (selectedTab==tab 가드) 올린다 — 숨은 탭 스크롤 깊이 보존.
- FeedListSection 맨 앞에 투명 미끼 ScrollView를 둬 자동 동작을 흡수(첫 ScrollView만
  잡는 성질 역이용) → 진짜 두 리스트는 오직 명시 신호로만 이동.

iPhone 17 Pro Max/iOS 26 로그인 세션 실측 확인.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018zPMZdSLZBKpRuv9SvPuNg
…실행(브랜치 전환 후 IDE 빌드 유지)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_018zPMZdSLZBKpRuv9SvPuNg
@Naknakk Naknakk self-assigned this Sep 11, 2026
@Naknakk
Naknakk merged commit b6f4ce7 into develop Sep 11, 2026
38 checks passed
@Naknakk Naknakk changed the title [Fix] #261 - QA 반영 [Fix] #261 - QA 반영, tuist 27.0 관련 오류 수정 hook 적용 Sep 11, 2026
@github-actions

Copy link
Copy Markdown

테스트 커버리지 리포트

Module Coverage
AuthData 55.3%
AuthDomain 98.2%
BaseDomain 70.3%
CollectionDomain 98.3%
CollectionFeature 0.0%
CommentData 0.0%
CommentDomain 94.9%
FeedData 62.8%
FeedDomain 98.7%
HomeFeature 0.0%
Keychain 0.0%
LibraryFeature 0.0%
Networking 78.0%
NotificationData 33.9%
NotificationDomain 100.0%
NotificationFeature 0.0%
NovelData 15.4%
NovelDetailFeature 0.0%
NovelDomain 92.9%
NovelReviewData 77.4%
NovelReviewDomain 96.8%
NovelReviewFeature 5.1%
ProfileData 46.1%
ProfileDomain 97.1%
RecommendationData 54.7%
RecommendationDomain 91.7%
SearchData 5.1%
SearchDomain 100.0%
SettingData 31.1%
SettingDomain 99.0%
SocialData 53.4%
SocialDomain 87.5%
SplashData 77.1%
SplashDomain 95.5%
SplashFeature 32.9%

Generated by CI on 2026-09-12 03:53 KST

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Fix] QA 반영

1 participant