Skip to content

[Setting] #271 - v1.10.0 릴리즈 - #272

Merged
Guryss merged 1770 commits into
mainfrom
Setting/#271
Sep 21, 2026
Merged

Guryss merged 1770 commits into
mainfrom
Setting/#271

Conversation

@Guryss

@Guryss Guryss commented Sep 20, 2026

Copy link
Copy Markdown
Member

💡 Issue


💭 Summary

v1.10.0 릴리즈예요 — develop 작업을 main으로 승격해요. 사실상 앱스토어에 처음 심사 제출하는 릴리스예요.


🔑 Key Changes

develop에 쌓인 커밋이 많아 PR 병합 단위로 압축해서 정리했어요. 전체 변경은 아래 비교 링크로 확인해주세요.

main...develop

  • 버전 NONE→1.10.0, 릴리즈 노트 갱신
  • 모듈화(Tuist 멀티모듈)·Clean Architecture 기반 v2 클라이언트 전체 구현 (Domain/Data/Feature/UI/Core 전 레이어)
  • 온보딩, 홈, 피드, 서재, 작품 상세, 검색(일반/상세탐색), 컬렉션(생성·공유·딥링크), 알림(완결/휴재복귀), 푸시(FCM), 마이페이지/설정 등 주요 기능 구현
  • CI(테스트 자동화·아키텍처 린트·스타일 게이트), Swift 6 전환 등 개발 인프라 구축
  • V1 parity 점검·QA 수정 반영

📱 Simulation

해당 없음 (버전/릴리즈노트 텍스트 변경뿐, UI 변경 없음)


🧑‍🧒‍🧒 To Reviewer

버전 번호(1.10.0)와 릴리즈 노트 문구가 맞는지 확인 부탁드려요.

merge되면 CUTOVER_READYtrue일 때만 app-store-release 승인 요청이 떠요 — 오발동 걱정 안 하셔도 돼요. 자세한 배포 흐름은 docs/WORKFLOW.md를 참고해주세요.


※ Reference

Naknakk and others added 30 commits September 1, 2026 01:26
작품 상세 첫 진입 시 평가 상태바를 딤에서 뚫는 스포트라이트 오버레이 + 말풍선 힌트를
앱 전역 1회 띄운다(V1 parity 복원, 복제본 대신 실제 상태바를 밝히는 방식으로 개선).
저장은 BaseDomain OnboardingHint/OnboardingHintUseCase 범용 온보딩 플래그(UserDefaults).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N2fgkNPXHekVGYpGbeEC4i
피드 작성/수정·감상평 저장 성공 시 앱스토어 평점 프롬프트를 재도입한다(V1 parity).
V1의 매번 호출 대신 "이번 버전 누적 참여 ≥ 3 AND 버전당 1회" 앱측 게이트를 얹어
무분별 호출을 막고, 실제 프롬프트는 각 View가 @Environment(\.requestReview)로 띄운다.
게이트는 BaseDomain AppReviewRequestUseCase + BaseData(UserDefaults+Bundle 버전) repo를
피드·감상평이 공유하며, 참여 카운트는 앱 버전이 바뀌면 0부터 다시 센다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N2fgkNPXHekVGYpGbeEC4i
타유저 프로필에서 차단이 성공하면 그 화면은 dismiss되므로, 복귀한 화면에
"{nickname}님을 차단했어요" 토스트를 띄운다(V1 parity). UserPageView가
shouldDismiss 직전 onUserBlocked(nickname) seam으로 닉네임을 올리고(Factory·
UserPageAssembly 관통), 4탭 Root(Feed·Home·Library·Mypage)가 각자 NavigationStack에
.showWSSToast(.blockUser)로 표시한다. V1의 전역 NotificationCenter(피드 탭 하나만
관찰) 대신 차단한 그 탭에서 뜨게 했다. 4탭 배선은 interim — feedEdited·novelReviewed와
함께 통합 채널로 재설계할 때 정리한다.

Demo(UserPage)로 Mock 차단→복귀 토스트를 실측 확인했고, 그 Mock 선택 화면이 길어
하단이 잘리던 것을 ScrollView로 감쌌다.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01N2fgkNPXHekVGYpGbeEC4i
[Fix] #221 - 출시 전 V1 parity 일괄 복원(작품상세·피드·서재 등) + 앱리뷰·온보딩 재도입
App 타깃을 V1(운영 앱)과 동일한 Bundle ID·Apple Developer 팀으로 서명하도록
설정하고, 실제 아카이브를 시도하며 드러난 App Store 제출 준비 공백까지 함께
메웠다(둘 다 App 타깃의 코드사이닝 설정을 다루는 같은 영역이라 하나로 묶음).

