과제 제출도 Git처럼 버전으로,
줄 단위 코드 리뷰와 피드백 자동 추적
학생이 제출할 때마다 v1, v2 버전이 보존되고, 교수는 코드의 정확한 줄을 짚어 리뷰합니다.
다음 제출에서 지적받은 줄이 실제로 고쳐졌는지 Myers Diff와 AI 판정기가 실시간으로 추적합니다.
null일 때 방어 코드가 없고, 탐색 시작점이 root가 아니라 root.left로 고정되어 있습니다. 빈 트리 케이스에서 NullPointerException이 발생합니다.if (root == null) return null; 가드를 추가하고 searchRecursive(root, key)로 수정하여 문제를 정확히 해결했습니다.
스크롤을 내리면 코드 리뷰의 전 과정이 펼쳐집니다
단순히 파일만 올리고 끝나는 과제방이 아닙니다. 제출부터 자동 채점, 인라인 리뷰, 재제출 추적까지 실제 개발팀의 PR 워크플로우가 그대로 돌아갑니다.
파일·ZIP 또는 GitHub 커밋 제출과 즉시 격리 채점
학생이 소스 파일이나 GitHub 공개 저장소 커밋 SHA를 제출하면 v1 스냅샷이 생성됩니다.
동시에 네트워크가 차단된 Docker 컨테이너에서 공개·비공개 테스트 케이스를 자동 실행합니다.
줄 번호를 클릭해 남기는 정확한 코드 피드백
교수는 코드 뷰어 또는 Diff 화면에서 특정 줄(또는 Shift+클릭 범위)을 바로 선택해 코멘트를 남깁니다. 학생과 교수는 해당 줄 아래에서 스레드로 질의응답을 이어갈 수 있습니다.
피드백을 반영한 v2 재제출과 좌우 분할 Diff
이전 버전을 덮어쓰지 않고 v2, v3가 타임라인으로 쌓입니다.
좌우 분할(Split) 및 통합(Unified) Diff 뷰어로 어느 줄이 어떻게 고쳐졌는지 한눈에 대조합니다.
Myers Diff 줄 추적 + Gemini AI 해결 여부 판정
교수가 이전 코멘트를 일일이 다시 찾아볼 필요가 없습니다. 다른 줄에 코드가 추가되어 줄 번호가 밀려도 Myers Diff가 원래 코멘트 위치를 추적하고, AI가 실제 해결 여부를 한 번 더 검증합니다.
BinarySearchTree.java:24-26 (v1 코멘트) → v2의 25~26번 줄에서 수정 감지됨
root == null 예외 처리와 루트 탐색 인자가 실제로 수정되었음을 확인했습니다.프로그래밍 수업에 필요한 모든 도구를 하나로
단순 텍스트 비교를 넘어 알고리즘과 컨테이너 기술로 채점과 코드 리뷰를 자동화합니다.
변수명·주석·공백을 바꿔도 잡아내는 Winnowing 표절 검사
소스코드를 언어별 구조 토큰(AST/Lexer)으로 정규화한 뒤 k-gram 해시와 Winnowing 지문을 추출합니다. 교수가 배포한 뼈대 코드(Baseline)는 자동으로 제외하고 순수 학생 작성 영역만 나란히 하이라이트 비교합니다.
int studentSum = 0; ↔ int total_val = 0;
→ 정규화 토큰: [TYPE_INT, ID, ASSIGN, NUM] (동일 구조 판정)
네트워크 차단 Docker 격리 채점
제출된 Java·Python 코드는 외부 통신이 완전히 차단된 컨테이너에서 시간 제한(초)과 메모리 상한(MB) 안에 실행되어 무한 루프나 시스템 접근을 원천 방어합니다.
마감 직전 제출 집중도 & 성장 추이 통계
과제별 제출률, 미제출자 명단, 시간대별 제출 분포와 버전이 올라갈수록 상승하는 학생들의 테스트 통과율 추이를 실시간 차트로 시각화합니다.
GitHub 저장소 커밋 연동 & 8자리 초대 코드 수강 관리
파일 업로드뿐만 아니라 GitHub 공개 저장소 URL과 브랜치·커밋 SHA만 입력하면 소스 파일을 자동으로 가져와 버전을 생성합니다. 교수가 강의를 개설하면 즉시 발급되는 8자리 초대 코드로 학생들이 1초 만에 합류합니다.
지금 바로 SubmitHub를 시작해 보세요
교수 계정으로 강의를 개설하거나, 학생 계정으로 초대 코드를 입력해 버전 관리형 과제 제출과 줄 단위 코드 리뷰를 직접 경험할 수 있습니다.