PlaynPlay
PlaynPlay

진도·출결 데이터 설계

Callback URL 보고로
진도율과 완강을 계산하는 방법

PlaynPlay 플레이어는 권한 확인, 재생 시작·진행·종료, 오프라인 시청, 다운로드, 북마크 시점마다 고객사 서버로 JSON을 보냅니다. 이 가이드는 각 보고를 LMS의 어떤 기록으로 남기고, 진도율과 완강을 어떤 값으로 계산할지 설계 관점에서 정리했습니다.

최종 수정

진도 데이터를 표현한 PlaynPlay 일러스트
8 Events

이벤트마다 LMS에 남길 기록

모든 보고는 콘솔에 등록한 Callback URL 하나로 POST 요청이 오고 type 값으로 종류를 가릅니다. 요청마다 App ID, 사용자 ID, 미디어 URL, 실행할 때 넣은 userData가 함께 실려 옵니다.

이벤트 보내는 시점 LMS에 남길 기록
CheckAccessRights 라이선스를 발급할 때 재생·다운로드 시도 이력. 기기 ID(deviceId)와 다운로드 콘텐츠 여부(offline)는 이 보고에만 있습니다.
NotifyPlaybackStatus 재생 시작과 종료 세션의 시작(Started)·종료(Stopped)와 생성 시각(createdAt)
NotifyPlaybackProgress 재생 중 콘솔의 Interval마다 세션의 현재 위치, 전체 길이, 재생 시간, 시청 시간
NotifyPlaybackFinish 재생 종료 세션의 마지막 위치, 재생·시청 시간, 종료 원인(reason)
NotifyOfflinePlaybackLog 오프라인이라 못 보낸 보고를 온라인 연결 후 세션 목록(items). 세션마다 시작·종료 시간, 위치, 재생·시청 시간, 종료 원인(finishReason)
NotifyDownloadStatus 다운로드를 시작, 완료, 중단하거나 실패했을 때 다운로드 이력과 생성 시각
GetBookmarks 플레이어에 북마크 데이터가 필요할 때 저장할 값은 없고, 고객사 DB의 북마크 목록을 응답으로 돌려줍니다.
UpdateBookmarks 북마크 데이터가 변경되면 바뀐 뒤의 북마크 목록(위치, 제목)

필드 정의 원문은 Callback URL 문서, 전체 연동 구성은 Developers에서 확인하세요.

Time Fields

위치, 재생 시간, 시청 시간은 답하는 질문이 다릅니다

진행 보고와 종료 보고에는 시간 값이 네 개 들어 있습니다. 어느 값으로 진도를 셀지 먼저 정해야 학습자 화면과 이수 기준이 어긋나지 않습니다.

  • position · duration

    현재 위치와 전체 길이

    단위는 밀리초입니다. 탐색을 허용한 영상은 위치가 앞뒤로 움직이므로, 어디까지 봤는지의 근거로 쓰려면 실행할 때 탐색 금지(seekable: false)를 함께 거는 편이 안전합니다.

  • playTime

    재생 시간: 영상이 흐른 양

    비디오 시간 기준입니다. 2배속으로 1초를 재생하면 2초로 셉니다. 영상 분량 중 얼마를 재생했는지 볼 때 씁니다.

  • watchTime

    시청 시간: 학습자가 들인 시간

    실제 시간 기준입니다. 2배속으로 1초를 재생하면 1초입니다. 학습 시간을 실제 경과 시간으로 인정하는 과정이라면 이 값을 씁니다.

  • sessionId

    값은 세션마다 따로 옵니다

    progress는 현재 세션의 진행 상태입니다. 같은 차시를 여러 번 열면 sessionId가 다른 보고가 섞여 올 수 있으므로 sessionId별로 저장한 뒤 차시 단위로 합산합니다.

  • Unit Check

    첫 테스트에서 단위 확정

    playTime·watchTime과 오프라인 로그의 startedAt·stoppedAt은 문서에 단위가 없습니다. createdAt과 expiresOn은 Unix epoch time입니다. 1분짜리 테스트 재생 값을 받아 자릿수로 단위를 확정하세요.

  • Interval

    보고 주기와 생략 규칙

    진행 보고 주기는 콘솔의 Interval로 정합니다. Android·iOS SDK는 2026년 8월 25일 배포본부터 진행 상태에 변화가 없으면 진행 보고를 건너뜁니다. 보고 공백을 이탈로 보지 말고 종료는 Stopped와 종료 보고로 판단하세요.

