Skip to content

[feat] #223 GA4 이벤트 추가#227

Merged
Ojongseok merged 15 commits into
developfrom
feat/#223-5th-ga4
Jul 12, 2026
Merged

[feat] #223 GA4 이벤트 추가#227
Ojongseok merged 15 commits into
developfrom
feat/#223-5th-ga4

Conversation

@Ojongseok

@Ojongseok Ojongseok commented Jul 4, 2026

Copy link
Copy Markdown
Member

🔗 관련 이슈

📙 작업 설명

  • GA4 신규 이벤트 목록의 [AOS 상태] 항목의 시작 전 -> 진행 중으로 변경된 이벤트들이 이번 PR에 반영된 항목입니다.

🧪 테스트 내역

  • Firebase DebugView로 각 이벤트 수신 확인

📸 스크린샷 또는 시연 영상

  • 없음

💬 추가 설명 or 리뷰 포인트

  • notification_click: NekiFirebaseMessagingService의 PendingIntent에 extra를 추가하고, MainActivityonCreate / onNewIntent 포그라운드/백그라운드 구분해서 감지하여 로깅
  • MainActivity 선언의 android:launchMode="singleTop" 추가

Summary by CodeRabbit

  • 개선 사항
    • 사진을 앨범에 추가/복사할 때 수량 및 앨범 정보가 포함된 이벤트가 함께 기록됩니다.
    • 지도에서 즐겨찾기 진입/필터 토글/부스 즐겨찾기 추가·삭제/브랜드 순서 저장 활동이 정밀하게 추적됩니다.
    • 알림 클릭으로 앱에 진입한 경우 “진입 경로” 이벤트가 추가로 기록됩니다.
    • 알림으로 다시 열 때 공유 콘텐츠 처리가 안정적으로 유지됩니다.
  • 문서
    • GA4 이벤트 네이밍/파라미터 규칙과 화면 흐름별 로깅 위치 가이드를 추가했습니다.
  • 설정
    • MainActivity 재사용 런치 동작이 singleTop 모드로 설정됩니다.

…e, favorite_booth_filter_toggle, favorite_booth_view, brand_filter_manage_view)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Ojongseok Ojongseok added the feat label Jul 4, 2026
@coderabbitai

coderabbitai Bot commented Jul 4, 2026

Copy link
Copy Markdown

Review Change Stack

Warning

Review limit reached

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

Next review available in: 48 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: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5fce2bca-336c-48b8-b29f-7d47964d6db9

📥 Commits

Reviewing files that changed from the base of the PR and between 027b05a and 5ba2286.

📒 Files selected for processing (2)
  • .claude/skills/firebase-analytics-event/SKILL.md
  • .claude/skills/firebase-analytics-event/analytics-spec.md
📝 Walkthrough

Walkthrough

Firebase Analytics 이벤트 스펙과 작업 가이드를 추가하고, 아카이브·지도 기능의 이벤트 및 로깅 지점을 확장했습니다. 알림 클릭을 식별하는 인텐트 플래그와 notification_click 이벤트도 추가했습니다.

Changes

애널리틱스 이벤트 추가 및 로깅

