Skip to content
← 작업으로
Platform · Full-stack

KUCODE

  • GitHub Analytics
  • e-Profile
  • Project Manager

Summary

고려대학교 정보대학의 학사 정보와 GitHub 활동을 연결한 개발 활동 분석 플랫폼입니다. 교수와 조교의 교과목별 활동 분석부터 학생 개인의 e-Profile과 포트폴리오 활용까지, 같은 개발 이력을 서로 다른 목적에 맞게 조회할 수 있도록 구축했습니다.

Role
프로젝트 총괄, PM (풀스택 개발, 운영 환경 구축)
Stack
Django, Vue.js, PostgreSQL, Docker Compose, Nginx, Gunicorn
Outcome
학사 정보와 GitHub 활동 통합, 교과 분석과 개인 e-Profile 구축, 포트폴리오 PDF 제공
GitHub 활동은 Compose 밖의 수집 API를 통해 Django로 들어오고, 학사 명부도 별도로 가져와 PostgreSQL에 저장합니다. Vue.js 화면의 조회 요청은 Nginx와 Django REST API를 거쳐 저장된 데이터를 읽습니다. 수집 경로와 조회 경로를 구분하며, 교과 분석과 학생 e-Profile을 제공하고 포트폴리오 PDF는 브라우저에서 생성합니다.
KUCODE 서비스 및 데이터 연동 구조

문제

GitHub에 남은 개발 이력, 수업과 개인의 경험으로 연결하려면

학생들이 작성한 코드와 협업 이력은 GitHub에 남지만, 여러 저장소에 흩어진 활동만으로는 어느 수업에서 어떤 프로젝트를 수행했는지 파악하기 어려웠습니다. 교수와 조교는 교과목별로 학생들의 개발 활동을 확인해야 했고, 학생은 여러 수업과 자율 프로젝트에 걸친 자신의 기여를 정리할 수 있어야 했습니다.

KUCODE는 이 두 목적을 함께 다루기 위해 시작한 프로젝트입니다. 학사 정보와 GitHub 활동을 연결하고, 사용자의 목적에 따라 조회 범위를 나누는 방향으로 요구사항을 정리했습니다. 프로젝트 총괄과 PM을 맡아 기획을 구체화하고 풀스택 개발과 운영 환경 구축까지 담당했습니다.

데이터 설계

학생과 수업, 프로젝트를 연결하는 기준부터

수업별 활동을 보여주려면 GitHub 계정과 저장소에 수강 정보를 더해야 했습니다. 같은 과목도 개설 시기에 따라 수강생과 프로젝트가 달라지므로, 교과목과 수강 이력, 프로젝트 저장소를 각각 관리하고 관계를 연결했습니다.

학생과 교과목은 수강 이력으로, 교과목과 저장소는 교과 프로젝트로 연결됩니다. 학생의 GitHub ID로 커밋, PR, 이슈의 작성자를 연결하고 소유 저장소와 기여 저장소를 구분합니다. e-Profile은 학생 본인이 작성한 활동을, 교과 분석은 수강생과 교과 저장소를 기준으로 조회하므로 팀 전체 활동을 개인 실적으로 표시하지 않습니다.
학사 정보와 GitHub 활동의 연결

학생의 활동은 GitHub ID로 연결하고, 개설 교과는 연도와 학기, 학수번호로 구분했습니다. 수강 이력은 학생과 교과를, 교과 프로젝트는 교과와 저장소를 잇습니다. 이 관계를 따라가면 한 학생의 누적 활동을 모아 보면서도 특정 수업에서 수행한 프로젝트를 따로 조회할 수 있습니다.

수집 설계

변경된 저장소를 중심으로, 놓칠 수 있는 활동까지

학생 계정에 연결된 저장소는 9,095개입니다. 매번 모든 활동을 다시 수집하면 변화가 없는 데이터에도 API 호출과 갱신 작업을 반복하게 됩니다. 현재 동기화 경로는 GitHub의 갱신 시점과 푸시 시점을 DB에 저장된 값과 각각 비교해 수집 대상을 정하고, 같은 소유자의 저장소 목록은 한 실행 안에서 재사용합니다.