Finish · Offline · Download

종료 원인과 오프라인·다운로드·북마크 기록

종료 보고와 오프라인 로그는 같은 세 가지 종료 원인을 씁니다. 원인마다 LMS가 할 일을 정해 두세요.

  • Ended

    끝까지 재생된 뒤 종료

    완강 후보입니다. 탐색을 허용한 영상은 끝부분으로 옮겨 마친 경우와 구분하도록 재생 시간 합계를 함께 봅니다.

  • Error

    오류로 재생 종료

    학습자가 멈춘 것이 아니므로 그때까지의 진도는 인정하고, 재수강 안내와 장애 확인 목록에 올립니다.

  • UserExited

    사용자가 재생을 끝냄

    다른 영상으로 옮기거나 플레이어를 닫는 등 사용자가 직접 제어한 종료입니다. 마지막 위치를 이어보기 값으로 저장합니다.

  • Offline

    오프라인 시청 기록

    재생 시작이나 종료 중 한쪽이라도 오프라인이었다면, 온라인에 연결될 때 기기에 저장한 기록을 세션 목록으로 보냅니다. Android·iOS SDK는 2025년 6월 24일 배포본, PC용 PlaynPlay App은 1.0.26부터 지원합니다.

    PC 플랫폼 보기
  • Download

    다운로드는 시청과 분리

    시작, 완료, 취소, 실패 네 가지 상태가 옵니다. 내려받았다고 본 것은 아니므로 진도와 다른 표에 둡니다. 다운로드 콘텐츠의 권한 확인은 offline 값이 true로 옵니다.

  • Bookmark

    북마크를 고객사 DB에

    실행할 때 useBookmarkCallback을 true로 두면 두 북마크 이벤트로 고객사 DB와 주고받고, false면 PlaynPlay 서비스의 저장 방식을 씁니다. 위치(pos)는 초 단위이고 제목이 없으면 Untitled가 됩니다.

고객사 앱에 넣은 SDK도 같은 세 가지 종료 원인을 onPlaybackFinish 이벤트로 받습니다. 앱 화면 처리는 Android와 iOS 안내를 참고하세요.

Responses

서버 응답으로 재생을 멈추는 두 지점

상태·종료·오프라인·다운로드·북마크 업데이트 보고는 result에 Ok만 돌려주고, 북마크 제공은 목록을 함께 돌려줍니다. 재생 허용 여부가 바뀌는 응답은 접근 권한 검사와 진행 보고 두 곳입니다.

응답 의미 LMS에서 쓰는 경우
권한 검사 Ok 접근 권한 있음. 접근 만료 일시(expiresOn)를 함께 보냅니다. 수강 종료일을 그대로 내려줌
권한 검사 Expired 접근 권한 만료됨 수강 기간이 끝난 학습자
권한 검사 NoRights 접근 권한 없음 미등록, 환불, 권한 회수
권한 검사 DeviceLimitExceeded 디바이스 제한 초과 고객사가 정한 기기 기준을 넘긴 경우
진행 보고 PlaybackLimitExceeded 재생 제한 초과(배수 제한, 재생 횟수 등) 고객사가 정한 배수 제한이나 재생 횟수 한도를 넘은 경우

앱과 PC 커스텀 페이지의 오류 목록에도 접근 권한 만료, 접근 권한 없음, 디바이스 제한 초과, 재생 제한 초과에 해당하는 항목이 있으니 응답마다 안내 문구를 짝지어 두세요.

LMS Questions

LMS 질문별로 보는 이벤트와 필드

운영자와 학습자가 실제로 묻는 질문을 기준으로 어느 보고의 어떤 값을 볼지 정리했습니다. 기준 숫자는 고객사 학사 규정으로 정합니다.

