LMS 마이페이지
학습관리시스템(LMS)의 학생·교수자용 통합 대시보드입니다. 학생은 할 일과 학습 현황을, 교수자는 채점 현황과 학습 부진 신호를 한 화면에서 확인합니다.
배경
기존 마이페이지는 과목 목록만 제공했습니다. 이를 학생의 할 일·학습 현황과 교수자의 채점·학습 부진 신호를 함께 보여주는 대시보드로 다시 구성했습니다. 출시 후에는 스마트알림과 할 일이 같은 학습요소를 해석하도록 데이터 구조를 맞추고, 대학마다 달랐던 지연·권한·역할 중복 문제를 해결하고 있습니다.
프로젝트 근거 · 2026.09
2,000명 · ≤2분
3개 과제 동시 마감 알림 검증
약 296만 건
6시간 재계산 병목 경로 추적
공용 → 전용
시간 민감 알림의 큐·워커 격리
알림 수치는 성균관대 기준 초기 부하 검증 결과다. 약 296만 건은 개선 처리량이 아니라 운영 병목에서 관측한 작업 규모다.
출시부터 운영까지
출시 후에는 화면 밖의 데이터 경계를 고쳤습니다.
- 2024.12—2025.03
역할 기반 대시보드의 뼈대
학생·교수자 API와 12종 화면, Global LTI, 계정 단위 개인화 설정을 구현했다. API 응답 타입 검증과 실제 장애를 재현하는 Jest 테스트를 더해 화면 오류가 데이터 계약에서 다시 생기지 않도록 했다.
TI-6517 · 6571—6573 · 6679 · 6753 · 7029 · 7034 - 2025.01—2026.04
할 일과 스마트알림의 공통 데이터 경로
알림 예약·설정·템플릿과 Course Component를 공통 기준으로 정리하고 마이그레이션했다. 다른 장시간 Job에 알림이 밀린 사례 이후에는 스마트알림 전용 큐와 PM2 워커를 분리해 실행 경합의 영향을 줄였다.
TI-6356 · 6479 · 6677—6678 · 6984 · 7007 · 7027 - 2025.11—2026.02
공지 공개 조건과 교수자 행동 연결
Canvas 전체 공지를 마이페이지에 연결하면서 공개 예약 글은 시각과 개수 집계 모두에서 제외했다. 교수자 화면에서는 위험학생 신호를 확인한 뒤 메시지 발송으로 이어지는 동작을 추가했다.
TI-7150 · 7982 · 8000 - 2026.04—2026.08
이벤트 양을 줄이고 새 학습유형을 확장
출결 상태가 변하지 않은 학생·과목의 이벤트를 억제하고, 처리 대상 컴포넌트 선필터와 수강 섹션 파생 캐시를 추가했다. 이후 XN 퀴즈를 할 일·타임라인·평가와 알림 발송/제외 조건에 같은 방식으로 연결했다.
LXCCOP-1068 · 1073 · XQ-388 · 389 - 2026.09 · 검토 중
권한과 이중 역할을 운영 규칙으로 되돌리기
관리자의 스마트알림 메뉴 권한과, 청강생에서 학생으로 전환된 사용자의 이중 Enrollment·배지 오표시를 분석하고 있다. 단순 UI 예외가 아니라 권한 설정과 DB 상태 전이의 책임을 어디에 둘지 확인하는 단계다.
LXCCOP-1876 · 1913
구조
ROLE-AWARE DATA FLOW
역할과 학습 맥락을 화면까지 보존하는 흐름
Canvas의 역할·과목 데이터를 API에서 분기하고, 할 일과 스마트알림이 같은 학습요소 모델을 기준으로 동작합니다.
기존 LMS 위에 구축
Canvas LMS와 LearningX 위에 새 대시보드 모듈을 통합했습니다. 기존 데이터 흐름과 개발 규칙을 유지해 다른 기능에 미치는 영향을 제한했습니다.
한 계정의 두 역할
학생이면서 교수 조교인 사용자를 위해 역할별 화면과 데이터를 분리했습니다. 역할을 바꿀 때 각 화면이 독립된 API 호출과 필터 상태를 사용합니다.
이벤트 기반 데이터 수집
과제 제출과 성적 입력 같은 학습활동 변경을 큐 워커가 감지해 대시보드 전용 테이블에 반영합니다. 워커 프로세스는 PM2로 관리합니다.
구현한 내용
기능별 구현 범위상세 내용
대시보드 API 설계 및 구현
프론트엔드 뷰 구현
스마트알림·할 일 데이터 경로 고도화
문제 해결 사례
공유 큐에서 밀리던 스마트알림을 독립 실행 경로로
문제 상황 대학 운영 환경에서 다른 장시간 Job이 공용 큐를 점유하면 스마트알림이 제시간에 발송되지 않았다. 이후 로그 분석에서는 한 고객 환경의 출결 상태 이력 재계산이 약 296만 건까지 커지는 경로도 확인됐다.
문제 정의 알림 생성 로직만 빠르게 만드는 문제가 아니라, 불필요한 이벤트가 과도하게 생기고 시간 민감 작업이 다른 Job과 실행 자원을 공유하는 구조가 핵심이었다.
가설 실행 경로를 먼저 격리하고, 변경이 없는 상태와 지원하지 않는 컴포넌트를 앞단에서 제거하면 운영 지연을 더 작은 단위로 통제할 수 있다고 봤다.
행동 스마트알림 전용 큐와 PM2 워커를 분리했다. 이후 학생×과목 단위의 미변경 이벤트를 억제하고, 처리 가능한 학습유형 선필터·수강 섹션 캐시·병목 구간 누적 로깅과 회귀 테스트를 추가했다.
성과 초기 부하 검증에서 3개 과제·2,000명 대상의 동시 마감 알림이 2분 내 도착했다. 운영 단계에서는 시간 민감 작업이 공용 큐에 밀리는 경로를 분리하고, 알림 재생성 전에 불필요한 후속 처리를 줄였다.
회고 현재 이벤트 판정 단위는 여전히 학생×과목이다. 학습요소 단위 증분 처리와 처리 시간·지연 p95 대시보드를 다음 단계의 명확한 과제로 남겼다.
다수 API 호출 관리와 역할별 데이터 로딩 최적화
문제 상황 한 화면에서 학기, 과목, 할 일, 공지, 게시물, 학습 부진과 평가 현황을 가져와야 했고 학생·교수자 역할마다 필요한 데이터가 달랐다.
문제 정의 모든 코드와 데이터를 한꺼번에 불러오면 역할 전환과 필터 상태가 얽히고, 학기를 바꿀 때 이전 조건이 남을 수 있었다.
가설 역할별 화면과 상태를 분리하고 현재 역할의 코드·데이터만 가져오면 불필요한 로딩과 상태 간섭을 줄일 수 있다고 봤다.
행동 역할별 화면을 React.lazy로 나누고 필터와 API 호출을 분리했다. 학기 변경 시 필터를 초기화하고 사용자 설정은 계정 단위로 저장했다.
성과 선택한 역할의 코드와 데이터만 불러오고, 학기와 역할 변화에 맞춰 관련 상태를 초기화하는 구조를 만들었다.
회고 구조 개선은 설명할 수 있지만 로딩 시간과 요청 수의 전후 측정은 남아 있지 않다. 성능 성과로 주장하기보다 책임 분리 사례로 제시하는 편이 정확하다.
2주 안정화 기간의 QA 항목 우선순위화
문제 상황 3개월 동안 12종의 화면과 API를 개발한 뒤, 2주 안정화 기간에 132개 QA 항목이 접수됐다.
문제 정의 항목 수 자체보다 데이터 정합성 오류와 기능·UX 이슈가 섞여 있어 처리 순서가 불명확한 것이 문제였다.
가설 데이터 정합성 → 기능 → UX 순으로 분류하면 사용자 영향이 큰 오류부터 닫고 남은 작업을 예측할 수 있다고 봤다.
행동 항목을 유형별로 묶고 우선순위를 정해 기획·QA와 처리 순서를 공유했다. 기존 코드의 관례와 데이터 흐름도 먼저 확인한 뒤 수정했다.
성과 2주 안정화 기간의 작업을 우선순위에 따라 처리했다. 132개라는 수치는 품질 성과가 아니라 조정한 작업 범위를 뜻한다.
회고 종료 후 Post-Mortem에 재작업 원인과 다음 검증 항목을 기록했다. 이후 프로젝트에서는 QA 전에 데이터 흐름과 예외 상태를 먼저 점검하는 절차로 반영했다.
LTI iframe 환경에서의 UX 제약 극복
문제 상황 마이페이지는 Canvas LMS의 Global LTI iframe에서 렌더링돼 콘텐츠 높이, 모달 위치와 스크롤이 부모 페이지와 어긋났다.
문제 정의 자식 화면만 수정해서는 부모 문서의 높이와 스크롤 위치를 알 수 없고, LMS 내부와 외부 임베딩의 부모 DOM도 달랐다.
가설 부모와 자식이 높이·스크롤 정보를 메시지로 교환하면 두 실행 환경에서 같은 화면 동작을 만들 수 있다고 봤다.
행동 window.parent.postMessage로 콘텐츠 높이를 전달하고 부모 스크롤을 바탕으로 모달을 배치했다. 두 부모 구조의 수신 처리도 각각 구성했다.
성과 콘텐츠 잘림과 모달 위치 문제를 줄이고 LMS 내부·외부 임베딩을 모두 지원했다.
회고 정성적 동작 확인만 남아 있다. 브라우저·해상도별 회귀 테스트와 오류 건수 전후를 기록하면 더 설득력 있는 사례가 된다.
회고
기존 시스템의 경계를 먼저 읽었습니다. 새 구조를 덧붙이기 전에 데이터 흐름과 기존 관례를 확인해 변경 범위와 회귀 지점을 정했습니다.
132개 QA를 오류 영향으로 분류했습니다. 데이터 정합성과 기능 오류를 먼저 닫고, 이후 사용 흐름을 다듬는 순서를 기획·QA와 공유했습니다.
회고를 다음 프로젝트의 사전 점검으로 옮겼습니다. 재작업 원인을 Post-Mortem에 남기고 이후 설계 단계의 데이터 흐름·예외 상태 검토에 반영했습니다.