2025 — 현재 · AI Agent Programmer · PM (설계 · 개발 · 운영)

EDUB-pipeline — 생기부 기반 대입 학과 추천 파이프라인

엑셀과 손으로 하던 입시 컷 데이터 가공을 자동화하고, 생활기록부 PDF에서 학과 추천 리포트까지 한 번에 뽑아내도록 만들었다.

  • Python
  • PDF 파싱
  • xlsx → JSON ETL
  • Pytest
수작업 시간
주 10h+ → 0h
커트라인 데이터
2,852건
이용자
약 500명

문제

대입 상담에 쓰는 학과 커트라인 데이터를 매번 엑셀에서 손으로 가공하고 있었다. 주당 10시간 이상이 여기에 들어갔고, 더 큰 문제는 시간이 아니라 정확도였다.

대학·학과 이름 표기가 제각각이고(같은 학과가 대학마다 다른 이름으로 불린다), 등급 체계와 과목 분류를 사람이 맞춰 넣다 보니 데이터를 구성하는 단계에서 오류가 반복적으로 발생했다. 상담 결과가 틀리면 학생의 지원 전략이 통째로 흔들리는 영역이라 그냥 둘 수 없었다.

접근

엑셀에서 리포트까지를 하나의 파이프라인으로 끊어냈다.

  • 수집scripts/xlsx_to_cuts.py로 예측 데이터 엑셀을 표준 JSON으로 변환한다. xlsx가 결국 zip + XML이라는 점을 이용해 zipfilexml.etree만으로 파싱했고, 덕분에 openpyxl 같은 외부 의존성 없이 표준 라이브러리만으로 돌아간다.
  • 정규화 — 흩어진 표기를 사전으로 통일했다. 유사학과 매핑 1,343건, 학과별 우선 과목 664개 학과, 과목 분류 337건, 등급 매핑 801건을 데이터로 분리해 코드가 아니라 데이터를 고치면 되도록 만들었다.
  • 입력 — 학생 생활기록부 PDF를 파싱해 성적과 과목 이력을 구조화한다(run_from_pdf).
  • 매칭 — 산출된 성적을 커트라인과 대조해 안정 · 적정 · 도전 3구간으로 학과를 추천한다.
  • 출력 — 추천 결과를 문장으로 조립해 상담용 리포트로 내보낸다.
  • 검증 — 계산 엔진, 정규화, 매칭, 리포트 단계마다 테스트를 붙였고 홀드아웃 평가 스크립트(scripts/eval_holdout.py)로 추천 품질을 따로 확인한다.

성과

  • 주당 10시간 이상 걸리던 수작업이 사라졌다. 엑셀이 갱신되면 스크립트 한 번으로 끝난다.
  • 데이터 구성 단계의 오류를 잡았다. 표기 정규화를 사전으로 분리하고 단계별 테스트를 붙인 뒤로, 손으로 맞출 때 반복되던 오류 없이 안정적으로 동작하고 있다.
  • 대학 106곳, 2,852건의 학과 커트라인을 안정·적정·도전 3구간으로 관리한다.
  • 약 500명의 사용자가 이 결과물을 실제로 이용하고 있다.
  • 산출 JSON을 URL로 호스팅해 주입하는 구조라, 데이터만 교체하면 배포 없이 갱신된다.

배운 것

로직보다 표기 정규화가 이 문제의 본질이었다. 처음에는 계산 엔진을 다듬으면 될 줄 알았는데, 정확도를 무너뜨리던 건 계산이 아니라 “같은 학과를 다르게 부르는 문제”였다. 규칙을 코드에 박지 않고 사전 데이터로 빼둔 판단이 이후 유지보수 비용을 크게 줄였다.