[Fix] 신버전이 남긴 mission_log 가 구버전 기기의 적립을 막지 않게 한다 - #320
Merged
Merged
Conversation
- 같은 계정을 신버전과 구버전 기기에서 번갈아 쓰면, 신버전 요청이 남긴 mission_log 행이 구버전 요청의 "이미 적립했다" 판정에 걸려 그 활동이 적립으로도 진행도로도 남지 않았다 - mission_log 행은 그대로 남긴다. DAU, 순 방문자, 일자별 방문 수, 활성 사용자 목록, 복습 로그 조회, 사용자별 기록, 훈장 '개근'이 전부 이 테이블만 본다. 행을 안 남기면 그 지표들이 통째로 0 이 된다 - 대신 MissionLog.point 가 "이 기록으로 자동 적립이 돌았는가"를 담는다. 적립이 돌면 정가, 돌지 않으면 0 이다. 상한에 걸려 깎이기 전 정가를 넣는 이유는 실지급액을 넣으면 상한 계산이 달라져 구버전만 쓰는 사용자의 동작이 바뀌기 때문이다 - 중복 방지 판정에 accruedOnly 를 뒀다. 자동 적립이 도는 요청은 적립된 행만 보고, 진행도를 올리는 요청은 지금처럼 모든 행을 본다. 뒤쪽을 함께 풀면 신버전만 쓰는 사용자가 앱을 열 때마다 출석 진행도가 다시 오른다 - 하루 200점 상한(getPointSumToday)은 point 합을 그대로 보므로, 지급되지도 않은 신버전 활동이 상한을 갉던 것도 함께 사라진다 - 관리자 복습 로그 화면의 점수는 저장값이 아니라 미션 타입의 정가를 쓴다. 화면의 뜻이 "이 행동의 값어치"라 적립 여부와 무관하고, 보이는 값은 지금과 같다 - 출석, 오답노트 등록, 복습 기록, 세트 완료 네 가지의 재현과 신버전 단독, 구버전 단독 사용자의 동작을 MissionCrossVersionAccrualTest 로 고정했다 Closes #318
8 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.
✔️ 연관 이슈
📝 작업 내용
MissionLogRepositoryCustom의accruedOnly).mission_log.point가 담습니다. 적립이 돌면 정가, 돌지 않으면 0 입니다. 컬럼이 이미 있어서 마이그레이션이 없습니다.getPointSumToday가point합을 그대로 보므로, 지급되지도 않은 신버전 활동이 상한을 갉던 문제가 따로 손대지 않아도 사라집니다.AdminPracticeLogResponseDto에서만 바꿨습니다.🤔 주요 고민 및 해결 과정
1. 행을 안 남길 것인가, 남기되 판정에서 뺄 것인가
mission_log를 읽는 자리를 전수로 확인했습니다. 중복 방지와 하루 상한 말고도 관리자 조회가 여섯 곳, 훈장이 한 곳입니다.USER_LOGIN행MissionLogService:230-256NOTE_PRACTICE행MissionLogService:259-292AdminUserController:91USER_LOGIN의 날짜들AchievementStatsCollector:71-78point합MissionLogRepositoryImpl:87-97MissionLogRetentionTest가 이미 같은 이유로 "적립을 꺼도 행은 남는다"를 잠가 두고 있습니다.point가 원래 지급 여부와 무관하게 정가를 담고 있어서 쓰이지 않는 자리였는데, 여기에 "적립이 돌았는가"를 담으면 컬럼을 새로 만들지 않아도 됩니다.ddl-auto가validate라 컬럼 추가는 Flyway 파일이 필요합니다.2. 판정을 양쪽 다 풀면 안 됩니다
MissionLogService:111)과 세트 완료(:189)는 "오늘 첫 로그인", "이 세트 첫 완료" 판정을 그대로 빌려 씁니다.3. 두 기기를 번갈아 쓰면 같은 대상에 적립과 진행도가 따로 잡힙니다
LegacyAccrualPolicy가 "덜 주는 쪽이 더 위험하다"로 판정을 세워 둔 것과 같은 기준입니다.👤 사용자 영향
mission_log행이 한 건 더 생깁니다. 신버전 행과 구버전 행이 따로 남아서, 그날 그 사용자의 "일자별 방문 수"와 "복습 로그 건수"가 2 로 잡힙니다. DAU 와 순 방문자는 사용자 단위COUNT(DISTINCT)라 영향이 없습니다.🔌 API 호환성
🗄️ DB migration
🔐 인증/권한
✅ 검증 결과
MissionCrossVersionAccrualTest를 고치기 전 코드로 돌리면 11개 중 5개가 실패합니다. 네 가지 metric(출석 15→0, 오답노트 등록 10→0, 복습 기록 5→0, 세트 완료 15→0)과 하루 상한 재현입니다.test --tests 'com.aisip.OnO.backend.mission.*' --tests 'com.aisip.OnO.backend.concurrency.Mission*' --tests 'com.aisip.OnO.backend.common.web.*' --tests 'com.aisip.OnO.backend.achievement.*' --tests 'com.aisip.OnO.backend.admin.*': 575개 통과, 실패 0test: 3486개 통과, 실패 0, 건너뜀 0🚀 배포 리스크
0d8b7ee와MissionProgressUpdater가 develop 에만 있고 main 에는 없어서, 지금 손실이 나고 있는 곳은 dev 서버뿐입니다. main 으로 나갈 때 [Fix] 자동 적립이 도는 요청에서는 미션 진행도를 올리지 않는다 #280 과 이 PR 이 함께 나가야 합니다.ono.mission.legacy-accrual.enabled를 끄면 모든 요청의point가 0 으로 들어갑니다. 적립이 전부 꺼지는 상태라 상한 계산이 의미가 없어지는 것이라 문제는 없지만, 그 기간 행의point가 0 이라는 것은 알아 두셔야 합니다.↩️ 롤백/대응 방법
point가 0 인 행이 남는데, 이 행은 롤백된 코드에서도 중복 방지 판정에 그대로 걸리고 하루 상한만 덜 갉습니다. 데이터를 되돌릴 필요가 없습니다.막힌 요청은 행을 남기지 않아서 손실 건수 자체는 셀 수 없습니다. 대신 두 버전을 섞어 쓴 사용자의 상한을 잽니다. dev DB 기준입니다.