================================================================================ LMS 과정 목록/상세 페이지 생성 완료 ================================================================================ 생성 일시: 2026-03-19 파일 구조 유지: ✓ (/api 트리 유지) DB 스키마 변경: ✗ (기존 DDL 유지) ================================================================================ 생성된 파일 ================================================================================ 1. /user/index.php (710줄, 21KB) - 과정 목록 페이지 (공개 과정 조회) - 기능: * 페이지네이션 (한 페이지 12개) * 카테고리 필터링 * 훈련유형 필터링 (일반/사업주/실업자/근로자/법정) * 검색 기능 (과정명/요약) * 반응형 그리드 레이아웃 (3 컬럼) * 배지 표시 (법정/환급) - DB 쿼리: * SELECT COUNT(*) - 전체 건수 * SELECT lms_course + lms_category - 과정 목록 * SELECT lms_category - 카테고리 사이드바 2. /user/course/detail.php (1087줄, 31KB) - 과정 상세 페이지 - 기능: * 3개 탭: 과정소개 / 학습목차 / 수강신청 * 과정 상세정보 표시 * 강사 정보 표시 * 학습목차 (차시 나열) * 수강신청 폼 (무료/유료 처리) - 보안: * CSRF 토큰 검증 * 세션 인증 (로그인 필수) * SQL Injection 방지 (db_escape, db_int) * XSS 방지 (xss 함수) - DB 쿼리: * SELECT lms_course - 과정 정보 * SELECT lms_course_tutor + lms_tutor - 강사 정보 * SELECT lms_content - 학습목차 * SELECT lms_class - 수강 가능한 차수 * INSERT lms_enrollment - 수강신청 처리 * UPDATE lms_class - 수강인원 업데이트 - 트랜잭션: INSERT/UPDATE 일관성 보장 ================================================================================ 기술 스택 ================================================================================ 언어: PHP 7.x (match 함수 사용 금지) DB: MySQL 8.x (mysqli 기반) 인증: 세션 기반 (session_member_check, session_member_get) 보안: - CSRF: csrf_field(), csrf_verify() - SQL Injection: db_escape($value), db_int($value) - XSS: xss($str) 입력값 처리: - post($key, $default) - POST 문자열 - get($key, $default) - GET 문자열 - post_int($key, $default) - POST 정수 - get_int($key, $default) - GET 정수 DB 함수: - db_fetch_row($sql) - 단일 행 반환 - db_fetch_all($sql) - 배열 반환 - db_count($sql) - COUNT(*) 반환 - db_execute($sql) - INSERT/UPDATE/DELETE - db_begin(), db_commit(), db_rollback() - 트랜잭션 기타: - paginate($total, $page, $per_page) - 페이지네이션 계산 - flash_set($type, $message) - 메시지 설정 - redirect($url) - 페이지 이동 - format_money(), format_time_minutes(), format_date() 등 ================================================================================ 포함된 헤더/푸터 ================================================================================ - /user/header.php (공통 헤더 로드) - /user/footer.php (공통 푸터 로드) 구조: 1. /user/index.php - define LMS_ROOT (dirname 2단계) - require_once config.php - 로직 처리 - require header.php - HTML 렌더링 - require footer.php 2. /user/course/detail.php - define LMS_ROOT (dirname 3단계) - require_once config.php - 로직 처리 - require header.php - HTML 렌더링 - require footer.php ================================================================================ 테이블 관계도 ================================================================================ lms_category ├─ lms_course ├─ lms_course_tutor │ └─ lms_tutor ├─ lms_content ├─ lms_class │ └─ lms_enrollment │ ├─ lms_member │ └─ lms_content_progress ================================================================================ 주요 기능 구현 상세 ================================================================================ [index.php - 과정 목록] 1. 필터링 로직: - category_id: 카테고리 선택 - type: 훈련유형 (normal/company/unemployed/worker/legal) - search: 과정명/요약 검색 - page: 페이지 번호 2. SQL 구성: - WHERE: display_yn='Y' AND status=1 (공개 과정만) - category_id 필터 추가 - type_* 플래그 필터 추가 - 검색어 필터 (LIKE) 3. 페이지네이션: - paginate() 함수로 페이지 정보 계산 - offset/limit 적용 - 이전/다음/범위 네비게이션 4. UI 구성: - 좌측 필터 사이드바 - 중앙 과정 그리드 (3컬럼, 반응형) - 우측: 없음 (가로 전체) - CSS Grid 기반 레이아웃 - Hover 효과/배지/가격 표시 [detail.php - 과정 상세] 1. 과정 정보 조회: - 기본 정보 (제목, 요약, 설명, 학습목표, 수강대상) - 가격 정보 (정가, 판매가) - 썸네일 이미지 - 카테고리, 강사 정보 2. 강사 정보: - 주강사/보조강사/튜터 역할 표시 - 프로필 사진 및 소개 3. 학습목차: - 차시 순서대로 나열 - 차시별 시간 표시 - 콘텐츠 유형 (SCORM/동영상/HTML/PDF) 4. 수강신청 가능 차수: - reg_start_date <= today <= reg_end_date - capacity > 0 또는 enroll_count < capacity - 차수 정보 표시 (연도, 차수, 신청기간, 학습기간) 5. 수강신청 처리: - CSRF 토큰 검증 - 로그인 확인 (미로그인시 로그인 페이지로) - 기존 수강신청 중복 확인 - 트랜잭션 처리: * INSERT lms_enrollment * UPDATE lms_class (enroll_count + 1) * 무료 과정: 자동 승인 (enroll_status='A') * 유료 과정: 결제 대기 (enroll_status='W') 6. UI 구성: - 상단 히어로 이미지 - 탭 네비게이션 - 좌측 메인 컨텐츠 - 우측 사이드바 (수강료, 과정정보) - 반응형 디자인 ================================================================================ 보안 고려사항 ================================================================================ 1. SQL Injection 방지: - 모든 변수: db_escape() 또는 db_int() - 예: "WHERE c.category_id = " . db_int($category_id) - 예: "WHERE c.course_title LIKE '%{$search_esc}%'" 2. XSS 방지: - 모든 출력: xss() 함수 - 예: 3. CSRF 방지: - csrf_field() - 폼에 CSRF 토큰 필드 추가 - csrf_verify() - POST 요청시 토큰 검증 - 토큰 만료시간: CSRF_EXPIRE (기본 3600초) 4. 인증: - session_member_check() - 로그인 여부 확인 - session_member_get() - 세션 정보 조회 - 로그인 실패시 로그인 페이지로 리다이렉트 5. 트랜잭션: - db_begin() / db_commit() / db_rollback() - 수강신청 처리시 INSERT/UPDATE 일관성 보장 - 오류 발생시 자동 롤백 ================================================================================ CSS 클래스 구조 ================================================================================ index.php: - .courses-container (메인 컨테이너) - .courses-sidebar (좌측 필터) - .courses-main (메인 영역) - .courses-grid (과정 그리드) - .course-card (개별 과정 카드) - .pagination-wrapper (페이지네이션) detail.php: - .course-detail-container (메인 컨테이너) - .course-hero (상단 히어로) - .course-main (메인 레이아웃) - .course-content (좌측 탭 컨텐츠) - .course-sidebar (우측 사이드바) - .tab-nav / .tab-content (탭) - .enroll-form (수강신청 폼) ================================================================================ 테스트 시 확인 사항 ================================================================================ [ ] 과정 목록 페이지 로드 (DB 연결 확인) [ ] 카테고리 필터 동작 [ ] 훈련유형 필터 동작 [ ] 검색 기능 동작 [ ] 페이지네이션 동작 [ ] 과정 상세 페이지 로드 [ ] 탭 전환 동작 [ ] 미로그인시 수강신청 버튼 클릭 → 로그인 페이지 [ ] 로그인 후 수강신청 (무료 과정) [ ] 로그인 후 수강신청 (유료 과정) [ ] 중복 수강신청 방지 [ ] 정원 초과시 신청 불가 [ ] CSRF 토큰 검증 [ ] 반응형 디자인 (모바일/태블릿/PC) ================================================================================