13 KiB
13 KiB
mypage 영상 모달 연결 구조 분석 및 선행 Task
작성 목적
mypage.php의 3개 탭(시청중인 콘텐츠, 시청완료 콘텐츠, 저장한 콘텐츠) 리스트 카드 클릭 시,search_result.php와 동일한 "카테고리 정책 보존형 모달 라우팅"을 적용하기 위한 사전 구조 분석 문서.- 이 문서는 분석/태스크 정의용이며, 실제 코드 반영 전 기준점으로 사용한다.
1) 현재 마이페이지 구조 (운영 기준)
1-1. 화면 엔트리
- 메인 페이지:
edu/skin/mypage.php - 탭 UI:
- 시청중인 콘텐츠:
#panel-watching, 리스트 컨테이너#mypage-watching-list - 시청완료 콘텐츠:
#panel-completed, 리스트 컨테이너#mypage-completed-list - 저장한 콘텐츠:
#panel-saved, 리스트 컨테이너#mypage-saved-list
- 시청중인 콘텐츠:
1-2. 프론트 스크립트 역할 분리
edu/js/mypage.js- 퍼블리싱 UI 전환 중심(탭 전환, 모바일 UI/바텀시트, 아코디언 등)
- 콘텐츠 모달 로직 없음
edu/js/apply_page/add_mypage.js- 실데이터 바인딩/탭별 AJAX 조회/무한스크롤/북마크 토글/삭제/한줄소감/학습레벨 처리
- 현재 마이페이지 데이터 동작의 핵심 스크립트
1-3. 데이터 API
- 학습활동/카테고리 통계:
edu/ajax/get_init_data_for_mypage.php - 탭별 콘텐츠 리스트:
edu/ajax/get_video_list_for_mypage.php - 북마크 토글:
edu/ajax/toggle_content_wishlist.php - 카드 삭제(정책상 버튼 숨김):
edu/ajax/delete_mypage_content_item.php - 한줄소감:
edu/ajax/get_review_list_for_mypage.php
2) 현재 탭 리스트 렌더링 방식
2-1. 서버 HTML 조각 주입 방식
add_mypage.js의loadWatchingContentList / loadCompletedContentList / loadSavedContentList가get_video_list_for_mypage.php를 호출한다.- 응답은 JSON 형태지만, 리스트 본문은
html문자열(서버에서 생성한<li>조각)로 내려온다. - 프론트는
innerHTML또는insertAdjacentHTML로 직접 주입한다.
2-2. 카드 마크업 특징
- 각 카드 루트는
.content-card[data-content-id] - 카드 링크는
.card-link - 북마크 체크박스는
.bookmark input[type="checkbox"] - 현재 서버에서 카드 링크 URL을 강제로
#로 세팅하고 있어 모달 오픈 진입이 없다.
2-3. 탭 카운트/무한스크롤
- 카운트는 API 응답
counts를renderContentTabCounts로 갱신 - 무한스크롤은 각 탭 리스트
ul의scroll이벤트 기반 - 탭별 상태:
contentListState.{watching|completed|saved}
3) 모달 연결 관점에서 현재 갭
3-1. 모달 오픈 진입점 부재
- 카드 클릭 시 호출되는 모달 함수가 없다.
VideoModalManager인스턴스 생성 코드도 현재 마이페이지 경로에는 없다.
3-2. 브리지 라우팅에 필요한 데이터 부족
- 현재 카드 DOM에는 최소
content_id만 보장된다. - 카테고리 분기(
category_code)와 브리지 입력 스키마(title,description,subCategory,watchTm,contentTm,bookmark등)를 안정적으로 꺼낼 원천이 부족하다. get_video_list_for_mypage.php는 내부적으로 필요한 데이터를 계산하지만, 프론트에 구조화된videos배열을 내려주지 않고 HTML 조각 위주로만 사용한다.
3-3. 추천/전용 UX 보존 요구
search_result.php와 동일하게 카테고리별 브리지 우선 호출이 필요하다.- 이미 사용 중인 브리지:
- 온보딩:
window._onboardingOpenModal - 법정교육:
window._learningOpenModal
- 온보딩:
- 미연결 브리지(추가 필요): 인사이트/리더십/비즈트렌드(또는 fallback 정책 명확화)
3-4. 북마크 이벤트 충돌 가능성
- 현재는 문서 전역
change이벤트에서 체크박스를 처리하며,.content-card기준으로 북마크 토글을 수행한다. - 모달 내부 체크박스/리스트 체크박스와 이벤트가 섞이지 않도록 이벤트 스코프 구분이 필요하다.
4) search_result와 비교한 구조 차이
search_result
- 페이지 내
currentVideosJSON 보유 openSearchResultVideoByCategory(videoData)로 카테고리 분기- 브리지 없으면
VideoModalManager.openVideofallback
mypage (현재)
- 탭별 HTML 조각 주입 중심
- 카드별 구조화된
videoData저장소 없음 - 모달 호출 함수 없음
결론
- 마이페이지는 먼저 "리스트 데이터 모델(클라이언트 측 video map) 확보"를 해야 search_result와 같은 브리지 라우팅 구조를 적용할 수 있다.
5) 필요한 작업 Task (코드 적용 전 정의)
우선순위 순서로 정리.
Task A. 마이페이지 모달 라우팅 공통 함수 도입
- 목표: 카드 클릭 -> 카테고리별 브리지 호출 -> fallback 공통 모달 흐름 구현
- 작업 항목:
add_mypage.js에openMypageVideoByCategory(videoData)추가- 분기 정책을
search_result.php와 동일하게 정렬 - 브리지 함수 존재 여부 체크 후 호출
- 브리지 미존재 시
VideoModalManager.openVideo(content_id)fallback
Task B. 탭 리스트 데이터 모델 정규화
- 목표: 각 카드 클릭 시
videoData를 안정적으로 조회 가능하게 만들기 - 작업 항목(선택지):
get_video_list_for_mypage.php응답에videos배열(구조화 데이터) 추가- 또는 카드 DOM에
data-*를 확장해 분기/모달 입력값을 모두 싣기 - 탭별 로딩 후 전역 map(
content_id -> videoData) 유지
- 권장안:
videos배열 병행 응답(HTML + JSON 동시 반환)
Task C. 카드 클릭 이벤트 체계 정리
- 목표: 북마크 체크 클릭과 카드 클릭(모달 오픈)을 명확 분리
- 작업 항목:
.card-link클릭 위임 핸들러 추가.bookmark영역 클릭 시 모달 오픈 차단- 모바일 탭/무한스크롤과 충돌 없는 위임 범위 고정
Task D. 마이페이지 전용 공통 모달 fallback 준비
- 목표: 브리지가 없는 카테고리도 기존 기능 손실 없이 기본 모달 오픈
- 작업 항목:
VideoModalManager인스턴스를 마이페이지에서 1회 생성/재사용- 탭 데이터 갱신 시 manager 내부
videos동기화
Task E. 브리지 대상 카테고리 확장
- 목표: 탭 3개 어디서 열어도 카테고리 원본 UX 보존
- 작업 항목:
- 비즈트렌드 브리지 재사용 가능 여부 확인
- 인사이트/리더십 브리지 신규 작성 또는 fallback 정책 확정
- 온보딩/법정교육 브리지 로딩 순서 및 의존성 확인
Task F. API/세션 일관성 정비
- 목표: 최근 정책(세션 키, 완료 기준, 정렬 기준)과 동일 동작 보장
- 점검 항목:
- 세션:
member_id,sys_comp_code기준 유지 - 완료 판단(특히 completed 탭)과 실제 모달 상태의 정합성
- 정렬 기준(최근 시청/완료/저장 시점)과 UX 일치
- 세션:
Task G. 검증 체크리스트
- 공통:
- 3개 탭 카드 클릭 시 모달 정상 오픈
- ESC/배경/닫기 버튼 정상
- 북마크 토글 후 탭 카운트/카드 체크상태 동기화
- 무한스크롤 로드 이후 카드도 동일하게 모달 오픈
- 카테고리별:
- 온보딩: 차시/댓글/북마크/이어보기
- 법정교육: 차시 정렬/완료상태/설명 노출
- 리더십/인사이트/비즈트렌드: 원본 페이지 정책 유지
6) 권장 구현 순서 (실작업 시작 시)
Task B(데이터 모델 정규화) 먼저Task C(카드 클릭 이벤트) +Task D(fallback manager)Task A(카테고리 분기 함수)Task E(브리지 확장)Task F(정합성 점검) +Task G(검증)
이 순서가 가장 안전한 이유
- 현재 마이페이지는 HTML 조각 주입 기반이므로, 데이터 모델이 먼저 없으면 브리지 분기 자체가 불안정해진다.
7) 마이페이지 작업 이력 로그
기록 규칙
- 마이페이지 관련 작업이 끝날 때마다 이 섹션 마지막에 항목을 추가한다.
- 코드 전체는 넣지 않고, 파일/라인/작업요약만 기록한다.
2026-04-21 / Task B 1차 반영
edu/ajax/get_video_list_for_mypage.php
- 라인 31:
map_content_row시작점. - 라인 39:
all_tm파생값 추가. - 라인 63:
subcate(category_group)매핑 추가. - 라인 66:
description2매핑 추가. - 라인 74: 응답 video 항목에
all_tm포함. - 라인 225, 271, 321, 344: 탭별 조회 SQL에
c.category_group컬럼 추가. - 라인 228, 274, 324, 347: 탭별 조회 SQL에
c.description2컬럼 추가. - 라인 233, 279, 290, 329, 352: 탭별 조회 SQL에
all_tm컬럼 추가/전파. - 라인 529: JSON 응답에
videos배열 추가 (html병행 유지).
edu/js/apply_page/add_mypage.js
- 라인 28: 탭별 구조화 데이터 저장소
mypageVideoStore추가. - 라인 35: 디버그/연동용
window._mypageVideoStore노출. - 라인 48-49: 탭 상태 초기화 시 해당 탭 store clear 처리.
- 라인 53:
normalizeMypageVideo(video)추가 (모달 분기용 표준 포맷 정규화). - 라인 81:
mergeVideosIntoStore(tab, videos, page)추가. - 라인 746: watching 로딩 응답에서
data.videosstore 반영. - 라인 808: completed 로딩 응답에서
data.videosstore 반영. - 라인 878: saved 로딩 응답에서
data.videosstore 반영.
- 검증
edu/ajax/get_video_list_for_mypage.php: 오류 없음.edu/js/apply_page/add_mypage.js: 오류 없음.
2026-04-21 / Task C + Task D(최소 fallback) 반영
edu/skin/mypage.php
- 라인 617:
VideoModalManager로더 스크립트 추가 (/edu/js/main/Videomodalmanager.js).
edu/js/apply_page/add_mypage.js
- 라인 37:
mypageModalManager변수 추가(마이페이지 공통 모달 인스턴스 참조). - 라인 58:
normalizeMypageVideo에category필드 정규화 추가. - 라인 68:
normalizeMypageVideo에type기본값(main) 추가. - 라인 98: store merge 이후
syncMypageModalManagerVideos()호출 추가. - 라인 101:
getAllMypageVideos()추가(탭별 store 병합). - 라인 115:
ensureMypageModalManager()추가(1회 생성/재사용). - 라인 131:
syncMypageModalManagerVideos()추가(manager 영상목록 동기화). - 라인 141:
getVideoByTabAndContentId(tab, contentId)추가(카드 클릭 시 데이터 조회). - 라인 155:
bindContentCardOpenAction()추가(카드 클릭 위임 핸들러). - 라인 161:
.bookmark,.btn-remove-card클릭 시 모달 오픈 차단 처리. - 라인 189: fallback 모달 오픈
manager.openVideo(videoData.content_id)연결. - 라인 221:
DOMContentLoaded구간에bindContentCardOpenAction()바인딩 추가.
- 검증
edu/skin/mypage.php: 오류 없음.edu/js/apply_page/add_mypage.js: 오류 없음.
2026-04-21 / Task A 반영
edu/js/apply_page/add_mypage.js
- 라인 155:
toBridgeInfo(videoData)추가(브리지 공통 입력 스키마 변환). - 라인 174:
openMypageVideoByCategory(videoData)추가(카테고리 정책 보존형 분기 함수). - 라인 178-179:
CA10006비즈트렌드 브리지(window._biztrendOpenModal) 우선 호출. - 라인 183-184:
CA10005인사이트 브리지(window._insightOpenModal) 우선 호출. - 라인 188-189:
CA10004리더십 브리지(window._leadershipOpenModal) 우선 호출. - 라인 193-194:
CA10003법정교육 브리지(window._learningOpenModal) 우선 호출. - 라인 198-199:
CA10002온보딩 브리지(window._onboardingOpenModal) 우선 호출. - 라인 203-211: 브리지 미존재 시
VideoModalManager.openVideo(content_id)fallback 유지. - 라인 239-240: 카드 클릭 핸들러에서
openMypageVideoByCategory호출로 전환 및 실패 로그 처리.
- 검증
edu/js/apply_page/add_mypage.js: 오류 없음.
2026-04-21 / Task E 반영
edu/skin/mypage.php
- 라인 620: 법정교육 브리지 로드 스크립트 추가 (
/edu/js/bridges/learning-modal-bridge.js). - 라인 621-627: 온보딩 브리지 의존용
window.puzzleConfig주입 추가. - 라인 628: 온보딩 전용 스크립트 로드 추가 (
/edu/js/puzzle-onboarding.js). - 라인 629: 온보딩 브리지 로드 스크립트 추가 (
/edu/js/bridges/onboarding-modal-bridge.js). - 라인 630: fallback 공통 모달 스크립트 유지 (
/edu/js/main/Videomodalmanager.js).
edu/js/apply_page/add_mypage.js
- 라인 174:
tryBridgeOpen(openFn, bridgeInfo, bridgeName)추가(브리지 실패를 흡수하고 fallback 가능하도록 처리). - 라인 183: 브리지 예외 로그 표준화(
[mypage modal] bridge failed). - 라인 193:
CA10006비즈트렌드 브리지 호출을tryBridgeOpen경유로 변경. - 라인 198:
CA10005인사이트 브리지 호출을tryBridgeOpen경유로 변경. - 라인 203:
CA10004리더십 브리지 호출을tryBridgeOpen경유로 변경. - 라인 208:
CA10003법정교육 브리지 호출을tryBridgeOpen경유로 변경. - 라인 213:
CA10002온보딩 브리지 호출을tryBridgeOpen경유로 변경. - 라인 218 이후: 브리지 호출 실패/미존재 시
VideoModalManagerfallback 경로 유지.
- 검증
edu/skin/mypage.php: 오류 없음.edu/js/apply_page/add_mypage.js: 오류 없음.