대학알리미 학과별 재적 학생 현황을 통합해 2019~2025년 대학·전문대학 시장을 살펴보는 대학교재 출판용 로컬 대시보드입니다. 학생 규모를 잠재 독자 규모의 참고치로 사용해 전공, 지역, 학교와 학과를 비교합니다. 실제 교재 채택·판매량이나 미래 수요를 뜻하지 않습니다.
- 대학시장 요약: 종료연도 학생 규모, 시작연도 대비 증감, 운영 학교 수, 큰 대계열과 대학·전문대학 비교
- 전공 시장: 공식 대·중·소계열 탐색과 최근·장기 학과군 상승·하락, 운영 학교 확산 분석
- 지역·학교: 지역별 시작·종료연도 규모 비교, 종료연도 주요 학교, 장기 증가·감소 학교
- 학교·학과 찾기: 종료연도 학교·학과, 전공 분류, 지역과 학생 규모 탐색
- 사용 가이드: 질문형 메뉴 안내, 화면별 활용 예시, 주요 용어와 해석 주의사항
- 분석 기간: 전체 기간, 최근 3년, 최근 1년 또는 직접 시작·종료연도 선택
- 필터: 화면별 기본 조건과 접이식 상세 조건, 적용 칩, 지역·대학구분별 학교와 대·중·소계열 연동
- 반응형 UI: 데스크톱 사이드바, 모바일 메뉴·접이식 조건·상세 카드
요구 환경은 Node.js 20 이상과 pnpm입니다.
pnpm install
pnpm data:refresh
pnpm devpnpm data:refresh는 origin_data의 원본 변환, 독립 검산, TypeScript, ESLint, 테스트와 프로덕션 빌드를 차례로 수행합니다. 하나라도 실패하면 갱신이 완료된 것으로 보지 않습니다.
갱신할 때는 실행 중인 개발 서버를 먼저 Ctrl+C로 종료하세요. 갱신이 끝나면 위의 pnpm dev 명령으로 다시 실행합니다. 빌드 준비 단계에서는 데이터와 무관한 .next/dev/types 생성 캐시만 안전하게 정리합니다.
브라우저에서 http://127.0.0.1:3000을 엽니다.
프로덕션 검사와 실행은 다음과 같습니다.
pnpm lint
pnpm test
pnpm typecheck
pnpm build
pnpm start원본 XLSX는 수정하지 않으며 public/에 복사하지 않습니다. 프로젝트의 *.xlsx는 Git에서 제외됩니다.
- 읽기 전용 원본:
origin_data/*.xlsx - 압축 정규화 데이터:
data/processed/enrollment.json.gz - 검산 보고서:
data/processed/validation-report.json - 변환·비교 명세:
data/processed/methodology.json - 스트리밍 전용 변환기:
scripts/convert-enrollment.ts - 독립 재검산:
scripts/validate-enrollment.ts
분석 API는 data/processed의 검산 완료 데이터만 읽습니다. 과거 관리자 기능에서 생성된 data/local-store/ 스냅샷은 안전한 보관을 위해 남아 있지만 애플리케이션에서는 읽지 않으며 Git에도 포함하지 않습니다.
현재 변환기는 다음 파일 구성을 읽습니다.
| 구분 | 기간 | 원본 열 | 변환 행 |
|---|---|---|---|
| 대학 | 2019~2022 | 45열 | 82,904행 |
| 대학 | 2023~2025 | 46열 | 45,263행 |
| 전문대학 | 2019~2022 | 45열 | 35,889행 |
| 전문대학 | 2023~2025 | 46열 | 21,474행 |
| 합계 | 2019~2025 | 185,530행 |
워크시트 사용 범위가 실제 데이터와 달리 A1로 기록되어 있어 일반적인 XLSX 범위 판독을 사용하지 않습니다. ZIP 내부 sheet1.xml을 스트리밍으로 풀면서 SAX 방식으로 행을 읽습니다. 새 원본은 학교·단과대학·학과·주야 값이 각 행에 이미 채워져 있으므로 병합 셀 채우기는 하지 않습니다.
두 기간의 공통 차원은 다음과 같습니다.
- 학교: 공시연도, 기준연도, 학교코드, 학교명, 본분교, 대학구분, 학교종류, 설립구분·유형, 소재지유형, 지역, 학교상태
- 학과: 단과대학, 학과코드, 학과명, 주야, 학과특성
- 계열: 대학자체계열, 표준분류 대계열·중계열·소계열
- 지표: 학생정원, 재학생, 휴학생, 학사학위취득유예학생, 재적학생
2019~2022년에는 학생정원 열이 없어 null로 보존합니다. 새 원본에는 학과상태 열이 없으므로 학교상태로 바꿔치기하거나 신설·폐과를 임의 추정하지 않습니다.
모든 행에서 다음 산식을 적용합니다.
재학생 = 재학생_계_정원내 + 재학생_계_정원외
휴학생 = 휴학생_계_정원내 + 휴학생_계_정원외
학위취득유예학생 = 학사학위취득유예학생_계_정원내 + 정원외
재적학생 = 재학생 + 휴학생 + 학위취득유예학생
현재 185,530행에서 아래 오류는 모두 0건입니다.
- 공시연도와 기준연도 불일치
- 학교·학과·대학구분·지역·대중소계열 필수 차원 누락
- 동일 연도·학교코드·본분교·학과코드·주야·학과특성 복합키 중복
- 음수 또는 읽을 수 없는 학생 수
- 정원내·외 각각의
계 = 남 + 여소계 오류 재적학생 = 재학생 + 휴학생 + 학위취득유예학생오류- 파일별 45/46열 스키마 오류
시장 규모, 전년 대비, 장기 변화, 점유율 변화, 증감 기여, 지역별 장기 비교와 차트별 해석 기준은 시장 분석 방법론에 정리했습니다.
핵심 해석 제한은 다음과 같습니다.
- 2019
2022와 20232025는 학과 행 구성 방식이 달라 원본 행 수를 장기 시장 지표로 비교하지 않습니다. 학생 수 합계를 동일 산식으로 비교합니다. - 2025년부터
광역계열이 관측되므로 일부 계열 점유율 이동에는 분류 변경 효과가 포함될 수 있습니다. 정원 대비 재학생 비율의 재학생에는 정원외 학생이 포함되므로 공식 충원율이 아닙니다.- 학생 수 증가는 취업 전망, 수요 증가, 미래 유망성 또는 인과관계를 뜻하지 않습니다.
연 1회 새 원본 4개를 origin_data에 넣고 다음 명령 하나를 실행합니다.
pnpm data:refresh다른 폴더에서 먼저 시험하려면 아래처럼 변환과 검산을 별도로 실행할 수 있습니다.
pnpm data:convert -- --input-dir "C:\새 원본 폴더"
pnpm data:validate
pnpm check변환기는 입력 파일을 읽기만 하며 수정·이동·삭제하지 않습니다. 파일 수, 필수 열, 실제 열 수, 연도·대학구분, 숫자·합계 검사가 실패하면 품질 검사를 통과하지 못하고 명령이 중단됩니다.
권장 연간 절차는 다음과 같습니다.
- 기존
origin_data를 별도 보관하고 새 원본 4개로 교체합니다. pnpm data:refresh를 실행합니다.- 로컬 브라우저에서 대학시장 요약·전공 시장·지역·학교·학교·학과 찾기를 확인합니다.
- 변환 데이터, 검산 보고서와 코드를 Git 커밋 또는 연도 태그로 저장합니다.
Git 커밋이 데이터 버전 이력이 되므로 별도의 로그인·업로드·게시·복구 서버는 운영하지 않습니다.
origin_data/ Git 제외 읽기 전용 원본 4개
data/processed/ 압축 정규화 데이터·검산 보고서·명세
data/local-store/ Git 제외 과거 게시 스냅샷 보관본, 앱 미사용
scripts/ 변환·독립 검산 도구
src/app/api/dashboard/ 공통 필터·KPI·순위·상세 API
src/app/api/market-analysis/ 시장 규모·구조·지역 추이 분석 API
src/app/api/department-trends/ 학과군·개별 학과·관측 이동 API
src/components/ 분석 화면과 반응형 UI
src/lib/ 데이터 로더·분석·검산·테스트
docs/ 계산 방법론과 운영 가이드
- 운영 주소: https://university-enrollment-dashboard.vercel.app
- Git
main의 검산 완료 정규화 데이터와 애플리케이션만 Vercel에 배포합니다. - 다음 연도에는 원본 열·항목 변경 여부와 계열 분류의 장기 비교 연속성을 다시 확인합니다.
관리자 로그인, Supabase, 웹 업로드와 게시·복구 기능은 연 1회 갱신 주기에 비해 운영 비용이 커서 제거했습니다.