- ProjectEnvironment.swift에 debug/release Bundle ID·Apple Developer 팀 ID 추가.
- App/Project.swift: Debug/Release 서명 설정(CODE_SIGN_STYLE 등), Apple
  Generic Versioning(MARKETING_VERSION/CURRENT_PROJECT_VERSION/VERSIONING_SYSTEM),
  TARGETED_DEVICE_FAMILY(iPhone 전용, V1과 동일), 빠져있던 resources: 추가
  (앱 아이콘이 빌드에 전혀 안 들어가고 있었음), Debug/Release 아이콘 분리.
  코드사이닝 설정은 App 타깃 전용 configuration으로 분리해 다른 타깃(테스트
  타깃 등)이 상속하지 않게 함.
- Support/Info.plist: CFBundlePackageType·UISupportedInterfaceOrientations·
  버전 정보 키 추가.
- 앱 아이콘 자산(Release는 V1과 동일한 실제 아이콘, Debug는 구분용 별도 이미지).

결과: 실제 아카이브 → TestFlight 업로드까지 성공 확인. 자세한 재발 방지
포인트는 Projects/App/CLAUDE.md.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UiHDsxZTFoqFbgJe2ncrTa
V1과 같은 Apple Developer 팀·인증서 저장소를 재사용해 서명·아카이브·
TestFlight 업로드를 자동화한다(Gemfile의 fastlane gem, Matchfile/Appfile/
Fastfile). 서명은 match, 업로드 인증은 App Store Connect API 키.

- Gemfile/Gemfile.lock: fastlane gem 추가(외부 의존성 없음 원칙의 의도적
  예외 — 앱 런타임이 아니라 빌드 툴링, 루트 CLAUDE.md에 명시).
- fastlane/Appfile, Matchfile: app identifier·팀 ID는 .env(gitignore)에서
  읽어옴 — 리터럴 값은 커밋에 남기지 않음.
- fastlane/Fastfile: sync_dev_certificates(개발용 인증서 동기화),
  debug_beta/release_beta(아카이브 + TestFlight 업로드), release(App Store
  제출, 아직 호출 안 함) lane. 아카이브 시간 단축을 위해
  COMPILER_INDEX_STORE_ENABLE=NO 추가.
- .gitignore: fastlane 산출물(report.xml 등)·.env·*.p8·*.ipa 제외.
Debug/Release 스킴을 헷갈리지 않도록 스킬 자체를 분리했다. 둘 다 사전
점검(비밀값은 존재 여부만 확인, 절대 출력 안 함) → 승인 게이트 → 백그라운드
실행 → 결과 있는 그대로 보고 흐름이고, App Store 심사 제출(release lane)은
어느 쪽도 대신 호출하지 않는다.
다른 팀원도 setup 스킬만으로 실기기 빌드/아카이브 환경을 갖출 수 있도록
5단계(fastlane 서명 환경)를 추가했다 — Ruby/Bundler, .env 키 존재 확인,
MATCH_PASSWORD는 macOS Keychain 등록을 권장(비대화형 세션에서 prompt를
못 띄우므로), 인증서 저장소 접근 확인, sync_dev_certificates 실행까지.
fastlane 도입·debug_beta 아카이브→TestFlight 업로드 실제 성공을 4번
항목에 반영. 남은 미검증 항목(sync_dev_certificates development 타입,
release_beta/release lane, COMPILER_INDEX_STORE_ENABLE=NO 시간 단축 실측)도
함께 정리.
- docs/TODO.md: fastlane match 도입 이후에도 '아직 안 가져왔다'는 문구가
  남아있던 자기모순 정정. 개인 로컬 절대경로도 위치-불특정 표현으로 교체.
- README.md: 기술 스택 요약의 'Dependencies: 없음'이 이번 브랜치가 추가한
  fastlane(Gemfile)과 desync였던 것을 반영.
