Files
edu/myclass_recommend_goal_code_update.md

114 lines
4.6 KiB
Markdown

# 마이클래스 영상 상세 모달 추천 영상 로직 점검 및 변경안
작성일: 2026-04-17
## 1) 직접 확인한 현재 상태
- 추천 영상 UI 바인딩 로직은 `www/edu/js/common/VideoModalBase.js``loadRecommendedVideos(modalElement, videoData)`에서 동작함.
- 현재 프론트는 아래 API를 호출해 추천 목록을 받아 렌더링함.
- `/edu/bbs/api/get_recommend_videos.php?content_id={현재영상ID}`
- 렌더링 데이터는 `data.videos`를 순회하여 `.video-list ul`에 바인딩함.
- 현재 주석/동작 표현은 "키워드 기반 추천"으로 되어 있음.
- 백엔드 추천 API(`www/edu/bbs/api/get_recommend_videos.php`)는 현재 다음 순서로 동작함.
1. `edu_content_keywords` 기반 추천 조회
2. 결과 없으면 `category_code` 기반 fallback
3. 키워드 기반 조회 정렬은 `ORDER BY RAND()`, `LIMIT 8`
## 2) 이번 요청 기준 변경 요구사항 정리
- 랜덤 추천 제거.
- 추천 기준을 `edu_contents.goal_code`로 통일.
- 현재 재생 중 영상의 `goal_code`와 동일한 `goal_code`만 노출.
- 동일 `goal_code` 묶음에서 6개 세트를 순서대로 바인딩.
- 결과적으로 사용자가 선택한 목표 그룹(예: 1분기 목표) 내부 영상만 노출.
## 3) 변경 대상(핵심)
### A. 백엔드 API: get_recommend_videos.php
- `content_id`로 현재 영상 1건의 `goal_code` 조회.
- `goal_code`가 같고, 활성 상태인 영상만 조회.
- 현재 영상은 제외.
- 정렬은 랜덤이 아니라 고정 순서(예: `sort_order ASC`, `updated_at DESC`, `content_id DESC`).
- `LIMIT 6`으로 반환.
- 기존 키워드/카테고리 fallback 분기는 제거(또는 기능 플래그로 비활성화) 권장.
권장 조회 흐름(SQL 개념):
1. 현재 영상 goal_code 조회
```sql
SELECT content_id, goal_code
FROM edu_contents
WHERE content_id = :content_id
AND is_active = 1
LIMIT 1;
```
2. 동일 goal_code 추천 6건 조회
```sql
SELECT
c.content_id,
c.title,
c.content_url,
c.thumbnail_url AS thumbnail,
c.category_code,
c.category_group AS subcate,
COALESCE(ec.code_name, c.category_code) AS category_name,
c.goal_code
FROM edu_contents c
LEFT JOIN edu_codes ec
ON ec.base_code = c.category_code
WHERE c.is_active = 1
AND c.goal_code = :goal_code
AND c.content_id <> :content_id
ORDER BY
COALESCE(NULLIF(c.sort_order, 0), 9999) ASC,
c.updated_at DESC,
c.content_id DESC
LIMIT 6;
```
응답 형태 권장:
```json
{
"success": true,
"mode": "goal_code",
"goal_code": "G2026Q1",
"videos": [ ...최대 6건... ]
}
```
### B. 프론트(VideoModalBase.js)
- 현 구조상 프론트는 API 결과를 그대로 렌더링하므로 큰 구조 변경 없이 유지 가능.
- 다만 의미 정합성을 위해 아래 2가지는 반영 권장.
1. 주석 문구를 "키워드 기반" -> "goal_code 기반"으로 변경.
2. API 실패/빈 결과 메시지는 유지하되, 디버그 로그에 `goal_code`를 함께 출력.
## 4) 현재 워크스페이스 특이사항(중요)
직접 재확인 결과, 아래 파일들은 0바이트가 아니라 실제 코드가 존재함.
- `www/edu/bbs/api/get_recommend_videos.php`
- `www/edu/bbs/api/get_video_time.php`
- `www/edu/skin/myclass.php`
- `www/edu/skin/myclass_list.php`
- `www/edu/skin/_modal/video.php`
즉, 본 변경안은 현재 워크스페이스 코드 기준으로 바로 적용/검증 가능함.
## 5) 적용 전 추가 결정 필요사항
1. `goal_code`가 비어있는 현재 영상 처리 정책
- A안: 빈 목록 반환
- B안: 기존 카테고리 fallback 유지
2. 동일 `goal_code` 결과가 6건 미만일 때 UI 정책
- A안: 있는 만큼 노출
- B안: 부족분을 fallback으로 보충
3. 응답 스펙 확정
- 기존 `keywords` 유지 여부
- 신규 `mode`, `goal_code` 필드 추가 여부
## 6) 적용 후 기대 결과
- 추천 영역에는 현재 영상과 같은 `goal_code` 그룹 영상만 노출.
- 랜덤 섞임 제거로 목표 단위 학습 흐름 일관성 확보.
- 최대 6개 고정 바인딩으로 UI 예측 가능성 향상.
## 7) 검증 체크리스트
1. 서로 다른 `goal_code` 영상 2개를 각각 재생해 추천 목록이 서로 다르게 바뀌는지 확인.
2. 추천 목록의 모든 항목이 현재 영상과 동일 `goal_code`인지 DB로 샘플 대조.
3. 현재 영상이 추천 목록에 다시 나타나지 않는지 확인.
4. 같은 입력에서 새로고침해도 순서가 랜덤으로 바뀌지 않는지 확인.
5. `goal_code`가 없는 영상의 처리 정책(빈 목록 또는 fallback)을 합의한 정책대로 확인.