GSoC 2026·1주차 — 학생이 ‘과제 열기’를 클릭하면 어떻게 될까?
Source: Dev.to
CircuitVerse에서 LMS–LTI 통합 테스트
조용한 통합을 디버깅하는 뒷이야기 — 그리고 존재하는 코드와 실제 동작하는 코드 사이의 차이를 깨달은 이야기.
프로젝트: CircuitVerse · 주차: 1 · 초점: LMS–LTI 과제 워크플로우 테스트 및 수정
TL;DR
첫 주에 LMS–LTI 전체 흐름을 처음부터 끝까지 테스트했습니다 — 학생이 Canvas에서 과제를 열고, CircuitVerse에서 회로를 만들고, 교사가 다시 Canvas에서 채점하는 과정입니다. 겉으로는 기능이 완전해 보였지만, 실제로는 서로 연결된 네 가지 버그가 조용히 핸드오프를 깨뜨리고 있었습니다. 각각을 어떻게 찾고 고쳤는지 아래에 정리했습니다.
증상 근본 원인 해결 방법
1
학생이 로그인 페이지로 이동
런치 후 세션이 설정되지 않음
sign_in(@user) 추가
2
학생이 잘못된 페이지로 이동
리다이렉트가 프로젝트가 아닌 그룹 홈을 가리킴
user_project_path 로 리다이렉트
3
교사가 채점 불가
마감 시간이 지나야 채점 폼이 표시됨
테스트를 위해 과거 마감 허용
4
Canvas에 점수가 0으로 표시
기능 플래그 비활성, LTI 세션 누락, maxPoints = 0
플래그 활성화, Canvas 통해 런치, 최대 점수 설정
먼저, 배경: LMS–LTI란 무엇인가?
LMS는 Learning Management System(학습 관리 시스템)의 약자입니다 — 대학에서 강좌를 관리하고, 과제를 게시하며, 성적을 추적하는 소프트웨어를 말합니다. Canvas, Moodle, Google Classroom, Blackboard 등이 대표적인 예시입니다.
LTI는 Learning Tools Interoperability(학습 도구 상호 운용성)의 약자이며, LMS가 CircuitVerse와 같은 외부 도구와 통신할 수 있게 해 주는 산업 표준입니다. 이론적으로는:
- 학생이 Canvas 안의 링크를 클릭하면 바로 CircuitVerse로 이동하고, 신원은 이미 확인된 상태다.
- 교사는 Canvas에서 바로 채점을 한다.
- 점수가 자동으로 되돌아온다.
실제로 이 매끄러운 핸드오프를 구현하는 것이 가장 까다로운 부분입니다.
테스트 환경 설정
실제 테스트를 진행하기 전에 두 시스템을 나란히 띄우고 서로 통신하도록 해야 했습니다. 그래서 다음을 구축했습니다:
- 로컬 Canvas 인스턴스와 로컬 CircuitVerse 인스턴스.
- Canvas에 테스트 학생과 테스트 교사를 등록한 테스트 코스.
- CircuitVerse를 가리키도록 설정한 LTI 과제.
모든 준비가 끝난 뒤, 학생 계정으로 로그인하고 과제 링크를 클릭했습니다.
버그 1: 학생이 로그인 페이지로 이동
첫 번째 스크린샷이 모든 상황을 보여줍니다. 과제 페이지가 아니라 /users/sign_in — CircuitVerse의 기본 로그인 페이지로 리다이렉트되었습니다.
LTI 핸드오프 자체는 정상적으로 작동했습니다. Canvas는 다음 정보를 모두 CircuitVerse에 전달했죠:
- 누구가 학생인지
- 어떤 코스에 속했는지
- 어떤 과제를 열었는지
CircuitVerse는 이 정보를 읽어 일치하는 사용자를 찾고, 학생이 채울 빈 프로젝트까지 생성했습니다. 하지만 학생이 이제 로그인했다는 사실을 인증 시스템에 알리지 않았습니다.
호텔에 비유하자면, 프런트 데스크가 예약을 확인하고 신분증을 확인했지만, 방 열쇠를 실제로 활성화하지 않은 상황과 같습니다. 모든 문이 “접근 거부”라고 외칩니다.
수정은 학생 LTI 런치를 처리하는 코드에 한 줄을 추가하는 것이었습니다:
sign_in(@user)
전체 화면 모드 진입
전체 화면 모드 종료
이 줄을 과제 화면을 보여주기 전에 삽입하면 세션이 올바르게 설정됩니다. 이제 학생은 인증된 상태로 바로 과제로 이동합니다.
버그 2: 학생이 잘못된 페이지로 이동
인증 문제는 해결됐지만, 이제 학생은 과제 대신 코스 개요 페이지에 머물게 됩니다. LTI 핸드오프 중에 CircuitVerse가 표시하는 “잠시 기다려 주세요” 페이지가 그룹 홈 페이지를 새 탭으로 열었기 때문입니다. 학생 개별 작업이 아니라 그룹 전체 페이지였습니다.
해결은 개념적으로 간단했습니다: 자동 생성된 프로젝트 페이지로 바로 리다이렉트합니다.
# Before: 학생을 코스 홈 페이지로 보냈음
group_path(@group)
# After: 학생을 바로 자신의 프로젝트로 보냄
user_project_path(@user, @project)
전체 화면 모드 진입
전체 화면 모드 종료
이제 새 탭이 열리면 학생은 자신의 프로젝트 페이지에 도착하고, “Launch Simulator”(시뮬레이터 실행) 버튼이 눈에 띕니다.
버그 3: 교사가 채점할 수 없음
학생 흐름이 정상화되자 교사 입장에서 테스트했습니다. 교사는 Canvas에서 동일한 LTI 과제를 실행하고, 과제 관리 페이지에 도착해 학생이 만든 회로 미리보기를 볼 수 있었습니다. 하지만 채점 폼이 전혀 보이지 않았습니다.
코드를 살펴보니, 채점 폼은 과제