# 마이클래스 영상 상세 모달 추천 영상 로직 점검 및 변경안 작성일: 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)을 합의한 정책대로 확인.