LMS 플랫폼 고도화(하이러닝·뉴쎔), 2022.07 ~ 2024.07 설계와 구현
EBS 문항과 자체 제작 문항을 같은 분류체계로 묶어 학년·단원별 문제집 출제 구조 구현
EBS에서 동기화한 문항 테이블은 그대로 두고 문제집 쪽 테이블을 따로 두어, 교사가 학년과 단원을 고르면 직접, 선택, 랜덤, AI 추천 방식으로 문제집을 만들 수 있게 함
문제와 배경
- 뉴쎔 LMS를 바탕으로 하이러닝을 구축하면서, 뉴쎔에 없던 콘텐츠 기능을 외부 AI 업체, EBS와 연계해 새로 만들어야 했습니다.
- EBS 문항은 동기화로 계속 갱신됐고, 교사는 그 문항과 직접 만든 문항으로 학년과 단원에 맞는 문제집을 만들어야 했습니다.
결과
- EBS 동기화 테이블과 문제집 테이블을 나눠, EBS 데이터를 다시 반영해도 교사가 만든 문제집과 문항의 연결이 유지되게 했습니다.
- 직접, 선택, 랜덤, AI 추천, AI 출제를 하나의 등록 흐름에서 유형별로 처리했습니다.
- 문제집이 누적 약 189만 건 사용돼 전체 콘텐츠 사용(클릭 이력 기준 약 219만 건)의 86%를 차지했습니다.
- 새 영어 분류체계를 같은 구조에 반영했습니다.
설계와 구현
학년과 단원으로 문항을 찾는 분류체계
- 교육과정마다 분류 단계가 다르고, 문항이 연결되는 단계도 초등과 중등은 중분류, 고교는 소분류로 다릅니다. 그래서 쿼리에서 교육과정에 따라 비교하는 컬럼을 바꿨습니다.
- “중 1,2”처럼 두 학년에 걸친 분류가 빠지지 않게, 같은 학년 그룹의 학년 ID를 먼저 모아 함께 조회했습니다.
- EBS 원본 분류는 그대로 두고, 하이러닝에서만 쓰는 교육과정과 분류체계를 담은 분류 테이블을 따로 두었습니다. 원본을 바꾸지 않고 하이러닝 전용 분류체계를 쓰기로 되어 있었기 때문입니다.
- 분류 데이터는 행마다 상위 단계 ID를 컬럼에 펼쳐 둔 구조라, 상위 ID를 재귀로 따라가지 않고 조건 하나로 아래 단원을 찾습니다.
테이블 구성
- 직접 만든 문항도 EBS와 같은 문항 테이블에 저장하고 출처 컬럼으로 구분해, 선택, 랜덤, AI 추천 출제가 같은 조회 쿼리를 씁니다. 자체 문항 번호는 EBS에서 오는 문항 번호와 형식을 맞추려고 DB 함수에서 만들었습니다.
- 문제집 쪽 테이블은 EBS 동기화가 건드리지 않고, 동기화는 문항을 논리 삭제만 합니다. 그래서 EBS 데이터를 다시 반영해도 문제집과 문항의 연결이 끊기지 않습니다.
- 문제집-분류 연결에는 만들 때의 개편안 번호를 함께 저장했습니다.
- 문항 하나가 여러 단원에 연결될 수 있어서(문항-분류 연결은 다대다), 문제집-문항 연결에 “어느 단원으로 출제했는지”를 따로 저장했습니다. 문제집 화면은 이 값으로 단원 이름을 붙여, 교사가 고른 단원 그대로 보여 줍니다.
- AI 출제는 학생마다 다른 문항을 받으므로, 문제집-문항 연결에 학생을 함께 저장했습니다.
출제 유형별 등록 흐름
- 직접 제작만 문항 테이블에 새 문항을 쓰고, 나머지 유형은 기존 문항을 골라 문제집-문항 연결에만 저장합니다.
- AI 출제는 문제집을 만들 때 문항을 저장하지 않고, 학생이 문항을 풀고 다음으로 넘어갈 때마다 외부 AI가 고른 다음 문항을 학생별로 저장합니다.
- 출제 화면에는 단원마다 실제로 고를 수 있는 문항 수만 보여 줘, 빈 문제집이 만들어지거나 형성평가 문항이 일반 문제집에 섞이지 않게 했습니다.
AI 추천 문항을 출제 범위와 대조
- 외부 AI가 준 문항 ID 목록에는 교사가 고른 범위 밖의 문항이 섞일 수 있었습니다. 예를 들어 중1 단원을 골랐는데 중2 문항이 오는 경우입니다.
- 그래서 받은 문항 ID를 선택, 랜덤 출제와 같은 문항 조회 쿼리로 내부 문항 테이블과 대조했습니다. 교사가 고른 단원(고교는 소분류, 그 밖에는 중분류)과 난이도에 맞고, 사용 중이며, 형성평가 문항이 아닌 것만 남깁니다.
- 조건 밖의 문항은 문제집에 저장하기 전에 목록에서 빠집니다.
같은 문항을 받은 학생의 문항이 저장되지 않던 문제
- 시연 중 AI 출제 문제집에서 학생이 다음 문항으로 넘어갈 때 응시 화면이 멈추는 문제가 처음 발견됐습니다. 범위 대조를 거치는 AI 추천과 달리, AI 출제는 학생마다 문항을 따로 저장합니다.
- AI 출제는 학생별로 문항을 저장하는데, 저장의 유니크 범위와 충돌 조건이 (문제집, 문항)이었고 충돌하면 기존 행을 갱신(
DO UPDATE)했습니다. 외부 AI가 고른 문항이 다른 학생에게 이미 배정된 문항이면 앞 학생의 행만 갱신되고 뒤 학생의 행은 생기지 않아, 화면은 문항을 받지 못한 채 멈췄습니다. - 재현 경로를 찾아 유니크 범위와 충돌 조건에 학생 식별자를 넣었습니다(
ON CONFLICT (문제집, 문항, 학생)). 수정 뒤 QA를 통과했고, 같은 증상은 다시 나타나지 않았습니다.
남은 한계와 해결 방향
- EBS가 문항을 내리면 배포한 문제집에서도 그 문항이 빠지고, 문제집에 저장한 문항 수와 실제 문항 수가 달라질 수 있습니다.
- 다시 설계한다면 응시 기록으로 나눠 처리하겠습니다. 응시 기록이 있는 문제집은 학생이 응시한 문항과 결과 화면이 서로 맞아야 하므로 문항을 유지하고, 응시 전 문제집만 교체를 제안합니다. 교체 문항은 문제집-문항 연결에 저장해 둔 출제 단원으로 찾습니다.