LMS 질문 이벤트·필드 판단 방법
이 학생이 끝까지 봤나? 종료 보고의 reason, 세션별 playTime Ended가 있고 차시 진도율이 기준 이상이면 완강
몇 %를 봤나? 진행·종료 보고의 playTime, duration 세션별 playTime 합 ÷ duration, 1을 넘으면 1로 처리
실제로 얼마나 공부했나? watchTime 세션별 watchTime 합
배속으로 봤나? playTime, watchTime playTime ÷ watchTime이 1보다 크면 배속 시청
오늘 출석했나? 상태 보고 Started의 createdAt, 세션 watchTime 그날 시작한 세션의 시청 시간이 출석 기준 이상
왜 중간에 끊겼나? 종료 원인 reason, finishReason Error는 장애 확인, UserExited는 중도 종료
어디서부터 이어 보나? 마지막 보고의 position 밀리초를 초로 바꿔 다음 실행 때 startTime으로 넘기고, syncedAt을 붙여 기기에 남은 오프라인 위치와 더 최근 값을 고르게 함
이동 중에 본 강의도 반영됐나? 오프라인 로그 items 온라인 세션과 같은 표에 넣어 합산
어느 기기로 열었나? 권한 검사의 deviceId 세션별 기기가 필요하면 실행 때 userData에 기기 정보를 넣음
Recommended Design

진도율과 완강 계산 권장 순서

문서의 필드 정의를 바탕으로 한 설계 권장안입니다. 인정 기준 숫자는 고객사 규정에 맞춰 바꿔 쓰세요.

  1. 식별값부터 설계

    실행할 때 userData에 수강 신청 ID와 차시 ID를 넣습니다. 같은 영상을 여러 과정에 쓰면 미디어 URL만으로는 어느 과정의 진도인지 가를 수 없습니다.

  2. 세션 단위로 저장

    sessionId를 키로 시작·종료 시각, 마지막 진행 값, 종료 원인을 한 행에 모읍니다. 같은 세션의 진행 보고는 마지막 값으로 덮어쓰고, 같은 sessionId가 다시 와도 한 번만 반영되게 합니다.

  3. 차시 단위로 합산

    진도율은 세션별 playTime 합을 duration으로 나누고, 학습 시간은 watchTime 합으로 둡니다. 같은 구간을 반복해 진도율이 부풀지 않게 하려면 탐색을 막은 영상에서 최대 position을 함께 씁니다.

  4. 완강 판정

    진도율 기준 충족과 Ended 종료를 함께 요구합니다. Error로 끊긴 세션의 학습자에게는 이어보기를 안내합니다.

  5. 정책 응답 연결

    배수 제한이나 재생 횟수 한도를 넘으면 진행 보고에 PlaybackLimitExceeded로 답합니다. 배수는 세션별 playTime 합을 duration과 비교해 판정할 수 있습니다. 플레이어는 응답에 따라 동작하므로 무거운 집계는 따로 돌리고 응답은 바로 돌려줍니다.

업종별 운영 예시는 온라인 교육·LMS, 도입 단계와 테스트 시나리오는 도입 실행 가이드, 용어 정의는 용어집에서 확인하세요.

Get Started

PlaynPlay 도입을 위한
기술적 지원과 서비스를 제공합니다.

제품 문의부터 데모 시연까지, 모든 지원을 위해 세일즈 및 기술 지원 팀이 준비되어 있습니다.

  • 제품 및 도입 문의

    도입 범위, 일정, 견적을 상담합니다. 서비스 형태와 사용자 규모를 알려주시면 맞는 연동 방식과 보안 설정을 제안합니다.

  • Trial 신청

    PlaynPlay의 기능을 먼저 테스트해 보세요. 트라이얼 기간 동안 귀사의 제품과 PlaynPlay를 연동하고 성능과 기능을 직접 검증할 수 있습니다.

  • PlaynPlay 기술 문의

    SDK 연동, Callback URL 설계, DRM 패키징 중에 생기는 질문에 기술팀이 답합니다. 공개된 개발 문서와 샘플 프로젝트도 함께 확인하세요.