“이 강의를 어디까지 들었는지”, “시험을 몇 번 재응시했는지”, “수료 조건을 채웠는지”를 정확히 추적하지 못하는 LMS는 교육 효과 측정도, 수료증 발급도 신뢰할 수 없습니다. 구축형 LMS의 핵심은 화면 디자인이 아니라 수강 이력을 정확하게 쌓는 데이터베이스 구조에 있습니다. 특히 사내 교육처럼 수료가 인사평가와 연결되는 경우, 데이터 정합성은 선택이 아니라 필수입니다.
핵심 테이블 4개: 강의, 수강, 진도, 평가
LMS 데이터 모델은 크게 네 축으로 나눠 설계합니다.
| 테이블 | 담는 정보 |
|---|---|
| 강의(Course) | 강의명, 커리큘럼, 차시 구성, 수료 조건 |
| 수강(Enrollment) | 누가 어떤 강의를 언제 신청했는지, 유효기간 |
| 진도(Progress) | 차시별 시청 시작·종료 시점, 누적 시청 시간 |
| 평가(Assessment) | 시험 응시 이력, 점수, 재응시 횟수 |
이 네 테이블을 명확히 분리하지 않고 “수강 정보 하나에 진도율 숫자 하나”로 뭉쳐서 저장하면, 이후 세부 학습 패턴 분석이나 부정 수강 탐지가 불가능해집니다.
진도율을 정확히 계산하는 로직 설계
진도율은 단순히 “본 차시 수 / 전체 차시 수”로 계산하면 부정확합니다. 실무에서는 아래를 함께 고려합니다.
- 차시별 실제 시청 시간을 기록해, 영상을 끝까지 재생만 하고 다른 창을 본 경우와 실제 학습한 경우를 구분
- 배속 재생 시에도 실제 학습 시간으로 인정할지 여부를 정책으로 정의
- 같은 차시를 여러 번 나눠서 본 경우 누적 시청 구간을 합산해 중복 계산 방지
이 로직이 정교하지 않으면 “진도율 100%인데 실제로는 5분만 시청” 같은 사례가 발생해, 수료증의 신뢰도 자체가 흔들립니다.
부정 수강 탐지: 자리비움, 배속 악용, 다중 접속
사내 교육이나 인증 과정처럼 수료 여부가 중요한 경우, 아래와 같은 부정 수강 패턴을 탐지하는 로직이 필요합니다.
- 일정 시간 동안 화면 비활성(다른 탭 이동, 최소화)이 감지되면 시청 시간에서 제외
- 같은 계정으로 동시에 여러 기기에서 접속 시 알림 또는 접속 제한
- 비정상적으로 빠른 진도율 상승(예: 1시간 강의를 5분에 완료)을 이상 패턴으로 표시
이 기능은 처음부터 완벽하게 만들기보다, 운영 데이터를 보며 점진적으로 탐지 규칙을 추가하는 방식이 현실적입니다.
평가·재응시 데이터 구조
시험 기능이 있다면 단순히 “최종 점수”만 저장해서는 부족합니다.
- 응시마다 별도 레코드로 저장(1차 응시 60점, 2차 응시 85점 등 이력 보존)
- 재응시 가능 횟수·대기 시간을 강의별로 다르게 설정할 수 있도록 정책 테이블 분리
- 문제은행 방식으로 출제한다면, 응시별로 실제 출제된 문항을 기록해 이후 이의 제기에 대응
이력을 남기지 않으면 “왜 재응시가 안 되냐”, “이 점수가 맞냐”는 문의에 근거를 제시할 수 없어 CS 부담이 커집니다.
수료증 발급과 인사·자격 시스템 연동
사내 교육이라면 수료 데이터가 인사 시스템과 연동되어야 하는 경우가 많습니다. 이때 필요한 설계는 다음과 같습니다.
- 수료 조건(진도율, 시험 점수, 과제 제출)을 조합해 자동으로 수료 여부를 판정
- 수료증 발급 시점의 데이터를 스냅샷으로 별도 보관해, 이후 정책이 바뀌어도 과거 수료 기록은 그대로 유지
- 인사 시스템에 수료 정보를 전달할 API 또는 배치 연동 설계
이 연동은 ERP/CRM 실시간 API 연동 가이드에서 다루는 원칙(상태값 정규화, 배치 동기화)을 그대로 적용할 수 있습니다.
동영상 스트리밍과 무단 배포 방지
유료 강의라면 영상 콘텐츠 보호도 데이터 설계와 함께 고려해야 합니다.
워터마크 — 수강생 정보를 영상에 동적으로 삽입해 캡처·배포 시 추적 가능하게 함.
스트리밍 토큰 — 영상 URL을 시간 제한이 있는 토큰으로 발급해, URL만 알아도 재생할 수 없도록 설계.
동시 재생 제한 — 같은 계정으로 여러 기기에서 동시 재생을 감지해 자동 차단.
이 부분은 교육 VOD 캡처 방지·수강률 추적 가이드에서 더 구체적으로 다룹니다.
트래픽이 몰리는 시점(집체 교육 마감일)의 성능 대응
사내 교육은 마감일 직전에 접속이 몰리는 특성이 있습니다. 이때 진도 기록 API에 부하가 집중되면 시청 기록이 누락되는 문제가 생길 수 있습니다.
- 진도 기록은 매초 저장하지 않고, 일정 주기로 배치 저장해 DB 쓰기 부담을 줄임
- 마감일 임박 알림을 미리 발송해 접속이 특정 시간에 몰리지 않도록 유도
- 피크 시간대 대비 서버 확장 계획을 사전에 준비
설계 상담이 필요하다면 무료 견적요청에서 현재 교육 규모와 요구사항을 알려주시면 적합한 구조를 제안해 드립니다.
수강생 대시보드에 필요한 최소 정보
수강생이 자주 확인하는 화면일수록 조회 성능이 중요합니다. 대시보드는 아래 정보를 중심으로 구성합니다.
- 현재 수강 중인 강의별 진도율과 다음에 볼 차시
- 다가오는 시험 일정과 재응시 가능 여부
- 수료까지 남은 조건(진도율 몇 % 추가 필요, 과제 제출 여부)
이 데이터를 매번 실시간으로 집계하면 트래픽이 몰릴 때 부담이 커지므로, 진도 변경 시점에 요약 테이블을 함께 갱신해두면 대시보드 조회 속도를 안정적으로 유지할 수 있습니다.
자주 묻는 질문 (FAQ)
기존 강의 영상을 그대로 옮겨서 쓸 수 있나요? +
영상 파일 자체는 재사용할 수 있지만, 스트리밍 보호와 진도 추적을 위해 재생 방식을 시스템에 맞게 재구성하는 작업이 필요합니다.
진도율 100%인데 실제로 안 봤다는 걸 어떻게 막나요? +
실제 시청 구간을 누적 기록하고 화면 비활성 감지, 비정상적인 진도 상승 패턴을 탐지하는 로직을 함께 설계하면 상당 부분 방지할 수 있습니다.
외부 인증기관에 수료 데이터를 제출해야 하는데 가능한가요? +
수료 시점의 데이터를 스냅샷으로 보관하고, 필요한 형식으로 내보내는 리포트 기능을 추가하면 대응할 수 있습니다.
재응시 정책은 강의마다 다르게 설정할 수 있나요? +
가능합니다. 재응시 횟수·대기시간을 강의별 정책 테이블로 분리해 설계하면 강의마다 다른 기준을 적용할 수 있습니다.
개발 기간은 얼마나 걸리나요? +
진도 추적, 시험, 수료증 발급까지 포함한 핵심 기능 기준으로 8~12주 정도가 일반적이며, 영상 보호·인사 연동까지 포함하면 더 길어질 수 있습니다.