Skip to content

[refactor] 인증 흐름을 안정화하고 React Native 팝업 요청을 도입한다#68

Merged
indextrown merged 9 commits into
mainfrom
refactor/#67
Jul 14, 2026
Merged

[refactor] 인증 흐름을 안정화하고 React Native 팝업 요청을 도입한다#68
indextrown merged 9 commits into
mainfrom
refactor/#67

Conversation

@indextrown

@indextrown indextrown commented Jul 13, 2026

Copy link
Copy Markdown
Contributor

💡 PR 유형

  • Feature: 기능 추가
  • Fix: 일반 버그 수정
  • Hotfix: 긴급 버그 수정
  • Chore: 환경 설정 및 기타 작업
  • Refactor: 코드 개선
  • Test: 테스트 코드 작성
  • Docs: 문서 작성 및 수정

✏️ 변경 사항

  • App root store 생성 위치와 초기화 흐름을 정리해 body 재평가로 AppFeature state가 다시 조립되지 않도록 했습니다.
  • 각 탭 feature가 @Shared session을 직접 관찰하지 않고 MainTab이 전달한 사용자 snapshot을 사용하도록 변경했습니다.
  • 로그아웃 시 MainTab의 navigation state를 먼저 정리하고, root 전환 뒤 optional child state와 session을 제거하도록 순서를 분리했습니다.
  • 기존 Swift 팝업 제보·제보 관리·제출 폼 feature를 제거하고, 공통 PopPangRNFeature를 통해 React Native 화면을 표시하도록 전환했습니다.
  • Swift와 React Native 사이에 화면 식별자, 사용자 UUID, native event contract를 두어 제보 완료·뒤로 가기 이벤트를 기존 TCA navigation으로 처리했습니다.
  • 사전 빌드 React Native 릴리즈 artifact 다운로드 스크립트와 CI 단계를 추가하고, 릴리즈 main.jsbundle을 앱 리소스로 포함했습니다.
  • 홈의 팝업 제보·관리 버튼을 복구해 React Native 제보 화면과 관리자 관리 화면으로 진입하도록 연결했습니다.
  • MainTab 테스트와 TCA navigation/아키텍처 문서를 현재 구조에 맞게 갱신했습니다.

🚨 관련 이슈

🎨 스크린샷

기능 스크린샷
팝업 제보/관리

✅ 체크리스트

  • 코드/커밋이 정해진 컨벤션을 잘 따르고 있나요?
  • PR의 Assignees와 Reviewers를 설정했나요?
  • 불필요한 코드가 없고, 정상적으로 동작하는지 확인했나요?
  • 관련 이슈 번호를 작성했나요?

🔥 추가 설명

인증 전환 문제 원인과 해결

  • TabView가 선택되지 않은 탭의 body와 lifecycle을 재평가할 때, 각 탭이 직접 관찰하던 shared session이 로그아웃으로 비어 Home이 로그인 사용자를 전제한 값에 접근할 수 있었습니다.
  • 사용자 정보의 소유권을 MainTab에 두고 child feature에는 필요한 snapshot만 전달했습니다. 로그아웃은 navigation 정리, onboarding 전환, child state/session 제거 순서로 실행해 SwiftUI path write-back과 TCA ifLet 경고를 방지했습니다.

React Native 연동

  • React Native는 Metro가 아닌 사전 빌드된 릴리즈 main.jsbundle만 로드합니다.
  • request, request-management 화면은 각각 full-screen presentation과 NavigationStack push를 유지하며, RN이 보낸 완료/뒤로 가기 이벤트를 TCA delegate action으로 변환해 화면을 닫습니다.

검증한 내용

  • tuist generate를 수행했습니다.
  • xcodebuild build -workspace PopPang.xcworkspace -scheme PopPangApp -configuration Debug -destination "generic/platform=iOS Simulator" 빌드를 통과했습니다.
  • git diff --checkHomeFeatureView.swift Swift 구문 검사를 통과했습니다.

추가 확인 필요

  • 현재 Simulator는 /private/tmp 접근 권한 문제로 실행 검증이 불가능합니다. 기기 실행은 정상 동작을 확인했습니다.

