255 lines
9.5 KiB
Markdown
255 lines
9.5 KiB
Markdown
# search_result 카테고리별 모달 분기 분석 및 적용 방안
|
|
|
|
작성 목적: `search_result.php`에서 검색 결과 카드 클릭 시, 각 카테고리 페이지와 동일한 모달 경험(모달 템플릿, 추천 로직, 진행 저장, 댓글/북마크 동작)을 제공하기 위한 사전 분석 문서.
|
|
|
|
원칙:
|
|
- 이 문서는 설계/분석 전용이다.
|
|
- 실제 코드 적용은 별도 단계에서 진행한다.
|
|
|
|
## 1) 현재 구조 요약
|
|
|
|
### A. search_result (현재)
|
|
- 진입점: `skin/search_result.php`
|
|
- 모달 호출 방식:
|
|
- `VideoModalManager`를 `currentVideos`로 초기화
|
|
- `#videoCardsContainer` 내부 `.card[data-video-id]` 클릭 시 `openVideo(videoId)`
|
|
- 모달 엔진:
|
|
- `js/main/Videomodalmanager.js` -> `js/common/VideoModalBase.js`
|
|
- 추천 로직:
|
|
- `VideoModalBase.loadRecommendedVideos()` 내부에서 컨텍스트에 따라 API 자동 분기
|
|
- 마이클래스 컨텍스트: `/edu/bbs/api/get_recommend_videos_goal.php`
|
|
- 그 외: `/edu/bbs/api/get_recommend_videos.php`
|
|
|
|
핵심 특징:
|
|
- search_result는 현재 단일 공통 모달 체계(VideoModalManager)만 사용 중이다.
|
|
- 하지만 실제 서비스는 카테고리별로 모달 구현체가 다르다(특히 insight/biztrend/onboarding/legal).
|
|
|
|
### B. index
|
|
- 진입점: `skin/index.php`
|
|
- 모달 호출: `VideoModalManager`
|
|
- 추천: `VideoModalBase` 경유(공용 API)
|
|
- 결론: search_result의 현재 방식과 가장 유사
|
|
|
|
### C. myclass
|
|
- 진입점: `skin/myclass_list.php`, `js/myclass_list.js`
|
|
- 모달 호출: `VideoModalManager` + `modalManager.openVideo(id)`
|
|
- 데이터 특성:
|
|
- `type: comment`
|
|
- `category_code: CA10001`
|
|
- `goal_code` 포함
|
|
- 추천: goal_code 전용 API(`/get_recommend_videos_goal.php`) 사용 맥락
|
|
- 결론: 공통 모달 기반이지만 추천 소스는 전용 분기 필요
|
|
|
|
### D. onboarding
|
|
- 진입점: `skin/onboarding.php`, `js/puzzle-onboarding.js`
|
|
- 모달 호출: `PuzzleModalManager` 내부 `VideoModalBase` 직접 생성
|
|
- 모달 템플릿: `./_modal/video-onboarding.php`
|
|
- 특징:
|
|
- 퍼즐 진행 상태와 결합
|
|
- 챕터/레슨 구조 기반
|
|
- 결론: search_result에서 일반 `VideoModalManager`로 대체하면 UX/상태 흐름 불일치 가능
|
|
|
|
### E. legal learning (법정교육)
|
|
- 진입점: `skin/learning.php`, `js/learning/modal.js`
|
|
- 모달 호출: `class VideoModal extends VideoModalBase`
|
|
- 모달 템플릿: `./_modal/video-learning.php`
|
|
- 특징:
|
|
- 마커/챕터/학습진도 동기화 로직이 별도
|
|
- skip 제한/저장 주기가 일반 페이지와 다름
|
|
- 결론: search_result에서도 법정교육 항목은 learning 전용 모달 흐름을 타야 정합성이 맞음
|
|
|
|
### F. leadership
|
|
- 진입점: `skin/leadership.php`
|
|
- 모달 호출: 페이지 내부 `openModal(info)`
|
|
- 추천: `/edu/bbs/api/get_recommend_videos.php` (키워드 API)
|
|
- 특징:
|
|
- jQuery 기반 전용 모달 DOM
|
|
- 댓글/북마크/진행저장 루틴이 페이지 JS에 포함
|
|
- 결론: 공통 모달로 이관 가능성은 있으나 현재는 독립 구현
|
|
|
|
### G. insight
|
|
- 진입점: `skin/insight.php`
|
|
- 모달 호출: 페이지 내부 `openModal(info)`
|
|
- 추천: API 호출이 아닌 현재 `#video-list` DOM 기반 `buildRecommendedList()`
|
|
- 특징:
|
|
- 같은 페이지 목록 기반 추천이라는 정책 차이 존재
|
|
- 결론: leadership과 비슷해 보이지만 추천 정책이 다르므로 분리 판단 필수
|
|
|
|
### H. biztrend
|
|
- 진입점: `skin/biztrend.php`, `js/biztrend.js`
|
|
- 모달 호출: 페이지 내부 `openModal(info)`
|
|
- 외부 브리지: `window._biztrendOpenModal = openModal`
|
|
- 특징:
|
|
- 월/기사형 그리드와 결합
|
|
- 전용 추천 리스트 구성/전용 UI
|
|
- 결론: search_result에서 biztrend는 전용 브리지 호출 방식이 안전
|
|
|
|
## 2) 문제 정의
|
|
|
|
현재 search_result는 카테고리 구분 없이 `VideoModalManager` 1개만 사용한다.
|
|
이 상태에서 발생 가능한 불일치:
|
|
- onboarding/legal: 전용 템플릿/전용 상태 흐름 미적용
|
|
- insight: 페이지 내 리스트 기반 추천 정책 미반영
|
|
- biztrend: 전용 모달 UI/브리지 미사용
|
|
|
|
즉, 검색 결과에서 클릭한 카드가 원본 카테고리 페이지의 체험과 달라질 수 있다.
|
|
|
|
## 3) 분기 설계안 (코드 적용 전 제안)
|
|
|
|
분기 기준: `video.category_code` (필요 시 `category_group` 보조)
|
|
|
|
제안 라우팅:
|
|
- `CA10001` (마이클래스)
|
|
- 핸들러: `VideoModalManager`
|
|
- 추천: goal API 분기 유지
|
|
- `CA10004` (리더십)
|
|
- 1안(보수): 현행 `VideoModalManager` 유지 + 공용 추천 API
|
|
- 2안(동일 UX 우선): leadership 전용 `openModal` 브리지 추가
|
|
- `CA10005` (인사이트)
|
|
- 인사이트 전용 모달 브리지 사용 권장
|
|
- 이유: 추천 로직이 DOM 기반(동일 정책 유지)
|
|
- `CA10006` (비즈트렌드)
|
|
- `window._biztrendOpenModal` 브리지 우선 호출
|
|
- `CA10002` (온보딩)
|
|
- onboarding 전용 모달 호출(별도 브리지 또는 전용 manager 인스턴스)
|
|
- `CA10003` (법정교육)
|
|
- learning 전용 모달 호출(별도 브리지 또는 전용 VideoModal 인스턴스)
|
|
- 기타/미지정
|
|
- 공통 `VideoModalManager` fallback
|
|
|
|
핵심:
|
|
- "공통으로 합치는 것"이 아니라 "카테고리 정책을 보존한 라우팅"이 목적.
|
|
|
|
## 4) search_result 적용 방식 제안
|
|
|
|
### Step 1. 공통 분기 함수 도입
|
|
예: `openSearchResultVideoByCategory(videoData)`
|
|
- 입력: 현재 카드의 `videoData`
|
|
- 처리:
|
|
1) category_code 판별
|
|
2) 해당 카테고리 브리지 존재 여부 확인
|
|
3) 브리지 있으면 전용 모달 호출
|
|
4) 없으면 `modalManager.openVideo(videoData.id)` fallback
|
|
|
|
### Step 2. 브리지 인터페이스 표준화
|
|
각 전용 페이지가 search_result에서도 재사용할 수 있도록 전역 함수 노출 표준 정의:
|
|
- onboarding: `window._onboardingOpenModal(info)`
|
|
- learning: `window._learningOpenModal(info)`
|
|
- leadership: `window._leadershipOpenModal(info)` (선택)
|
|
- insight: `window._insightOpenModal(info)`
|
|
- biztrend: 기존 `window._biztrendOpenModal(info)` 재사용
|
|
|
|
`info` 공통 스키마 제안:
|
|
- `contentId`
|
|
- `videoUrl`
|
|
- `title`
|
|
- `description`
|
|
- `categoryName`
|
|
- `subCategory`
|
|
- `watchTm`
|
|
- `contentTm`
|
|
- `bookmark`
|
|
|
|
### Step 3. search_result 클릭 이벤트 수정(적용 단계에서)
|
|
현재 `.card` 클릭 -> `modalManager.openVideo(videoId)` 고정 호출.
|
|
이를 `openSearchResultVideoByCategory(videoData)` 호출로 변경.
|
|
|
|
## 5) 리스크 및 방지책
|
|
|
|
리스크:
|
|
- 전용 페이지 스크립트가 해당 페이지 DOM 전제(`selector`)를 강하게 가지는 경우 search_result에서 재사용 불가
|
|
- 전역 브리지 함수 미로딩 시 호출 실패
|
|
- 추천 정책 혼선(특히 insight DOM 기반)
|
|
|
|
방지책:
|
|
- 브리지 함수 내부에서 필요한 최소 DOM만 모달 내부로 한정
|
|
- 브리지 호출 전 `typeof window._xxxOpenModal === 'function'` 체크 + fallback
|
|
- 카테고리별 E2E 체크리스트 운영
|
|
|
|
## 6) 테스트 체크리스트 (코드 적용 후 검증용)
|
|
|
|
공통:
|
|
- 검색 결과 카드 클릭 시 모달 정상 오픈
|
|
- 닫기/ESC/배경 클릭 동작 정상
|
|
- 북마크 토글 즉시 반영 + 재오픈 시 유지
|
|
- 시청시간 저장/이어보기 동작
|
|
|
|
카테고리별:
|
|
- myclass: 추천이 동일 goal_code 묶음으로 노출되는지
|
|
- onboarding: 전용 템플릿/챕터 문맥 깨지지 않는지
|
|
- legal: skip 제한/진도 저장이 기존과 동일한지
|
|
- leadership: 키워드 기반 추천 API 노출 정상
|
|
- insight: 페이지 내 리스트 기반 추천 정책 유지
|
|
- biztrend: 전용 모달 UI + 외부 YouTube 폴백 동작
|
|
|
|
## 6-1) 카테고리별 기능 보존 요구사항 (절대 누락/변경 금지)
|
|
|
|
목표:
|
|
- search_result에서 모달 분기를 통합하더라도, 각 카테고리 기존 기능은 단 하나도 누락/변경되지 않아야 한다.
|
|
|
|
### 1. 마이클래스
|
|
- 한줄소감문
|
|
- 관련영상 리스트: 동일 목표(goal) 내 영상 리스트업
|
|
- skip 방지
|
|
- 시청기록 저장
|
|
- 북마크 기능
|
|
|
|
### 2. 온보딩
|
|
- 댓글
|
|
- 차시 리스트
|
|
- skip 방지
|
|
- 시청기록 저장
|
|
- 북마크 기능
|
|
- 배속 조절 방지 기능
|
|
|
|
### 3. 법정교육
|
|
- 차시 리스트
|
|
- skip 방지
|
|
- 시청기록 저장
|
|
- 북마크 기능
|
|
- 배속 조절 방지 기능
|
|
|
|
### 4. 리더십
|
|
- 댓글
|
|
- 관련 영상 리스트업
|
|
- 시청기록 저장
|
|
- 북마크 기능
|
|
|
|
### 5. 인사이트
|
|
- 댓글
|
|
- 관련 영상 리스트업
|
|
- 시청기록 저장
|
|
- 북마크 기능
|
|
|
|
### 6. 비즈트렌드
|
|
- 댓글
|
|
- 관련 영상 리스트업
|
|
- 시청기록 저장
|
|
- 북마크 기능
|
|
|
|
### 7. index
|
|
- 댓글
|
|
- 관련 영상 리스트업
|
|
- 시청기록 저장
|
|
- 북마크 기능
|
|
|
|
통합 분기 시 적용 원칙:
|
|
- 카테고리별 기능 차이는 유지하고, 호출 진입점만 통합한다.
|
|
- 공통 fallback 적용 시에도 카테고리 전용 기능이 축소되면 안 된다.
|
|
- 배속 제한/skip 제한/차시 구조/추천 기준(goal, DOM 기반 등)은 기존 정책을 그대로 유지한다.
|
|
- 기능 변경이 필요한 경우, 사전 합의 없이는 적용하지 않는다.
|
|
|
|
검증 게이트(배포 전 필수):
|
|
- 카테고리별로 위 항목을 1개씩 체크하여 전부 통과해야만 완료로 본다.
|
|
- 하나라도 실패하면 공통 분기 반영을 보류하고 해당 카테고리 전용 경로를 유지한다.
|
|
|
|
## 7) 결론
|
|
|
|
search_result에 필요한 것은 "모달 단일화"가 아니라 "카테고리 정책 보존형 라우팅"이다.
|
|
우선순위는 다음과 같다:
|
|
1. 분기 함수 도입
|
|
2. 전용 브리지 표준화
|
|
3. 브리지 불가 카테고리는 공통 모달 fallback
|
|
|
|
이 순서로 적용하면 기존 페이지의 안정성을 유지하면서 search_result 정합성을 높일 수 있다.
|