Repository navigation
#511 [Merge] dev 변경사항을 main에 반영 (v2.0.40) - #512
Merged
Merged
Conversation
## #️⃣ 연관된 이슈 <!-- Ex) - #이슈번호 --> <!-- 연관된 이슈 번호를 링크 형태로 작성하세요 --> - #250 ## 📝 작업 내용 <!-- 이번 PR/이슈에서 실제 수행한 작업 내용을 작성하세요 --> ### ♻️ Refactor <!-- 기존 코드 리팩토링 내용 작성 --> | 내용 | 파일 | |------|------| | 불필요한 import 제거 | `UserService.java` | | 투표 비율 계산 기준을 preVoteOption → postVoteOption으로 수정 | `BattleVoteServiceImpl.java` | | totalCount도 사후 투표 완료된 건만 카운트하도록 수정 | `BattleVoteServiceImpl.java` | | countByBattleAndPostVoteOption, countByBattleAndPostVoteOptionIsNotNull 메서드 추가 | `BattleVoteServiceImpl.java` | ## 📌 공유 사항 <!-- 팀원에게 공유할 내용이나 참고 사항 작성 --> <!-- 노션 환경 설정 파일 확인 부탁드립니다! --> > ▎ 1. 기존 코드에서 투표 비율(%)이 preVoteOption 기준으로 계산되어 사전 투표만 한 유저도 카운트에 포함되고 있었습니다. ▎ 2. 사후 투표(postVoteOption)가 완료된 건만 기준으로 비율을 계산하도록 수정했습니다. ## ✅ 체크리스트 <!-- PR 제출 전에 체크해야 할 사항들 --> - [x] Reviewer에 팀원들을 선택했나요? - [x] Assignees에 본인을 선택했나요? - [x] 컨벤션에 맞는 Type을 선택했나요? - [x] Development에 이슈를 연동했나요? - [x] Merge 하려는 브랜치가 올바르게 설정되어 있나요? - [x] 컨벤션을 지키고 있나요? - [x] 로컬에서 실행했을 때 에러가 발생하지 않나요? - [x] 팀원들에게 PR 링크 공유를 했나요? ## 📸 스크린샷 <!-- Swagger, Postman, JUnit 테스트 화면 첨부 --> <!-- 기능 동작 화면이나 테스트 결과 캡처를 첨부하면 좋습니다 --> ## 💬 리뷰 요구사항 <!-- 리뷰어에게 요청하는 구체적인 사항 작성 --> <!-- 종료 의도 판단을 Java 키워드 → AI 2차 검증 구조로 설계했는데 해당 구조가 유지보수 및 확장 측면에서 적절한지 의견 부탁드립니다. --> > 1. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
## #️ 연관된 이슈 - #254 ## 📝 작업 내용 ### ♻️ Refactor | 내용 | 파일 | |------|------| | 관점 등록/수정 시 GPT 검수 주석 코드 제거 | `PerspectiveService.java` | ## 📌 공유 사항 > 1. 기존에 `createPerspective()`, `updatePerspective()`에서 GPT 검수 호출이 주석 처리된 채 남아있던 dead code를 제거했습니다. 동작 방식은 동일하게 등록/수정 즉시 `PUBLISHED` 상태로 저장됩니다. ## ✅ 체크리스트 - [x] Reviewer에 팀원들을 선택했나요? - [x] Assignees에 본인을 선택했나요? - [x] 컨벤션에 맞는 Type을 선택했나요? - [x] Development에 이슈를 연동했나요? - [x] Merge 하려는 브랜치가 올바르게 설정되어 있나요? - [x] 컨벤션을 지키고 있나요? - [x] 로컬에서 실행했을 때 에러가 발생하지 않나요? - [x] 팀원들에게 PR 링크 공유를 했나요? ## 📸 스크린샷 해당 없음 (코드 정리 작업) ## 💬 리뷰 요구사항 > 1. 없습니다. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
## #️ 연관된 이슈 - #255 ## 📝 작업 내용 ### ♻️ Refactor | 내용 | 파일 | |------|------| | VoteStatsResponse OptionStat에 title 필드 추가 | `VoteStatsResponse.java`, `BattleVoteServiceImpl.java` | ## 📌 공유 사항 > 1. `GET /api/v1/battles/{battleId}/vote-stats` 응답의 `OptionStat`에 `title` 필드가 추가되었습니다. 옵션 이름(ex. "변기는 변기다")을 투표 % 바 및 관점 탭 구성에 활용해 주세요. > 2. 관점 목록 조회 시 옵션 탭 필터는 `optionId` 파라미터로 전달하면 됩니다. (`GET /api/v1/battles/{battleId}/perspectives?optionId={optionId}`) ## ✅ 체크리스트 - [x] Reviewer에 팀원들을 선택했나요? - [x] Assignees에 본인을 선택했나요? - [x] 컨벤션에 맞는 Type을 선택했나요? - [x] Development에 이슈를 연동했나요? - [x] Merge 하려는 브랜치가 올바르게 설정되어 있나요? - [x] 컨벤션을 지키고 있나요? - [x] 로컬에서 실행했을 때 에러가 발생하지 않나요? - [x] 팀원들에게 PR 링크 공유를 했나요? ## 📸 스크린샷 해당 없음 (응답 필드 추가) ## 💬 리뷰 요구사항 > 1. 없습니다. Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
## #️⃣연관된 이슈 - #262 ## 📝 작업 내용 ### ✨ Feat | 내용 | 파일 | |------|------| | 디바이스 푸시 토큰 등록/해제 API 추가 (Android: FCM 토큰, iOS: APNs 디바이스 토큰) | `DeviceController.java`, `DeviceService.java`, `RegisterDeviceRequest.java`, `UserDevice.java`, `DevicePlatform.java`, `UserDeviceRepository.java` | | FCM(Android) 푸시 발송 인프라 구축 (Firebase Admin SDK) | `FirebaseConfig.java`, `FcmPushService.java`, `build.gradle` | | iOS 푸시를 FCM 경유 방식에서 다이렉트 APNs 발송으로 전환 (Pushy) | `ApnsConfig.java`, `ApnsPushService.java`, `FcmPushService.java`, `NotificationDispatchService.java`, `build.gradle` | | 새 배틀 발행 시 인앱 알림 + 푸시 발송 | `BattleServiceImpl.java`, `NotificationDispatchService.java` | | 답글 좋아요 / 새 댓글 발생 시 인앱 알림 + 푸시 발송 | `CommentLikeService.java`, `PerspectiveCommentService.java`, `NotificationDispatchService.java` | | 포인트 적립 시 인앱 알림 발송 | `CreditService.java` | | 알림 API 명세 문서 작성 | `docs/api-specs/notification-api.md` | ### ♻️ Refactor | 내용 | 파일 | |------|------| | 답글 좋아요/새 댓글 알림 문구에 배틀 제목 포함하도록 개선 | `NotificationDispatchService.java`, `CommentLikeService.java`, `PerspectiveCommentService.java` | ### 🐛 Fix | 내용 | 파일 | |------|------| | 컨테이너 배포 환경(Railway)에서 FCM/APNs 자격증명 파일(JSON/.p8)을 읽지 못해 서버 기동 자체가 실패하던 문제 수정 — S3에서 자격증명을 다운로드해 사용하도록 변경 (로컬은 기존 파일 경로 방식 그대로 폴백) | `FirebaseConfig.java`, `ApnsConfig.java`, `application.yml` | ## 📌 공유 사항 > 1. **(중요) Railway dev Variables 추가 완료** — 이 PR이 배포되려면 아래 값이 필요하며, dev 환경엔 이미 세팅해뒀습니다. > - `FCM_CREDENTIALS_S3_KEY`, `APNS_CREDENTIALS_S3_KEY` (S3 `pique-bucket/credentials/`에 Firebase 서비스 계정 JSON, APNs `.p8` 키 업로드 완료) > - `APNS_ENABLED=true`, `APNS_KEY_ID`, `APNS_BUNDLE_ID`, `APNS_PRODUCTION` > - `APNS_TEAM_ID`는 따로 안 넣어도 기존 `APPLE_TEAM_ID`로 폴백됩니다. > 2. **운영(main) 배포 시에도 동일하게 Railway 변수 추가 + S3 파일 업로드가 필요**합니다. > 3. iOS는 더 이상 FCM을 거치지 않고 서버가 APNs로 직접 발송합니다. 디바이스 등록 시 `fcmToken` 필드에 iOS는 APNs 디바이스 토큰(hex 문자열)을 보내야 합니다. 자세한 내용은 `docs/api-specs/notification-api.md` 참고. > 4. 새 의존성 추가: `firebase-admin:9.9.0`, `com.eatthepath:pushy:0.15.4` ## ✅ 체크리스트 - [x] Reviewer에 팀원들을 선택했나요? - [x] Assignees에 본인을 선택했나요? - [x] 컨벤션에 맞는 Type을 선택했나요? - [x] Development에 이슈를 연동했나요? - [x] Merge 하려는 브랜치가 올바르게 설정되어 있나요? - [x] 컨벤션을 지키고 있나요? - [x] 로컬에서 실행했을 때 에러가 발생하지 않나요? - [x] 팀원들에게 PR 링크 공유를 했나요? ## 📸 스크린샷 <!-- Swagger/Postman으로 디바이스 등록, 알림함 조회, 푸시 수신 테스트 캡처 첨부 --> ## 💬 리뷰 요구사항 > 1. APNs 환경(sandbox/production)이 `APNS_PRODUCTION` 전역 설정 1개로 고정되는 구조인데, 개발(TestFlight)/운영(App Store) 빌드를 동시에 지원하려면 별도 설계가 필요해 보입니다 — 의견 부탁드립니다. > 2. FCM/APNs 자격증명을 S3에서 받아오는 방식(이번 Fix)이 적절한지, 다른 방식을 선호하시면 의견 부탁드립니다. --------- Co-authored-by: 현준혁 <guswnsgur2276@metabuild.co.kr> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
createTempFile로 생성된 빈 파일이 이미 존재해 S3 getObject의 toFile 다운로드가 FileAlreadyExistsException으로 실패하던 문제 수정
## #️ 연관된 이슈 - #262 ## 📝 작업 내용 ### ✨ Feat | 내용 | 파일 | |------|------| | 새 배틀/답글 좋아요/새 댓글/관리자 공지·이벤트 알림 발송 시 UserSettings의 ON/OFF 설정을 확인해 OFF인 사용자에게는 푸시를 보내지 않도록 분기 (인앱 알림은 항상 생성) | `NotificationDispatchService.java`, `UserSettingsRepository.java`, `UserDeviceRepository.java`, `AdminNotificationService.java` | | 오늘의 픽으로 자동 배정된 배틀에도 새 배틀 알림(인앱+푸시) 발송 추가 | `BattleServiceImpl.java` | ### 🐛 Fix | 내용 | 파일 | |------|------| | 관점/댓글 삭제 시 좋아요·신고 잔여 데이터가 남아 FK 제약 조건 위반 오류가 발생하던 문제 수정 | `PerspectiveService.java`, `PerspectiveCommentService.java`, `CommentLikeRepository.java`, `CommentReportRepository.java`, `PerspectiveCommentRepository.java`, `PerspectiveLikeRepository.java`, `PerspectiveReportRepository.java` | ## 📌 공유 사항 > 1. 알림 ON/OFF 설정 매핑은 다음과 같습니다. > - `newBattleEnabled` → 새 배틀 알림 > - `contentLikeEnabled` → 좋아요 알림 > - `newCommentEnabled` → 새 댓글 알림 > - `marketingEventEnabled` → 이벤트 및 소식 알림 (공지/이벤트) > - `commentReplyEnabled`, `battleResultEnabled` → 현재 매핑되는 알림 이벤트가 없어 보류 (정책 미정) > 2. OFF 상태여도 인앱 Notification은 항상 생성되고, 푸시 발송만 차단됩니다. UserSettings가 없는 레거시 유저는 기본값 ON으로 처리됩니다. ## ✅ 체크리스트 - [x] Reviewer에 팀원들을 선택했나요? - [x] Assignees에 본인을 선택했나요? - [x] 컨벤션에 맞는 Type을 선택했나요? - [x] Development에 이슈를 연동했나요? - [x] Merge 하려는 브랜치가 올바르게 설정되어 있나요? - [x] 컨벤션을 지키고 있나요? - [x] 로컬에서 실행했을 때 에러가 발생하지 않나요? - [x] 팀원들에게 PR 링크 공유를 했나요? ## 📸 스크린샷 ## 💬 리뷰 요구사항 > 1. 관리자 공지/이벤트 알림(POLICY_CHANGE/PROMOTION)을 `marketingEventEnabled` 하나로 묶어서 게이팅했는데, 이 매핑이 적절한지 의견 부탁드립니다. --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
## #️⃣ 연관된 이슈 <!-- Ex) - #이슈번호 --> <!-- 연관된 이슈 번호를 링크 형태로 작성하세요 --> - closed #268 ## 📝 작업 내용 <!-- 이번 PR/이슈에서 실제 수행한 작업 내용을 작성하세요 --> ### 🔨 Chore <!-- 새로운 기능 구현 내용 작성 --> | 내용 | 파일 | |------|------| | 크롤링 파일 추가 | `app-ads.txt` | | | | ## 📌 공유 사항 <!-- 팀원에게 공유할 내용이나 참고 사항 작성 --> <!-- 노션 환경 설정 파일 확인 부탁드립니다! --> > 없음 ## ✅ 체크리스트 <!-- PR 제출 전에 체크해야 할 사항들 --> - [x] Reviewer에 팀원들을 선택했나요? - [x] Assignees에 본인을 선택했나요? - [x] 컨벤션에 맞는 Type을 선택했나요? - [x] Development에 이슈를 연동했나요? - [x] Merge 하려는 브랜치가 올바르게 설정되어 있나요? - [x] 컨벤션을 지키고 있나요? - [x] 로컬에서 실행했을 때 에러가 발생하지 않나요? - [ ] 팀원들에게 PR 링크 공유를 했나요? ## 📸 스크린샷 <!-- Swagger, Postman, JUnit 테스트 화면 첨부 --> <!-- 기능 동작 화면이나 테스트 결과 캡처를 첨부하면 좋습니다 --> > 없음 ## 💬 리뷰 요구사항 <!-- 리뷰어에게 요청하는 구체적인 사항 작성 --> <!-- 종료 의도 판단을 Java 키워드 → AI 2차 검증 구조로 설계했는데 해당 구조가 유지보수 및 확장 측면에서 적절한지 의견 부탁드립니다. --> > 없음
## #️⃣ 연관된 이슈 <!-- Ex) - #이슈번호 --> <!-- 연관된 이슈 번호를 링크 형태로 작성하세요 --> - #268 ## 📝 작업 내용 <!-- 이번 PR/이슈에서 실제 수행한 작업 내용을 작성하세요 --> ### ✨ Feat <!-- 새로운 기능 구현 내용 작성 --> | 내용 | 파일 | |------|------| | 허용 설정 추가 | `SecurityConfig.java` | | | | ## 📌 공유 사항 <!-- 팀원에게 공유할 내용이나 참고 사항 작성 --> <!-- 노션 환경 설정 파일 확인 부탁드립니다! --> > 없음 ## ✅ 체크리스트 <!-- PR 제출 전에 체크해야 할 사항들 --> - [x] Reviewer에 팀원들을 선택했나요? - [x] Assignees에 본인을 선택했나요? - [x] 컨벤션에 맞는 Type을 선택했나요? - [x] Development에 이슈를 연동했나요? - [x] Merge 하려는 브랜치가 올바르게 설정되어 있나요? - [x] 컨벤션을 지키고 있나요? - [x] 로컬에서 실행했을 때 에러가 발생하지 않나요? - [ ] 팀원들에게 PR 링크 공유를 했나요? ## 📸 스크린샷 <!-- Swagger, Postman, JUnit 테스트 화면 첨부 --> <!-- 기능 동작 화면이나 테스트 결과 캡처를 첨부하면 좋습니다 --> > 없음 ## 💬 리뷰 요구사항 <!-- 리뷰어에게 요청하는 구체적인 사항 작성 --> <!-- 종료 의도 판단을 Java 키워드 → AI 2차 검증 구조로 설계했는데 해당 구조가 유지보수 및 확장 측면에서 적절한지 의견 부탁드립니다. --> > 없음
사용자 광고 API가 지면·OS·개수를 서비스에 전달하고 응답을 그대로 반환하는 계약을 검증합니다. 조회 시 노출 집계를 변경하지 않는 것도 확인합니다. 검증: AdControllerTest 및 AdQueryServiceTest 10개 통과.
사용자 광고 API와 공개 광고 랜딩에서 애드픽 동기화 설치·가입형 캠페인을 제외합니다. 쇼핑·핫딜 상품과 쿠팡 및 수동 등록 광고는 기존 조건으로 제공하고, 쇼핑 재고가 부족해도 설치형 캠페인으로 채우지 않습니다. 기존 소재와 성과 기록은 보존합니다. 검증: 광고 조회·동기화 테스트 통과. 설치/가입형 제외, 재고 부족 시 빈 목록, 공개 랜딩 제외 회귀 테스트를 추가했습니다.
관리자에서 날짜를 조회하면 AdFit 콘솔의 계정 종합 일별 수익을 자동 요청합니다. 기존 수동 데이터와 별도 account 필드로 제공하고, 미설정·인증 만료·조회 실패를 구분합니다. 비용을 제공하지 않는 계정 보고서의 ROI는 null입니다. - 검증: AdFit 테스트 및 Spring 빈 생성 통과. 실제 endpoint의 미인증 HTTP 419 확인. - 운영 활성화: ADFIT_SESSION_COOKIE 비밀 환경변수 필요. 인증 후 수익 조회는 아직 미검증. - 콘솔 내부 API라 세션 만료 시 환경변수 갱신이 필요합니다. 비밀 값은 코드나 응답에 노출하지 않습니다.
Mixpanel 사용자·가입·이벤트 상세와 Sentry 일별 오류 통계를 dev 브랜치에도 반영한다. Constraint: dev와 main의 analytics API 계약 일치 Confidence: high Scope-risk: moderate Directive: AdminWeb develop 배포 전에 development Server 배포 확인 Tested: GitHub Actions build; analytics Gradle tests; git diff --check Not-tested: 개발 AdminWeb 인증 세션의 실제 수치 대조
Picke-iOS가 실제로 보내는 Sentry 오류, 로그, 성능 span, 프로파일, 커스텀 메트릭, 세션 안정성, 릴리즈 데이터를 관리자 API에서 프로젝트별로 조회합니다. 최근 오류 이벤트 10건은 `full=true` 원본을 보존하며, Mixpanel `sign_up` 일별 시리즈도 추가합니다. 검증: - `./gradlew test --tests 'com.swyp.picke.domain.admin.analytics.MixpanelClientTest' --tests 'com.swyp.picke.domain.admin.analytics.SentryClientTest'` - `git diff --check` 운영 확인 항목: - Sentry Explore/세션 API는 `org:read`, 오류 이벤트는 `event:read`, 릴리즈는 `project:read` 계열 권한이 필요합니다.
## #️⃣ 연관된 이슈 - #493 후속 수정 ## 📝 작업 내용 ### 🐛 Fix | 내용 | 검증 | |------|------| | Sentry `tracemetrics` 시계열 집계식을 `count(metric)`으로 수정 | Picke iOS/Android 실제 API HTTP 200 | | 데이터셋별 집계식 회귀 테스트 추가 | `SentryClientTest` 통과 | ## 📌 공유 사항 > Sentry Explore API는 일반 데이터셋의 `count()`는 허용하지만 `tracemetrics`에서는 인자 1개를 요구해 HTTP 400을 반환합니다. 실제 운영 토큰으로 `count(metric)` 응답이 두 프로젝트 모두 200임을 확인했습니다. ## ✅ 체크리스트 - [x] 개발 브랜치 기준으로 수정했습니다. - [x] 대상 테스트와 `git diff --check`를 통과했습니다. - [x] 비밀값을 출력하지 않고 실제 Sentry 응답 상태를 확인했습니다. ## 💬 리뷰 요구사항 > 데이터셋별 `yAxis` 분기가 Sentry API 계약에 맞는지 확인 부탁드립니다.
## 변경 사항 - Sentry `user.action.count`에서 `event=sign_up`을 별도 데이터셋으로 제공합니다. - Trace Metrics 카운터를 `sum(value)`로 집계해 실제 metric 값을 반환합니다. - 회원가입 데이터가 없는 기간에도 연결 성공 상태와 0 일별 시계열을 유지합니다. ## 검증 - `./gradlew test --tests com.swyp.picke.domain.admin.analytics.SentryClientTest` - 실제 Sentry timeseries 요청 HTTP 200 - `git diff --check`
## 변경 사항 - analytics_event 태그를 이벤트명별로 동적 집계 - 발생 수, 고유 사용자, 최초/마지막 발생, 일별 발생/사용자 추이 제공 - Sentry topEvents 10개 제한에 맞춰 이벤트 목록을 배치 조회 - 오류 조회와 이벤트 집계 상태를 분리 ## 검증 - SentryClientTest 캐시 없이 통과 - diff whitespace 검사 통과
## 변경 사항 - 운영 Sentry에서 허용되는 `analytics_event` 필드로 이벤트 목록을 조회합니다. - 그룹 조회가 깨진 `events-timeseries` 대신 `events-stats`를 사용해 최대 10개씩 모든 이벤트의 일별 발생 수와 사용자 수를 조회합니다. - 기존 Sentry `sign_up` metric도 이벤트 목록의 `sign_up`으로 합쳐 표시합니다. 동일한 태그 이벤트가 있으면 태그 데이터를 우선합니다. ## 검증 - `./gradlew test --tests com.swyp.picke.domain.admin.analytics.SentryClientTest --rerun-tasks` 성공 - 운영 Sentry 요청 200 확인: `onboarding_step`, `screen_view`, `ui_action` 및 오늘 partial bucket - 전체 테스트 346건 중 변경 관련 테스트 통과. 로컬 ffmpeg 실행 파일 부재로 기존 오디오 파이프라인 테스트 2건 실패
## 변경 사항 - Sentry `sign_up` metric의 발생 수는 이벤트로 표시합니다. - metric에서 제공하지 않는 고유 사용자 수는 0으로 바꾸지 않고 `null`로 유지해 AdminWeb에서 `—`로 표시합니다. ## 검증 - `SentryClientTest` 성공 - 일별 고유 사용자 값이 모두 null인지 회귀 테스트 추가
## 변경 사항 - Sentry 이벤트 배치 검색을 OR 식에서 배열 식으로 변경합니다. - 운영에서 확인된 `onboarding_step`, `screen_view`, `ui_action`이 모두 반환됩니다. - 이벤트가 늘어나도 10개씩 나눠 전체 목록의 일별 통계를 조회합니다. ## 검증 - 운영 Sentry 배열 검색 200 및 전체 3개 이벤트 반환 - `SentryClientTest` 성공
## 배경 PM이 MVP 이탈 지점(배틀 선택 → 재생 → 사후 투표 → 댓글 참여)을 보려면 단계별 전환이 필요한데 서버에 퍼널 계산이 없었다. Mixpanel 집계 API의 퍼널 리포트는 현재 플랜이 막고 있어(`HTTP 402`) 원본 이벤트로 직접 계산한다. ## 변경 `GET /api/v1/admin/analytics/mixpanel/funnel?from&to&steps=A,B,C&windowDays=7` (ADMIN 전용) - 고유 사용자 기준. 한 사람이 같은 단계를 여러 번 밟아도 한 번으로 센다. - 다음 단계는 앞 단계 **이후**여야 하고, 첫 단계로부터 `windowDays` 안에 끝나야 한다. Mixpanel 화면의 Unique Conversion·전환 윈도우와 같은 규칙이다. - 단계는 `event:property=value`로 속성까지 좁힐 수 있다. 배틀 흐름은 선택·재생·투표가 모두 `battle_step` 한 이벤트로 들어오고 `step_name`으로만 갈려서, 속성을 못 좁히면 이 구간이 한 단계로 뭉쳐 이탈율을 볼 수 없다. - 단계 2~8개, `windowDays` 1~30, 기간 31일까지(원본을 받으므로). - 분모가 0이면 전환율을 0%가 아니라 `null`로 둔다. 아무도 진입하지 않은 것과 전환 실패를 구분한다. ## 검증 - `./gradlew test --tests "com.swyp.picke.domain.admin.analytics.*"` BUILD SUCCESSFUL - **콘솔 대조**: 2026-08-01~08-31 `battle_step → screen_view → community_action` 7일 윈도우로 실제 API 호출 결과 **24 / 24 / 2 (8.33%)** — Mixpanel 콘솔 퍼널 화면 숫자와 일치한다. - 실측 MVP 퍼널(같은 기간, `step_name` 분리): 24 → 14 → 11 → 1. 사후 투표에서 댓글 참여로 넘어갈 때 90.9%가 이탈한다. ## 배포 메모 - 새 환경변수 없음. 기존 `MIXPANEL_API_SECRET`을 그대로 쓴다.
4 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
#️⃣ 연관된 이슈
📝 작업 내용
🐛 Fix
📌 공유 사항
✅ 체크리스트
📸 스크린샷
./gradlew test --tests '*ScenarioAudioPipelineServiceTest' --tests '*ScenarioServiceImplTest' --tests '*AdminScenarioPublishFlowIntegrationTest' --tests '*BattleServiceImplTest'→ BUILD SUCCESSFUL💬 리뷰 요구사항