85 lines
5.1 KiB
Markdown
85 lines
5.1 KiB
Markdown
# 온보딩 영상 모달 이슈 원인 분석 (수정 전)
|
|
|
|
작성일: 2026-04-17
|
|
대상 화면: 온보딩 퍼즐 > 영상 모달
|
|
범위: 원인 분석만, 코드 수정 없음
|
|
|
|
## 1) 사용자 제보 현상 (최종 반영)
|
|
- 영상을 거의 끝까지 봤는데(약 1초 남음) 학습목차 상태가 계속 학습중으로 보임.
|
|
- 진도율(예: 0/2강, 0%)이 실시간으로 즉시 반영되지 않음.
|
|
- 모달을 닫고 페이지 새로고침 없이 다시 열면 1차시가 처음부터 재생됨.
|
|
- 페이지 새로고침 후에는 방금 본 1차시가 학습완료로 바뀌지만, 2차시로 자동 진입하지는 않음.
|
|
|
|
## 1-1) 추가 확인된 운영 규칙
|
|
- 서버 기준으로 총 시청 시간의 90%를 넘기면 시청 완료 일시(completed_at)가 DB에 기록됨.
|
|
- 따라서 클라이언트 완료 판정은 90% 기준과 충돌하지 않도록 정렬되어야 함.
|
|
|
|
## 2) 코드 기준 핵심 원인
|
|
|
|
### 원인 A. 모달 재오픈 시 항상 1차시로 시작하도록 하드코딩
|
|
- 모달 상태 초기값이 항상 0으로 고정됨.
|
|
- 근거: [www/edu/js/puzzle-onboarding.js](www/edu/js/puzzle-onboarding.js#L2800)
|
|
- currentLessonIndex: 0
|
|
- 이후 즉시 0번 차시를 로드함.
|
|
- 근거: [www/edu/js/puzzle-onboarding.js](www/edu/js/puzzle-onboarding.js#L2808)
|
|
|
|
결과:
|
|
- 새로고침 없이 재오픈해도 2차시 자동 선택 로직이 없어서 1차시부터 보이게 됨.
|
|
|
|
### 원인 B. 재생 시작 시점(start)은 lesson.watch_tm 기반인데, 클라이언트 메모리의 watch_tm 갱신이 없음
|
|
- 재생 시작 파라미터 startTm은 lesson.watch_tm에서만 읽음.
|
|
- 근거: [www/edu/js/puzzle-onboarding.js](www/edu/js/puzzle-onboarding.js#L3389)
|
|
- 하지만 파일 내에서 lesson.watch_tm을 저장 응답으로 갱신하는 코드가 없음.
|
|
- 근거 검색 결과: lesson.watch_tm 대입 코드 부재 (조회/전달만 존재)
|
|
|
|
결과:
|
|
- 모달 닫을 때 저장 요청은 가더라도, 같은 페이지 메모리 내 chapter.lessons[*].watch_tm은 갱신되지 않아 재오픈 시 start=0으로 시작할 수 있음.
|
|
- 새로고침하면 서버에서 최신 watch_tm/completed를 다시 받아 상태가 반영됨.
|
|
|
|
### 원인 C. 완료 판정 트리거가 늦게 발생하는 구조
|
|
- 완료 판정은 차시 전환 클릭 시(이전 차시 평가) 또는 모달 닫기 시에 수행됨.
|
|
- 근거(차시 전환 시): [www/edu/js/puzzle-onboarding.js](www/edu/js/puzzle-onboarding.js#L4014)
|
|
- 근거(모달 닫기 시): [www/edu/js/puzzle-onboarding.js](www/edu/js/puzzle-onboarding.js#L4120)
|
|
- 판정 함수는 현재 플레이어 시간 또는 watch_tm/content_tm 비교로 true/false를 결정함(클라이언트 기준).
|
|
- 근거: [www/edu/js/puzzle-onboarding.js](www/edu/js/puzzle-onboarding.js#L3903)
|
|
- 서버는 별도로 90% 초과 시 completed_at를 기록하는 정책이 있으므로, 클라이언트/서버 판정 시점 차이가 생길 수 있음.
|
|
|
|
결과:
|
|
- 재생 중 즉시 상태가 바뀌는 방식이 아니라, 특정 이벤트(닫기/차시 이동) 시점에만 완료 반영됨.
|
|
- 90%를 넘겼더라도 같은 페이지 내 메모리 동기화가 늦으면 학습중으로 잠시 남아 보일 수 있음.
|
|
|
|
### 원인 D. 진도율 UI가 실시간 시청시간 기반이 아니라 completed 개수 기반
|
|
- 진도율 계산은 chapter.lessons의 completed 개수만 사용함.
|
|
- 근거: [www/edu/js/puzzle-onboarding.js](www/edu/js/puzzle-onboarding.js#L3874)
|
|
|
|
결과:
|
|
- 시청시간이 누적되어도 completed로 확정되기 전에는 0/2강, 0%처럼 보일 수 있음.
|
|
|
|
## 3) "새로고침 전/후가 다르게 보이는 이유" 정리
|
|
- 새로고침 전:
|
|
- 클라이언트 메모리의 lesson.watch_tm, lesson.completed가 즉시 동기화되지 않음.
|
|
- 모달 재오픈 시 currentLessonIndex가 0으로 다시 시작.
|
|
- 새로고침 후:
|
|
- [www/edu/skin/onboarding.php](www/edu/skin/onboarding.php#L123) 인근 쿼리에서 learning_status/watch_tm/content_tm을 재조회해 chapterData를 다시 구성.
|
|
- 서버에서 90% 기준으로 completed_at가 이미 찍힌 경우, 이 재조회 단계에서 completed 상태가 반영됨.
|
|
- 그 결과 1차시는 완료로 보이지만, 자동 2차시 선택 로직은 없어서 여전히 1차시가 기본 선택됨.
|
|
|
|
## 4) 현재 코드에 없는 것 (명시)
|
|
- 모달 오픈 시 "첫 미완료 차시" 자동 선택 로직 없음.
|
|
- 저장 성공 직후 lesson.watch_tm / lesson.completed를 강제 동기화하는 코드 없음.
|
|
- 완료 즉시 다음 차시 자동 재생(autoplay next lesson) 로직 없음.
|
|
|
|
## 5) 결론
|
|
이번 현상은 단일 버그 1건이 아니라 아래 3가지가 결합된 동작 결과임.
|
|
- 시작 차시 고정(0번)
|
|
- 클라이언트 상태 동기화 지연(새로고침 전 반영 약함)
|
|
- 완료/진도율 반영 시점이 이벤트 기반(닫기/전환 시) + 서버 90% 완료 정책과의 반영 타이밍 차이
|
|
|
|
따라서 사용자 체감은 다음처럼 나타남.
|
|
- "같은 페이지에서 다시 열면 처음부터 재생"
|
|
- "새로고침하면 완료로 보임"
|
|
- "그래도 2차시 자동으로는 안 넘어감"
|
|
|
|
---
|
|
원인 분석 완료. 요청 시 다음 단계에서 수정안을 분리하여 제시 가능.
|