정의된 적 없는 $(APP_DISPLAY_NAME) 빌드 변수를 CFBundleDisplayName이
참조하고 있어서 빈 문자열로 치환되고 있었고, CFBundleName 키는 아예
없었다. 둘 다 Tuist productName으로 자동 세팅되는 $(PRODUCT_NAME)을
참조하도록 수정 — 실제 debug_beta TestFlight 업로드에서 90784 에러로 실측.
match가 development 프로파일을 Dev Portal에 검증할 때 API 키 없이는 Apple ID 대화형 로그인을
요구해 비대화형 셸에서 실패했다(실측으로 확인) — app_store_connect_api_key를 앞에 추가해 해결.
같은 김에 force_for_new_devices도 추가해, Apple Developer 사이트에 새로 등록한 기기를 이 lane
재실행만으로 프로파일에 반영되게 했다.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Dtd1P1naqPmjumyuyYwRF
신규 팀원 최초 셋업·새 기기 추가 절차를 docs/FASTLANE_ONBOARDING.md로 분리하고 CLAUDE.md 공통
문서 표에 연결. docs/TODO.md의 관련 서술(ASC API 키 불필요 등, 실측으로 틀린 것으로 확인됨)도 정정.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012Dtd1P1naqPmjumyuyYwRF
[Setting] #231 - Bundle ID 이관 준비: 운영 앱 환경설정 반영 + fastlane 도입
WSSAsyncImage의 placeholder가 캐시 미스로 실제 네트워크 요청이 도는 동안만 true인 isLoading을
받도록 바뀌었다. WSSNovelCoverImage는 이를 받아 placeholderStyle(.default/.grid)로 로딩 중
ProgressView 표시를 가른다. 시그니처 변경으로 raw WSSAsyncImage 직접 호출부(NotificationListView·
MypageCharacterEditSheet·TodayDiscoveryCard)는 기존 시각 동작을 유지한 채 인자만 무시하도록
같이 갱신했다.
LazyVGrid로 여러 셀이 동시에 뜨는 곳(WSSNovelGridCell·WSSLibraryGridCell·CollectionPreviewRow·
CreateCollectionView·CollectionDetailView 작품 그리드)에 WSSNovelCoverImage.placeholderStyle: .grid를
명시해, 셀마다 스피너가 따로 도는 대신 배경색+스피너로 로딩 상태를 보여준다.
WSSNovelCoverImage의 .default/.grid placeholderStyle과 raw WSSAsyncImage의 isLoading 인자를
picsum.photos 이미지로 실제 확인할 수 있는 WSSAsyncImageDemoView를 추가하고 Demo 앱 진입 화면으로 연결했다.
WSSNovelCoverImage와 같은 결로 WSSAsyncImage의 isLoading을 받아 로딩 중엔 ProgressView, 그 외
(URL nil·실패)엔 defaultImage(기본 imgEmptyCover)로 폴백한다. contentMode(기본 .fill)도 받아 크롭 없이
원본 비율을 보여줘야 하는 자리(캐릭터 대표 이미지 등)엔 .fit을 넘길 수 있다.
FeedDetailCommentInputBar는 2-클로저 AsyncImage 오버로드를 쓰고 있어 로딩 실패 시에도 ProgressView가
계속 도는 버그가 있었는데, WSSProfileImage(→ WSSAsyncImage 3상태 분기)로 옮기며 함께 고쳐졌다.
대표 캐릭터 이미지(250x250)는 원본을 잘라내면 안 되는 자리라 contentMode: .fit을 명시로 넘긴다.
Guryss and others added 19 commits September 13, 2026 01:30
[Feat] #250 - Feature 화면별 Amplitude 이벤트 트래킹 배선
기획측 2차 QA 요청 반영. 관련 주석·문서 6곳도 함께 동기화하고, 작업 중
발견한 WSSEmptyView 미통합 상태를 LibraryFeature/CLAUDE.md와 docs/TODO.md에
기록.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JFcd5bdXvcMC4vaNgPNZFW
Xcode 프로젝트 knownRegions에 ko가 등록돼 있지 않아, 시스템 편집 메뉴
(Paste/Copy/Select All 등)가 기기 언어와 무관하게 항상 영어로 표시되던
문제. ko.lproj/InfoPlist.strings(빈 파일)를 추가해 knownRegions에 ko를
등록(tuist generate로 반영 확인).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JFcd5bdXvcMC4vaNgPNZFW
NormalSearchResultItemRow에 contentShape(Rectangle())이 없어 표지-텍스트
사이 간격, 텍스트 오른쪽 여백이 탭이 안 먹던 문제 수정.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JFcd5bdXvcMC4vaNgPNZFW
wss-pr-reviewer 1라운드 지적 반영. LibraryFeature/CLAUDE.md 핵심 시나리오
절과 LibraryView·UserLibraryView의 주석이 여전히 옛 문구를 인용하던 것을
정정하고, docs/TODO.md의 17번 항목 위치를 오름차순 번호 순서에 맞게
16번 뒤로 이동.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JFcd5bdXvcMC4vaNgPNZFW
wss-pr-reviewer 1라운드 지적 반영. 빈 파일이라 안 쓰는 파일로 오인해
삭제될 위험이 있어, knownRegions에 ko를 등록시키는 유일한 장치라는
비자명한 이유를 App CLAUDE.md 주의사항 절에 남김.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JFcd5bdXvcMC4vaNgPNZFW
wss-pr-reviewer 2라운드 Nit 반영.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JFcd5bdXvcMC4vaNgPNZFW
[Fix] #266 - 2차 QA 기획 요구사항 - 검색 화면 텍스트/UI 수정
- .github/workflows/release.yml 신설: main push 트리거, CUTOVER_READY + app-store-release
  Environment 승인 게이트를 거쳐 fastlane release lane 실행