Layer / File(s) Summary
애널리틱스 스킬 및 스펙 문서
.claude/skills/firebase-analytics-event/*
이벤트 네이밍, 파라미터, 로깅 위치, 기능별 이벤트 트리거와 작업 절차를 문서화합니다.
애널리틱스 이벤트 타입 정의
core/analytics/src/main/kotlin/com/neki/android/core/analytics/event/*
아카이브 사진 추가, 지도 즐겨찾기·브랜드 순서, 알림 클릭 이벤트와 관련 파라미터를 정의합니다.
아카이빙 PhotoAddToAlbum 이벤트
feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/album_detail/AlbumDetailViewModel.kt
사진 가져오기 성공 시 선택 사진 수와 대상 앨범 수를 기록합니다.
지도 즐겨찾기 및 브랜드 순서 로깅
feature/map/impl/src/main/java/com/neki/android/feature/map/impl/*
즐겨찾기 필터·탭·추가·삭제와 브랜드 순서 저장 성공 시 이벤트를 기록합니다.
알림 클릭 추적 흐름
app/src/main/AndroidManifest.xml, app/src/main/java/com/neki/android/app/*
singleTop 실행 모드와 알림 출처 플래그를 추가하고, onCreateonNewIntent에서 알림 클릭 이벤트를 기록합니다.

Estimated code review effort: 3 (Moderate) | ~25 minutes

Sequence Diagram(s)

sequenceDiagram
  participant NekiFirebaseMessagingService
  participant MainActivity
  participant AnalyticsLogger
  NekiFirebaseMessagingService->>NekiFirebaseMessagingService: 알림 PendingIntent에 출처 플래그 추가
  NekiFirebaseMessagingService->>MainActivity: 알림 클릭 인텐트 전달
  MainActivity->>AnalyticsLogger: NotificationClick 기록
Loading

Possibly related PRs

Suggested reviewers: ikseong00

Poem

당근처럼 새 이벤트가 톡,
토끼는 로그를 쫑긋쫑긋.
지도와 앨범 길을 따라
알림도 빠짐없이 찰칵!
GA4 숲에 기록이 피네.

🚥 Pre-merge checks | ✅ 3 | ❌ 2

❌ Failed checks (2 warnings)

Check name Status Explanation Resolution
Out of Scope Changes check ⚠️ Warning 아카이빙 이벤트 추가와 notification_click/launchMode 변경은 지도 관련 #223 범위를 벗어난 변경으로 보입니다. 지도 관련 이벤트만 유지하고, 아카이빙·알림 클릭처럼 별도 범주의 변경은 다른 PR로 분리하거나 #223 범위 포함 여부를 명확히 해주세요.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (3 passed)
Check name Status Explanation
Title check ✅ Passed 제목이 #223의 GA4 이벤트 추가라는 핵심 변경을 간결하게 요약합니다.
Description check ✅ Passed 필수 섹션인 관련 이슈, 작업 설명, 테스트 내역, 추가 설명이 모두 포함되어 있습니다.
Linked Issues check ✅ Passed #223의 GA4 이벤트 추가 요구에 맞게 지도 관련 이벤트와 로깅 연결이 구현되었습니다.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/#223-5th-ga4

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.

@github-actions
github-actions Bot requested a review from ikseong00 July 4, 2026 07:25
@Ojongseok
Ojongseok marked this pull request as draft July 4, 2026 07:25
Ojongseok and others added 8 commits July 4, 2026 17:56
- create-issue, create-pr, firebase-analytics-event 스킬 레포 관리
- analytics-spec.md: #223 신규 이벤트 반영
  (photo_add_to_album, booth_favorite_add/remove, favorite_booth_filter_toggle, favorite_booth_view, brand_filter_manage_view)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Ojongseok
Ojongseok force-pushed the feat/#223-5th-ga4 branch from 286d601 to 18afd1b Compare July 9, 2026 15:10
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Ojongseok
Ojongseok marked this pull request as ready for review July 9, 2026 15:48

@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: 4

🤖 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 @.claude/skills/firebase-analytics-event/analytics-spec.md:
- Around line 5-8: The Firebase analytics spec is inconsistent because the
common rule in analytics-spec.md says all parameter values must be converted to
String, while the event table uses native types like int and boolean for fields
such as photo_count, favorite_booth_count, has_filter, and region_changed.
Update the rules in the spec to use one consistent type policy that matches the
event table and the actual FirebaseAnalyticsLogger behavior, and make sure the
sections around the common rules and event definitions in analytics-spec.md all
reflect that same standard.

In @.claude/skills/firebase-analytics-event/SKILL.md:
- Around line 43-57: Update the Firebase Analytics skill docs to match
`FirebaseAnalyticsLogger` behavior: the current `PhotoUpload` example and event
naming summary incorrectly force all params through `toString()`. Revise the
example and bullets in `SKILL.md` to say parameter values should use the
appropriate native type (`Int`, `Long`, `Double`, `Boolean`, or `String`) so the
logger can map them to the correct `putXxx` call, while keeping the snake_case
naming rules for `ArchiveAnalyticsEvent` and `params` keys.

In
`@feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/album_detail/AlbumDetailViewModel.kt`:
- Around line 317-322: `AlbumDetailViewModel`의 `analyticsLogger.log`에서
`ArchiveAnalyticsEvent.PhotoAddToAlbum`의 `albumCount`가 `listOf(albumId).size`로
계산되고 있는데, `albumId`가 단일 값이라 항상 1입니다. `PhotoAddToAlbum` 생성부에서 불필요한 리스트 생성을 제거하고
`albumCount`를 직접 1로 전달하거나, 향후 다중 앨범을 지원할 계획이 있다면 해당 의도를 드러내는 방식으로 수정하세요.

In
`@feature/map/impl/src/main/java/com/neki/android/feature/map/impl/MapViewModel.kt`:
- Around line 138-149: `ClickShowFavoriteIcon` 처리에서 `analyticsLogger.log()`가
`reduce` 블록 안에 있어 reducer가 순수하지 않으니, `MapViewModel`의 해당 분기에서 로깅을 `reduce` 밖으로
옮기고 상태 변경만 `reduce`에 남기세요. `ClickRefreshButton`, `SelectTab`,
`handleClickBrand`처럼 먼저 새 상태를 계산한 뒤 그 값을 기준으로
`MapAnalyticsEvent.FavoriteBoothFilterOn` 또는 `FavoriteBoothFilterOff`를 외부에서
호출하도록 수정하면 됩니다.
🪄 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: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: c9d2cb7e-6a45-4cae-b6f0-722a1369be56

📥 Commits

Reviewing files that changed from the base of the PR and between b6ee1b2 and 2230af3.

📒 Files selected for processing (7)
  • .claude/skills/firebase-analytics-event/SKILL.md
  • .claude/skills/firebase-analytics-event/analytics-spec.md
  • core/analytics/src/main/kotlin/com/neki/android/core/analytics/event/ArchiveAnalyticsEvent.kt
  • core/analytics/src/main/kotlin/com/neki/android/core/analytics/event/MapAnalyticsEvent.kt
  • feature/archive/impl/src/main/kotlin/com/neki/android/feature/archive/impl/album_detail/AlbumDetailViewModel.kt
  • feature/map/impl/src/main/java/com/neki/android/feature/map/impl/MapViewModel.kt
  • feature/map/impl/src/main/java/com/neki/android/feature/map/impl/photobooth/PhotoBoothOrderChangeViewModel.kt

Comment thread .claude/skills/firebase-analytics-event/analytics-spec.md
Comment thread .claude/skills/firebase-analytics-event/SKILL.md Outdated
Comment thread feature/map/impl/src/main/java/com/neki/android/feature/map/impl/MapViewModel.kt Outdated
Ojongseok and others added 3 commits July 10, 2026 08:38
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
feature/map/impl/src/main/java/com/neki/android/feature/map/impl/MapViewModel.kt (1)

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

불필요한 블록 래핑입니다.

postSideEffect 호출 하나만 감싸는 단일문 블록은 다른 단일 postSideEffect 케이스(RequestLocationPermission 119, ShowToast 170 등)와 일관되지 않습니다. 가독성을 위해 블록을 제거하는 것을 고려하세요.

♻️ 제안: 블록 제거
-            MapIntent.ClickEditBrandOrder -> {
-                postSideEffect(MapEffect.NavigateToPhotoBoothOrderChange)
-            }
+            MapIntent.ClickEditBrandOrder -> postSideEffect(MapEffect.NavigateToPhotoBoothOrderChange)
🤖 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
`@feature/map/impl/src/main/java/com/neki/android/feature/map/impl/MapViewModel.kt`
around lines 126 - 128, MapViewModel의 MapIntent.ClickEditBrandOrder 분기에서 단일
postSideEffect 호출만 감싸는 불필요한 중괄호 블록을 제거해 RequestLocationPermission 및 ShowToast와
동일한 형식으로 정리하세요.
.claude/skills/firebase-analytics-event/SKILL.md (2)

131-138: 🎯 Functional Correctness | 🔵 Trivial | ⚡ Quick win

reduce 내부 로깅 예시를 제거하세요.

reduce는 상태 계산만 담당하도록 유지하고, Analytics side effect는 intent 처리부 또는 상태 변경 직후에 호출하는 패턴으로 문서화해야 합니다. 현재 예시는 reduce 재실행 시 이벤트 중복 전송을 유도할 수 있으며, 이번 PR의 FavoriteBoothFilter 로깅을 reduce 밖으로 이동한 방향과도 맞지 않습니다.

🤖 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 @.claude/skills/firebase-analytics-event/SKILL.md around lines 131 - 138,
Remove the “reduce 람다 내부 로깅” example from the documentation. Update the guidance
so reduce blocks only calculate and return state, while Analytics side effects
are invoked in the intent handler or immediately after the state change,
consistent with the FavoriteBoothFilter pattern.

175-177: 🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win

즐겨찾기 이벤트 트리거 정의를 스펙과 맞추세요.

favorite_booth_viewanalytics-spec.md의 62행·78행처럼 저장한 포토부스 탭 선택 이벤트입니다. 마커 ON/OFF는 각각 favorite_booth_filter_on/favorite_booth_filter_off로 분리되어야 하므로, 현재 설명대로 구현하면 서로 다른 이벤트가 잘못 기록될 수 있습니다.

🤖 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 @.claude/skills/firebase-analytics-event/SKILL.md around lines 175 - 177,
Update the favorite event trigger definitions to match analytics-spec.md: define
favorite_booth_view for selecting the saved photobooth tab, replace its marker
ON/OFF behavior with separate favorite_booth_filter_on and
favorite_booth_filter_off events, and ensure booth_favorite_add/remove remain
logged only after successful API callbacks.
.claude/skills/firebase-analytics-event/analytics-spec.md (1)

10-16: 🔒 Security & Privacy | 🟡 Minor | ⚡ Quick win

user_id는 자동 수집 표에서 분리하세요.
user_idsetUserId(...)로 앱이 직접 설정하는 값이고, platform/app_versionsetUserProperty(...)로 넣고 있어 이 섹션의 “Firebase 자동 수집” 표현이 부정확합니다. user_id는 별도 항목으로 옮기고, 동의/개인정보 처리 근거를 함께 적어두세요.

🤖 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 @.claude/skills/firebase-analytics-event/analytics-spec.md around lines 10 -
16, `공통 파라미터 (Firebase 자동 수집)` 섹션에서 `user_id`를 제거하고, `setUserId(...)`로 앱이 직접
설정하는 사용자 식별자 항목으로 별도 분리하세요. `platform`과 `app_version`도 `setUserProperty(...)`로
설정되는 값임을 반영해 섹션 명칭을 수정하고, `user_id` 항목에 동의 및 개인정보 처리 근거를 명시하세요.
🤖 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 `@app/src/main/java/com/neki/android/app/MainActivity.kt`:
- Around line 88-94: MainActivity.onCreate의 NotificationClick 로깅이 구성 변경 시 중복
실행되지 않도록 savedInstanceState == null 조건으로 감싸 초기 생성 시에만 EXTRA_FROM_NOTIFICATION을
확인하고 analyticsLogger.log(GlobalAnalyticsEvent.NotificationClick)을 호출하세요.

---

Outside diff comments:
In @.claude/skills/firebase-analytics-event/analytics-spec.md:
- Around line 10-16: `공통 파라미터 (Firebase 자동 수집)` 섹션에서 `user_id`를 제거하고,
`setUserId(...)`로 앱이 직접 설정하는 사용자 식별자 항목으로 별도 분리하세요. `platform`과 `app_version`도
`setUserProperty(...)`로 설정되는 값임을 반영해 섹션 명칭을 수정하고, `user_id` 항목에 동의 및 개인정보 처리 근거를
명시하세요.

In @.claude/skills/firebase-analytics-event/SKILL.md:
- Around line 131-138: Remove the “reduce 람다 내부 로깅” example from the
documentation. Update the guidance so reduce blocks only calculate and return
state, while Analytics side effects are invoked in the intent handler or
immediately after the state change, consistent with the FavoriteBoothFilter
pattern.
- Around line 175-177: Update the favorite event trigger definitions to match
analytics-spec.md: define favorite_booth_view for selecting the saved photobooth
tab, replace its marker ON/OFF behavior with separate favorite_booth_filter_on
and favorite_booth_filter_off events, and ensure booth_favorite_add/remove
remain logged only after successful API callbacks.

In
`@feature/map/impl/src/main/java/com/neki/android/feature/map/impl/MapViewModel.kt`:
- Around line 126-128: MapViewModel의 MapIntent.ClickEditBrandOrder 분기에서 단일
postSideEffect 호출만 감싸는 불필요한 중괄호 블록을 제거해 RequestLocationPermission 및 ShowToast와
동일한 형식으로 정리하세요.
🪄 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: Organization UI

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: f46b559d-2bc3-4ed4-8c88-a64c3e024188

📥 Commits

Reviewing files that changed from the base of the PR and between 2230af3 and 32556dd.

📒 Files selected for processing (7)
  • .claude/skills/firebase-analytics-event/SKILL.md
  • .claude/skills/firebase-analytics-event/analytics-spec.md
  • app/src/main/AndroidManifest.xml
  • app/src/main/java/com/neki/android/app/MainActivity.kt
  • app/src/main/java/com/neki/android/app/NekiFirebaseMessagingService.kt
  • core/analytics/src/main/kotlin/com/neki/android/core/analytics/event/GlobalAnalyticsEvent.kt
  • feature/map/impl/src/main/java/com/neki/android/feature/map/impl/MapViewModel.kt

Comment thread app/src/main/java/com/neki/android/app/MainActivity.kt

@ikseong00 ikseong00 left a comment

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.

확인했습니다!
토끼 리뷰랑, 스킬 최신화 정도만 되면 될 것 같아요!

Ojongseok and others added 2 commits July 12, 2026 18:37
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…brand_order_save)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@Ojongseok

Ojongseok commented Jul 12, 2026

Copy link
Copy Markdown
Member Author

@ikseong00 토끼리뷰 반영했고, 머지하겠습니다~ 027b05a

@Ojongseok
Ojongseok merged commit f8393f8 into develop Jul 12, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[feat] 5차 스프린트 - 지도 관련 GA4 이벤트 추가

2 participants