코드가 푸시되지 않아도 PR과 이슈는 새로 생기거나 상태가 바뀔 수 있습니다. 따라서 저장소 정보에 변화가 없어도 PR과 이슈의 변경 여부를 별도로 확인해, 갱신할 활동이 있는 저장소를 수집 대상에 포함합니다.

변경 여부를 확인하는 API가 실패한 경우에는 해당 저장소를 수집 대상으로 남깁니다. 확인하지 못한 상태를 변경 없음으로 처리하지 않기 위한 분기입니다. 필요할 때 전체 활동을 다시 수집하는 경로도 유지하며, 저장소와 SHA 조합의 유일성 제약으로 같은 커밋의 중복 저장을 막습니다.

활용 #1

교수와 조교에게는 수업별 개발 활동을 한눈에

교수와 조교가 저장소를 하나씩 열지 않아도 수업별 활동을 파악할 수 있도록, 수강생과 커밋, PR, 이슈, Star, 저장소 수를 교과 정보와 함께 보여줍니다. 과목과 학과별로 분석 범위를 바꿀 수 있고, 학생 명부 가져오기와 검색, 통계 내보내기로 교과 운영에도 활용할 수 있습니다.

화면을 열 때마다 GitHub 응답을 기다리지 않도록 수집과 조회를 분리했습니다. 분석 API는 DB에 저장된 활동을 조회합니다. 학생별 교과 분석에서는 수강 정보와 교과 정보를 미리 불러오고, 저장소는 GitHub ID별로, 프로젝트는 저장소 ID별로 묶어 같은 정보를 반복 조회하는 작업을 줄이는 구조입니다.

개설학기, 교과목, 수강생과 GitHub 활동 지표를 함께 보여주는 KUCODE 교과 관리 화면. 개인정보는 가림 처리.
교과목별 GitHub 활동 관리

활용 #2

학생에게는 자신의 기여를 설명할 e-Profile로

학생 개인의 경험을 보여줄 때는 팀 저장소의 전체 활동과 본인의 기여를 구분해야 했습니다. 커밋과 PR, 이슈의 작성자를 기준으로 자신의 활동을 조회하고, 소유한 저장소와 다른 저장소에 기여한 경험도 나눠 볼 수 있게 했습니다. e-Profile에는 사용 언어와 활동 추이, 프로젝트 목록을 자기소개와 기술 스택과 함께 정리합니다.

조회에서 끝나지 않고 지원 자료로도 이어지도록, 교과 프로젝트와 자율 활동 중 포트폴리오 PDF에 담을 프로젝트를 직접 선택할 수 있게 했습니다. 학생이 지원 분야나 설명하려는 경험에 맞게 자신의 개발 이력을 구성할 수 있도록 한 기능입니다.

주요 사용 언어, GitHub 활동 지표와 개발 활동 추이를 보여주는 KUCODE e-Profile. 이름, 이메일, GitHub ID는 가림 처리.
학생 개인의 GitHub 활동을 정리하는 e-Profile

구축과 결과

하나의 개발 이력을 교과 분석과 개인 포트폴리오로

Django와 Vue.js로 서비스를 구현하고 PostgreSQL에 데이터를 저장했으며, Nginx와 Gunicorn을 Docker Compose로 구성했습니다. 개발, 스테이징, 운영은 각각 별도의 Compose 프로젝트와 데이터 볼륨을 사용해 개발 중인 설정과 데이터가 운영 환경에 섞이지 않도록 했습니다.

학사 정보와 GitHub 활동을 연결해 교과목별 분석과 학생 개인의 e-Profile, 포트폴리오 PDF를 제공하는 플랫폼을 구축했습니다. 플랫폼에 축적된 데이터는 5개 학기에 걸친 개설 교과와 연결되어 있습니다.

항목규모
분석 대상 학생1,018명
연결된 저장소9,095개
연동된 개설 교과30개

이 프로젝트에서 중요했던 것은 활동을 얼마나 모았는지와 함께, 누구의 어떤 활동으로 보여줄지를 정하는 일이었습니다. 수업을 기준으로 볼 때와 개인의 경험을 정리할 때 필요한 범위를 나누고, 같은 데이터가 교육 현황 분석과 학생의 포트폴리오라는 두 목적에 쓰이도록 연결했습니다.