Summary by CodeRabbit

  • 새로운 기능
    • React Native 기반 팝업 제보 및 관리자 관리 화면(네이티브 이벤트 처리) 제공.
    • 소셜 로그인 콜백 및 팝업 딥링크/유니버설 링크 처리 지원.
  • 개선 사항
    • 탭 전환 시 사용자 정보와 화면 상태 동기화 방식 개선.
    • 로그아웃/온보딩 화면 전환 및 네비게이션 해제 동작 개선.
    • 닉네임/알림 상태 변경이 관련 화면에 즉시 반영.
    • 입력 필드 선택적 포커스 제어 지원.
  • 문서
    • TCA 내비게이션/세션 소유 규칙 및 React Native 연동 가이드 업데이트.

@indextrown indextrown added the 🔧 fix 일반적인 버그 수정 이슈 label Jul 13, 2026
@indextrown indextrown self-assigned this Jul 13, 2026
@coderabbitai

coderabbitai Bot commented Jul 13, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

@indextrown, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 31 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: c4bb8f37-1f58-41b1-ad0e-6d85e230e2ad

📥 Commits

Reviewing files that changed from the base of the PR and between c67de16 and aab07fb.

📒 Files selected for processing (1)
  • Projects/App/Project.swift
📝 Walkthrough

Walkthrough

앱 초기화와 루트 TCA 내비게이션을 AppFeature 중심으로 구성하고, 런치·인증·로그아웃 전환을 정비했습니다. 하위 기능은 shared session 대신 User 또는 사용자 식별자 스냅샷을 상태에 보유합니다. 기존 팝업 요청·관리 화면은 React Native 호스트 모듈과 이벤트 라우팅으로 교체되었고, CI에서 RN 아티팩트 다운로드 및 링크 설정이 추가되었습니다.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant PopPangApp
  participant AppBootstrap
  participant AppFeature
  participant MainTabFeature
  participant PopPangRNFeature
  PopPangApp->>AppBootstrap: makeAppStore()
  AppBootstrap->>AppFeature: 루트 Store 생성
  AppFeature->>MainTabFeature: User 스냅샷으로 main 상태 구성
  MainTabFeature->>PopPangRNFeature: 화면·userUuid 전달
  PopPangRNFeature->>MainTabFeature: native event delegate 전달
Loading

Poem