- fastlane/Fastfile: release lane에 CUTOVER_READY 가드 추가(로컬 실행도 방어), deliver force: true
- fastlane/metadata/ko/release_notes.txt 신설: 심사 제출 릴리즈 노트 출처(git 버전관리)
- .github/workflows/test.yml: PR 대상에 main 추가(develop→main 릴리스 PR도 테스트/아키텍처 검사)
- docs/WORKFLOW.md, docs/TODO.md: 새 배포 파이프라인 반영

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xw3U9yFqRTVT96h2CQMHXQ
- .claude/scripts/make-release-pr.sh 신설: preflight(develop↔main 비교, 버전 참고값,
  대량 커밋일 때 PR 병합 단위 압축 롤업) + pr-create(base=main PR 생성)
- .claude/skills/make-release-PR/SKILL.md 신설: 버전·릴리즈노트 질문 → new-issue 재사용해
  브랜치 생성 → Project.swift/release_notes.txt 반영 커밋 → base=main PR 생성까지 절차화
- 이슈·브랜치 생성은 재발명하지 않고 기존 new-issue 스킬을 그대로 재사용

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xw3U9yFqRTVT96h2CQMHXQ
…불일치 수정

- release.yml: fastlane/Appfile이 로드 시점에 APP_IDENTIFIER_DEBUG도 ENV.fetch로 요구해
  release lane 실행 전 KeyError로 죽던 문제 수정(secret 전달 추가)
- release.yml: CONFIG_BASE_URL/CONFIG_BUCKET_URL 시크릿을 평범한 https:// 형태로 등록해도
  되도록 xcconfig // 주석 파싱 회피 이스케이프를 워크플로우가 자동 적용
- release.yml: permissions: contents: read 명시(최소권한, test.yml과 일관)
- docs/TODO.md: main 브랜치 보호·Environment는 이미 완료된 상태로 정정(WORKFLOW.md와 불일치
  해소), 시크릿 목록에 APP_IDENTIFIER_DEBUG 추가, deliver 메타데이터 확인 필요성 명시
- make-release-PR/SKILL.md: Project.swift 변경 후 Scripts/patch-spm-deployment-target.sh
  실행 단계 추가(루트 CLAUDE.md 비협상 누락)

wss-pr-reviewer 리뷰 반영 (Blocker 1, Warning 3)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Xw3U9yFqRTVT96h2CQMHXQ
[Setting] #264 - main 브랜치 push 시 App Store 심사 자동 제출 CI 구축
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
[Fix] #269 - 작품 알림 삭제 관련 텍스트 수정
@Guryss Guryss self-assigned this Sep 20, 2026
@github-actions

github-actions Bot commented Sep 20, 2026

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.3%
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-20 20:29 KST

Guryss and others added 4 commits September 20, 2026 19:08
문구("Re : " 접두어)만 되돌리고 알럿 스타일(아이콘·폰트·패딩·색상) 변경은 유지.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
[Fix] #273 - 작품 알림 삭제 요약 문구의 "Re : " 접두어만 원복
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Guryss and others added 2 commits September 20, 2026 19:25
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@Guryss
Guryss merged commit c3d0ffc into main Sep 21, 2026
40 checks passed
@Guryss
Guryss deleted the Setting/#271 branch September 21, 2026 08:37
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.

2 participants