세션은 뿌리로, 스냅샷은 탭으로
RN 화면이 팝업 길을 잇고
로그아웃 전엔 경로를 정리하고
delegate 바람에 이름도 싱크
TCA 항해, 출항 완료!

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 인증 흐름 정비와 React Native 팝업 요청 도입이라는 핵심 변경을 잘 요약합니다.
Linked Issues check ✅ Passed [#67] 앱 초기화/인증 전환 정비와 기능 모듈 재연결 경계를 마련하는 변경이 반영되어 요구사항을 충족합니다.
Out of Scope Changes check ✅ Passed 문서·CI·테스트·세부 feature 수정도 RN 팝업 전환과 초기화 안정화 범위 안에 있어, 뚜렷한 이탈은 보이지 않습니다.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch refactor/#67

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1

🧹 Nitpick comments (3)
Projects/Features/ProfileFeature/Sources/Presentation/ProfileFeatureView.swift (1)

159-159: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

주석 처리된 @Environment(\.dismiss) 제거 권장

사용하지 않는 환경 프로퍼티는 주석 처리보다 삭제하는 것이 코드 가독성에 좋습니다. 필요시 Git 히스토리에서 복구 가능합니다.

♻️ 제안
-    // `@Environment`(\.dismiss) private var dismiss
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@Projects/Features/ProfileFeature/Sources/Presentation/ProfileFeatureView.swift`
at line 159, ProfileFeatureView에서 주석 처리된 `@Environment(\.dismiss) private var
dismiss` 선언을 완전히 삭제하세요. 사용되지 않는 환경 프로퍼티만 제거하고 주변 코드와 동작은 변경하지 마세요.
Projects/Features/AlertFeature/Sources/Presentation/AlertFeature.swift (1)

39-50: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

커스텀 ==는 삭제하고 합성 Equatable에 맡기세요
State의 저장 프로퍼티는 모두 Equatable이고, @ObservableState는 관찰용 내부 구현을 추가해도 Equatable 합성을 깨지 않습니다. 지금 구현은 새 필드 추가 시 누락 위험만 키우니 public struct State: Equatable만 남기는 편이 더 안전합니다. Apple Observation 문서와 TCA의 @ObservableState 문서도 같이 보면 좋습니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Projects/Features/AlertFeature/Sources/Presentation/AlertFeature.swift`
around lines 39 - 50, Remove the custom == implementation for State and rely on
synthesized Equatable conformance from public struct State: Equatable. Keep all
stored properties and the `@ObservableState` behavior unchanged.
Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeature.swift (1)

1-1: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

닉네임 기본값 "닉네임" 폴백 로직이 3곳에 중복돼 있어요.

HomeFeature, ProfileFeature, ProfileSettingFeature 세 State init에서 user.nickname ?? "닉네임"을 각각 따로 구현하고 있습니다. 같은 문구를 세 군데서 관리하면 나중에 기본 닉네임 정책이 바뀔 때 하나를 빠뜨리기 쉽습니다. Domain 모듈의 UserdisplayNickname 같은 계산 프로퍼티를 추가해서 한 곳으로 모으는 게 어떨까요.

  • Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeature.swift#L21-25: self.nickname = user.nickname ?? "닉네임"self.nickname = user.displayNickname으로 교체.
  • Projects/Features/ProfileFeature/Sources/Presentation/ProfileFeature.swift#L16-20: ProfileFeature.State.init의 동일 폴백 로직을 같은 확장 프로퍼티로 교체.
  • Projects/Features/ProfileFeature/Sources/Presentation/ProfileFeature.swift#L114-117: ProfileSettingFeature.State.init의 동일 폴백 로직도 함께 교체.
♻️ 제안 (Domain 모듈)
public extension User {
    var displayNickname: String { nickname ?? "닉네임" }
}
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeature.swift` at
line 1, 중복된 닉네임 기본값 처리를 Domain 모듈의 User에 public displayNickname 계산 프로퍼티로 통합하고,
HomeFeature.State.init, ProfileFeature.State.init,
ProfileSettingFeature.State.init에서 각각 user.nickname ?? "닉네임" 대신 해당 프로퍼티를 사용하도록
변경하세요.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeature.swift`:
- Around line 69-75: Update the HomeFeature reducer’s `.onAppear` handling and
`loadAllPopupData` effect to use a dedicated CancelID, matching the existing
MapFeature pattern, and apply `.cancellable(id:cancelInFlight: true)` so a new
initial load cancels any in-flight request before starting.

---

Nitpick comments:
In `@Projects/Features/AlertFeature/Sources/Presentation/AlertFeature.swift`:
- Around line 39-50: Remove the custom == implementation for State and rely on
synthesized Equatable conformance from public struct State: Equatable. Keep all
stored properties and the `@ObservableState` behavior unchanged.

In `@Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeature.swift`:
- Line 1: 중복된 닉네임 기본값 처리를 Domain 모듈의 User에 public displayNickname 계산 프로퍼티로 통합하고,
HomeFeature.State.init, ProfileFeature.State.init,
ProfileSettingFeature.State.init에서 각각 user.nickname ?? "닉네임" 대신 해당 프로퍼티를 사용하도록
변경하세요.

In
`@Projects/Features/ProfileFeature/Sources/Presentation/ProfileFeatureView.swift`:
- Line 159: ProfileFeatureView에서 주석 처리된 `@Environment(\.dismiss) private var
dismiss` 선언을 완전히 삭제하세요. 사용되지 않는 환경 프로퍼티만 제거하고 주변 코드와 동작은 변경하지 마세요.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 43927dbe-60f4-44c2-8162-5767b0ee9e3e

📥 Commits

Reviewing files that changed from the base of the PR and between d11c33c and c672336.

📒 Files selected for processing (29)
  • Docs/poppang-architecture.md
  • Docs/tca-navigation-guidelines.md
  • Projects/App/Sources/AppCore/0. AppSDKInitializer.swift
  • Projects/App/Sources/AppCore/1. AppDependencyRegistry.swift
  • Projects/App/Sources/AppCore/2. AppBootstrap.swift
  • Projects/App/Sources/AppCore/3. AppDeepLinkHandler.swift
  • Projects/App/Sources/AppCore/AppDeepLinkHandler.swift
  • Projects/App/Sources/AppCore/Navigation/7. AppRootFlowView.swift
  • Projects/App/Sources/AppCore/Navigation/8. AppFeature.swift
  • Projects/App/Sources/AppCore/Navigation/AppFeature.swift
  • Projects/App/Sources/PopPangApp.swift
  • Projects/Features/AlertFeature/Demo/Sources/AlertFeatureDemoApp.swift
  • Projects/Features/AlertFeature/Sources/Presentation/AlertFeature.swift
  • Projects/Features/CalendarFeature/Demo/Sources/CalendarFeatureDemoApp.swift
  • Projects/Features/CalendarFeature/Sources/Presentation/CalendarFeature.swift
  • Projects/Features/CalendarFeature/Sources/Presentation/CalendarFeatureView.swift
  • Projects/Features/FavoritesFeature/Demo/Sources/FavoritesFeatureDemoApp.swift
  • Projects/Features/FavoritesFeature/Sources/Presentation/FavoritesFeature.swift
  • Projects/Features/HomeFeature/Demo/Sources/HomeFeatureDemoApp.swift
  • Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeature.swift
  • Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeatureView.swift
  • Projects/Features/HomeFeature/Tests/HomeFeatureTests.swift
  • Projects/Features/MainTabFeature/Sources/MainTabFeature.swift
  • Projects/Features/MainTabFeature/Tests/MainTabFeatureTests.swift
  • Projects/Features/MapFeature/Demo/Sources/MapFeatureDemoApp.swift
  • Projects/Features/MapFeature/Sources/Presentation/MapFeature.swift
  • Projects/Features/ProfileFeature/Demo/Sources/ProfileFeatureDemoApp.swift
  • Projects/Features/ProfileFeature/Sources/Presentation/ProfileFeature.swift
  • Projects/Features/ProfileFeature/Sources/Presentation/ProfileFeatureView.swift
💤 Files with no reviewable changes (2)
  • Projects/App/Sources/AppCore/Navigation/AppFeature.swift
  • Projects/App/Sources/AppCore/AppDeepLinkHandler.swift

Comment on lines 69 to +75
case .onAppear:
state.isLoading = true
state.errorMessage = nil
return loadAllPopupData(state: state)
return loadAllPopupData(
userUuid: state.userUuid,
filter: state.filter
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Map the target file first
ast-grep outline Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeature.swift --view expanded

# Search for cancellation/task-related patterns in HomeFeature and nearby feature files
rg -n --hidden --glob 'Projects/Features/HomeFeature/**' --glob 'Projects/Features/**' \
  '\.cancellable\(|CancelID|\.task\(id:|onAppear|loadAllPopupData|cancelInFlight|cancel' .

# Read the relevant slices of HomeFeature.swift with line numbers
sed -n '1,260p' Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeature.swift

# Inspect any related view or tab feature files that may apply cancellation at a higher layer
fd -a 'HomeFeatureView.swift|MainTabFeature.swift|HomeFeatureTests.swift' Projects

Repository: team-PopPang/PopPang-iOS

Length of output: 18570


🏁 Script executed:

#!/bin/bash
set -euo pipefail

# Read the relevant HomeFeatureView slice around the onAppear/task usage
sed -n '200,260p' Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeatureView.swift

# Read MainTabFeature for tab-switch behavior and child feature lifetime
sed -n '1,240p' Projects/Features/MainTabFeature/Sources/MainTabFeature.swift

# Read HomeFeature tests for any cancellation-related expectation
sed -n '1,260p' Projects/Features/HomeFeature/Tests/HomeFeatureTests.swift

Repository: team-PopPang/PopPang-iOS

Length of output: 14953


loadAllPopupData에 취소 ID를 붙여 중복 로드를 막아주세요.
HomeFeatureView.task는 뷰 이탈 시 취소되지만, 한 번 .onAppear가 전달된 뒤에는 loadAllPopupData가 끝까지 살아 있어 탭 재진입/새로고침 시 요청이 겹칠 수 있습니다. MapFeature처럼 CancelID를 두고 .cancellable(id:cancelInFlight: true)로 감싸면 홈 초기 로드의 레이스를 줄일 수 있어요. SwiftUI의 .task와 TCA cancellation은 역할이 달라서, 이 케이스는 reducer 쪽에서 끊어주는 편이 안전합니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeature.swift`
around lines 69 - 75, Update the HomeFeature reducer’s `.onAppear` handling and
`loadAllPopupData` effect to use a dedicated CancelID, matching the existing
MapFeature pattern, and apply `.cancellable(id:cancelInFlight: true)` so a new
initial load cancels any in-flight request before starting.

@indextrown indextrown changed the title [refactor] 앱 초기화와 인증 진입 흐름을 정비한다 [refactor] 인증 흐름을 안정화하고 React Native 팝업 요청을 도입한다 Jul 13, 2026

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 2

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@Projects/Features/AuthFeature/Sources/Presentation/RegisterFlowFeatureView.swift`:
- Around line 158-159: RegisterFlowFeatureView의 닉네임 입력 화면 진입 시 최초 자동 포커스를 복구하세요.
현재 focus에 $isFocused를 전달하더라도 초기값이 false이므로, 기존 화면 전환 애니메이션 이후 task 또는 onAppear
흐름에서 isFocused를 명시적으로 true로 설정하고 입력란 바인딩은 유지하세요.

In `@scripts/download-rn-release.sh`:
- Around line 24-36: Update the download flow in scripts/download-rn-release.sh
after both gh release download commands to verify each ZIP’s SHA-256 checksum
against the repository-committed expected values before any extraction or use;
fail immediately on a mismatch and ensure both the iOS bundle and SPM framework
assets are covered.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0a6813e4-51e8-4441-8d53-262aeeaf0a05

📥 Commits

Reviewing files that changed from the base of the PR and between c672336 and 97c9818.

⛔ Files ignored due to path filters (2)
  • Docs/images/module-dependency-graph-legacy.png is excluded by !**/*.png
  • Docs/images/module-dependency-graph.png is excluded by !**/*.png
📒 Files selected for processing (52)
  • .github/workflows/1. poppang-build.yml
  • .github/workflows/2. poppang-test.yml
  • .github/workflows/3. poppang-build-and-test.yml
  • .gitignore
  • Docs/poppang-architecture.md
  • Docs/static-dynamic-linking.md
  • Docs/tca-navigation-guidelines.md
  • Projects/App/Project.swift
  • Projects/App/Sources/AppCore/1. AppDependencyRegistry.swift
  • Projects/App/Sources/AppCore/2. AppBootstrap.swift
  • Projects/App/Sources/AppCore/Navigation/7. AppRootFlowView.swift
  • Projects/App/Sources/AppCore/Navigation/8. AppFeature.swift
  • Projects/Features/AuthFeature/Sources/Presentation/RegisterFlowFeatureView.swift
  • Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeatureView.swift
  • Projects/Features/MainTabFeature/Project.swift
  • Projects/Features/MainTabFeature/Sources/MainTabFeature.swift
  • Projects/Features/MainTabFeature/Sources/MainTabFeatureDependencies.swift
  • Projects/Features/MainTabFeature/Sources/MainTabFeatureView.swift
  • Projects/Features/MainTabFeature/Tests/MainTabFeatureTests.swift
  • Projects/Features/PopPangRNFeature/Project.swift
  • Projects/Features/PopPangRNFeature/Sources/Presentation/PopPangRNFeature.swift
  • Projects/Features/PopPangRNFeature/Sources/Presentation/PopPangRNFeatureView.swift
  • Projects/Features/PopPangRNFeature/Sources/Support/ReactNativeScreen.swift
  • Projects/Features/PopupRequestFeature/Demo/Sources/PopupRequestFeatureDemoApp.swift
  • Projects/Features/PopupRequestFeature/Project.swift
  • Projects/Features/PopupRequestFeature/Sources/Dependency/PopupRequestClient.swift
  • Projects/Features/PopupRequestFeature/Sources/Presentation/PopupRequestFeature.swift
  • Projects/Features/PopupRequestFeature/Sources/Presentation/PopupRequestFeatureView.swift
  • Projects/Features/PopupRequestFeature/Sources/Support/PopupRequestSubmitState.swift
  • Projects/Features/PopupRequestFeature/Tests/PopupRequestFeatureTests.swift
  • Projects/Features/PopupRequestManagementFeature/Demo/Sources/PopupRequestManagementFeatureDemoApp.swift
  • Projects/Features/PopupRequestManagementFeature/Project.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Dependency/PopupRequestManagementClient.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementDetailFeature.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementDetailView.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementFlowFeature.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementFlowView.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementListFeature.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementListView.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Support/PopupRequestManagementFilter.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Support/PopupRequestManagementListItem.swift
  • Projects/Features/PopupRequestManagementFeature/Tests/PopupRequestManagementFeatureTests.swift
  • Projects/Features/PopupSubmissionFormFeature/Project.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Presentation/PopupSubmissionFormFeature.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Presentation/PopupSubmissionFormView.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Support/PopupSubmissionFormMapper.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Support/PopupSubmissionFormMode.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Support/PopupSubmissionFormValidator.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Support/PopupSubmissionImageItem.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Support/PopupSubmissionTimeParser.swift
  • Projects/Shared/DSKit/Sources/Component/TextField/RoundedTextField.swift
  • scripts/download-rn-release.sh
💤 Files with no reviewable changes (30)
  • Projects/Features/PopupRequestManagementFeature/Tests/PopupRequestManagementFeatureTests.swift
  • Projects/Features/PopupRequestFeature/Sources/Support/PopupRequestSubmitState.swift
  • Projects/Features/PopupSubmissionFormFeature/Project.swift
  • Projects/Features/PopupRequestManagementFeature/Demo/Sources/PopupRequestManagementFeatureDemoApp.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Support/PopupSubmissionImageItem.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Support/PopupRequestManagementListItem.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Presentation/PopupSubmissionFormView.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Support/PopupSubmissionTimeParser.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementDetailView.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Support/PopupRequestManagementFilter.swift
  • Projects/Features/PopupRequestManagementFeature/Project.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementDetailFeature.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Support/PopupSubmissionFormMode.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementListView.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementListFeature.swift
  • Projects/Features/PopupRequestFeature/Sources/Presentation/PopupRequestFeature.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementFlowFeature.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Presentation/PopupSubmissionFormFeature.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Support/PopupSubmissionFormValidator.swift
  • Projects/Features/PopupRequestFeature/Project.swift
  • Projects/Features/PopupRequestFeature/Tests/PopupRequestFeatureTests.swift
  • Projects/Features/PopupRequestFeature/Demo/Sources/PopupRequestFeatureDemoApp.swift
  • Projects/Features/PopupSubmissionFormFeature/Sources/Support/PopupSubmissionFormMapper.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Presentation/PopupRequestManagementFlowView.swift
  • Projects/Features/PopupRequestManagementFeature/Sources/Dependency/PopupRequestManagementClient.swift
  • Projects/App/Sources/AppCore/2. AppBootstrap.swift
  • Projects/Features/PopupRequestFeature/Sources/Dependency/PopupRequestClient.swift
  • Projects/Features/MainTabFeature/Sources/MainTabFeatureDependencies.swift
  • Projects/App/Sources/AppCore/1. AppDependencyRegistry.swift
  • Projects/Features/PopupRequestFeature/Sources/Presentation/PopupRequestFeatureView.swift
🚧 Files skipped from review as they are similar to previous changes (6)
  • Projects/App/Sources/AppCore/Navigation/7. AppRootFlowView.swift
  • Projects/Features/HomeFeature/Sources/Presentation/Home/HomeFeatureView.swift
  • Projects/Features/MainTabFeature/Tests/MainTabFeatureTests.swift
  • Docs/tca-navigation-guidelines.md
  • Projects/Features/MainTabFeature/Sources/MainTabFeature.swift
  • Projects/App/Sources/AppCore/Navigation/8. AppFeature.swift

Comment on lines +24 to +36
echo "iOS bundle 다운로드"
gh release download "$VERSION" \
--repo "$REPO" \
--pattern "$BUNDLE_ASSET_NAME" \
--dir "$TMP_DIR" \
--clobber

echo "SPM 패키지 다운로드"
gh release download "$VERSION" \
--repo "$REPO" \
--pattern "$FRAMEWORK_ASSET_NAME" \
--dir "$TMP_DIR" \
--clobber

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🔒 Security & Privacy | 🟠 Major | 🏗️ Heavy lift

RN 실행 아티팩트의 무결성을 검증해 주세요.

태그와 HTTPS는 다운로드 위치만 보장하며 release asset의 콘텐츠를 고정하지 않습니다. 이 파일들은 앱에서 실행·링크되므로, 압축 해제 전에 이 저장소에 커밋된 SHA-256 값과 두 ZIP을 검증해야 합니다. asset이 교체되거나 공급망이 침해되면 임의 코드가 그대로 배포될 수 있습니다.

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@scripts/download-rn-release.sh` around lines 24 - 36, Update the download
flow in scripts/download-rn-release.sh after both gh release download commands
to verify each ZIP’s SHA-256 checksum against the repository-committed expected
values before any extraction or use; fail immediately on a mismatch and ensure
both the iOS bundle and SPM framework assets are covered.

@indextrown indextrown merged commit 57acd07 into main Jul 14, 2026
7 checks passed
@indextrown indextrown deleted the refactor/#67 branch July 14, 2026 04:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

🔧 fix 일반적인 버그 수정 이슈

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[refactor] 앱 초기화와 인증 진입 흐름을 정비한다

1 participant