라이브 데모: playdata.streamlit.app | API 명세: HRD-Net · 사람인 | 개발 일지: DEV_LOG.md
K-Digital Training 과정을 운영하면서 출결·성과 데이터를 엑셀 수작업으로 보고(반나절 소요)하고 있었고, 위험군(결석 누적 등)을 사후에야 파악해 대응이 늦었습니다. 시장 분석 수단도 없어 다음 기수 기획이 감에 의존했습니다.
이 문제를 해결하기 위해 HRD-Net 공공데이터 API를 활용한 자동 ETL + 실시간 대시보드를 1인 기획·개발·배포했습니다.
Before → After
| Before | After | |
|---|---|---|
| 보고 | 엑셀 수작업 (반나절) | 실시간 대시보드 (0분) |
| 위험군 감지 | 사후 파악 (수일 지연) | 당일 자동 감지 |
| 시장 분석 | 없음 | 시장 데이터 기반 경쟁 분석 (매일 자동 수집) |
| 정보 접근 | 담당자 1명 | 구성원 전원 |
활용: 모집 시기·커리큘럼 개편 등 운영 의사결정의 근거 데이터로 3년간 상시 사용
운영 중인 과정의 수료율, 취업률, 실시간 출결을 모니터링하여 중도 탈락 위험을 방지하고 성과를 관리합니다.
2023~2026년 대한민국 전체 정보통신(IT) 훈련 과정(약 32만 건, 2026.07 기준·매일 증가)을 분석하여 경쟁사 현황, 인기 키워드, 적정 훈련비 등 전략적 인사이트를 제공합니다.
[GitHub Actions] [Supabase] [Streamlit Cloud]
hrd_etl.py (평일 매시간 09~18시) → PostgreSQL DB ← 대시보드 (읽기 전용)
market_etl.py (매일 21시) → ←
saramin_etl.py (매일 09시) → ← 운영 현황: hrd_api.py로 API 직접 호출
(60초 캐시, 실패 시 DB 폴백)
- DB: Supabase (PostgreSQL) / 로컬 개발 시 SQLite 자동 폴백
- ETL 자동화: GitHub Actions (cron 스케줄)
- 대시보드: Streamlit Cloud 배포
st.navigation() 기반 10페이지 구성:
| 페이지 | 파일 | 아이콘 | 분류 |
|---|---|---|---|
| 성과 대시보드 | home.py |
🏠 | 홈 |
| 시장 분석 | pages/시장_분석.py |
📈 | 외부 |
| 종료과정 성과 | pages/종료과정_성과.py |
📊 | 내부 |
| 현재 운영 현황 | pages/현재_운영_현황.py |
📋 | 내부 |
| 매출 분석 | pages/매출_분석.py |
💰 | 내부 |
| 채용 동향 | pages/채용_동향.py |
💼 | 채용 |
| DB 명세 | pages/DB_명세.py |
🗄️ | 공통 |
| SQL Playground | pages/SQL_Playground.py |
🔍 | 공통 |
| AI 리포트 | pages/AI_리포트.py |
🤖 | AI |
| 용어 사전 | pages/용어_사전.py |
📖 | 공통 |
| 테이블 | 용도 | PK | 대략 건수 |
|---|---|---|---|
TB_COURSE_MASTER |
과정 마스터 (회차별 운영 정보) | (TRPR_ID, TRPR_DEGR) |
~10 |
TB_TRAINEE_INFO |
훈련생 정보 (인적사항, 출결 요약) | (TRPR_ID, TRPR_DEGR, TRNEE_ID) |
~200 |
TB_ATTENDANCE_LOG |
출결 로그 (일별 입퇴실 기록) | UNIQUE(TRPR_ID, TRPR_DEGR, TRNEE_ID, ATEND_DT) |
~20,000 |
TB_MARKET_TREND |
시장 동향 (전국 IT 훈련과정) | (TRPR_ID, TRPR_DEGR) |
~320,000 |
TB_MARKET_CACHE |
ETL 사전 집계 캐시 (시장 분석 가속) | CACHE_KEY |
~20 |
TB_JOB_POSTING |
채용공고 (사람인 API 수집) | JOB_ID |
~5,000 |
TB_JOB_POSTING_KEYWORD |
채용공고-키워드 다대다 매핑 | (JOB_ID, SEARCH_KEYWORD) |
~7,000 |
TB_JOB_POSTING_REGION |
채용공고-지역 다대다 매핑 | (JOB_ID, REGION) |
~6,000 |
컬럼별 상세 명세는 대시보드 DB 명세 페이지에서 확인 가능. API 매핑은 docs/api/hrd_net.md · docs/api/saramin.md 참조
📦 2026data
┣ 📂 .github/workflows
┃ ┣ 📜 hrd_etl.yml # GitHub Actions: 내부 ETL (평일 매시간)
┃ ┣ 📜 market_etl.yml # GitHub Actions: 시장 ETL (매일 저녁)
┃ ┗ 📜 saramin_etl.yml # GitHub Actions: 채용공고 ETL (매일 아침)
┣ 📂 pages
┃ ┣ 📜 시장_분석.py # [외부] 시장 분석 & 기회 발굴 13탭
┃ ┣ 📜 종료과정_성과.py # [내부] 기수별 심층 분석 6탭 + 전체 기수 비교
┃ ┣ 📜 현재_운영_현황.py # [내부] 출석률 게이지, 출결추이, 누적 위험지표
┃ ┣ 📜 매출_분석.py # [내부] 단위기간별 훈련비 매출 4탭 + 전체 기수 비교
┃ ┣ 📜 채용_동향.py # [채용] 사람인 채용공고 분석 (진행중/종료 분리, 키워드 추이)
┃ ┣ 📜 DB_명세.py # [공통] DB 테이블·컬럼 명세 및 원본 데이터 조회
┃ ┣ 📜 SQL_Playground.py # [공통] SELECT 전용 SQL 쿼리 실행 (예제 쿼리 제공)
┃ ┣ 📜 AI_리포트.py # [AI] Gemini 기반 기수별 성과 리포트 자동 생성
┃ ┗ 📜 용어_사전.py # [공통] GLOSSARY.md 기반 UI 용어 사전 조회
┣ 📂 tests # pytest 테스트 (209개)
┃ ┣ 📜 conftest.py # 인메모리 SQLite fixture
┃ ┣ 📜 test_utils.py # adapt_query, safe_float, safe_int, calculate_age
┃ ┣ 📜 test_config.py # 상수 타입/범위 검증
┃ ┣ 📜 test_init_db.py # 테이블 생성, 멱등성, 인덱스
┃ ┣ 📜 test_hrd_etl.py # clean_time, get_month_list, batch_execute
┃ ┣ 📜 test_market_etl.py # parse_rows_xml, ymd, shards
┃ ┣ 📜 test_saramin_etl.py # 사람인 ETL 파싱, 키워드 매핑, 캐시 집계
┃ ┗ 📜 test_hrd_api.py # API 모듈 파싱, 병렬호출, 폴백, 컬럼 호환성
┣ 📜 home.py # 메인 대시보드 (시장 포지셔닝, KPI 요약, 오늘의 출결 현황)
┣ 📜 hrd_etl.py # [수집] 내부 과정/훈련생/출결 + 캐시 사전 집계
┣ 📜 market_etl.py # [수집] 외부 시장 전체 데이터 (매일 수집) + 캐시 사전 집계
┣ 📜 saramin_etl.py # [수집] 사람인 채용공고 (키워드 20개, 1일 단위 분할 수집)
┣ 📜 init_db.py # [DB] 테이블 DDL + 인덱스 10개 + 마이그레이션
┣ 📜 config.py # [설정] 전역 상수 (출결, 매출, AI, 캐시 TTL, ETL 파라미터)
┣ 📜 hrd_api.py # [실시간] 운영 현황 API 직접 호출 (DB 폴백)
┣ 📜 utils.py # [공통] DB 연결, adapt_query, 유틸리티
┣ 📜 requirements.txt # 의존성 (pytest 포함)
┣ 📂 docs
┃ ┣ 📜 GLOSSARY.md # UI 용어 사전 (지표 표기 기준)
┃ ┣ 📜 DEV_LOG.md # 개발 일지 (의사결정·삽질 기록)
┃ ┗ 📂 api
┃ ┣ 📜 hrd_net.md # HRD-Net API 명세
┃ ┗ 📜 saramin.md # 사람인 API 명세
┗ 📜 CLAUDE.md # Claude Code 프로젝트 컨텍스트
git clone https://github.com/soulhn/2026data.git
cd 2026data
# 가상환경 생성 및 활성화
python -m venv .venv
# Windows: .venv\Scripts\activate
# Mac/Linux: source .venv/bin/activate
# 필수 라이브러리 설치
pip install -r requirements.txtHRD_API_KEY="발급받은_인증키"
HANWHA_COURSE_ID="관리할_내부_과정_ID"
ENCORE_API_KEY="엔코아_기관_인증키" # AI캠퍼스 운영 현황 (기관별 키 필수)
ENCORE_COURSE_IDS="과정ID1,과정ID2" # 엔코아 과정 ID (콤마 구분)
DATABASE_URL="postgresql://..." # Supabase 연결 (없으면 SQLite 사용)
SARAMIN_API_KEY="사람인_API_키" # 채용공고 수집 (선택사항)
OPENAI_API_KEY="OpenAI_API_키" # AI 리포트 기능 (선택사항)# 테이블 생성
python init_db.py
# 내부 과정 데이터 수집
python hrd_etl.py
# 시장 동향 데이터 수집 (20~30분 소요)
python market_etl.pystreamlit run home.pySecrets 설정:
DATABASE_URL = "postgresql://..."
HRD_API_KEY = "HRD-Net_API_키"
HANWHA_COURSE_ID = "관리_대상_과정_ID"
ENCORE_API_KEY = "엔코아_기관_인증키"
ENCORE_COURSE_IDS = "과정ID1,과정ID2"
[passwords]
admin = "비밀번호"Repository Secrets에 등록:
HRD_API_KEYHANWHA_COURSE_IDDATABASE_URLSARAMIN_API_KEY
| 워크플로우 | 스케줄 | 소요 시간 |
|---|---|---|
| HRD ETL | 평일 09:00~18:00 매시간 (KST) | ~10분 |
| Market ETL | 매일 21:00 (KST) | ~30분 |
| Saramin ETL | 매일 09:00 (KST) | ~5분 |
태그: 작업 내용 요약
| 태그 | 설명 | 사용 예시 |
|---|---|---|
| Feat | 새로운 기능 추가 | Feat: 중도탈락 위험군 탐지 로직 추가 |
| Fix | 버그 수정 | Fix: PG 플레이스홀더 변환 누락 수정 |
| Docs | 문서 수정 | Docs: README.md 배포 구조 업데이트 |
| Style | 코드 포맷팅 (로직 변경 X) | Style: 불필요한 공백 제거 |
| Refactor | 코드 리팩토링 | Refactor: DB 연결 함수 utils.py로 분리 |
| Chore | 설정 변경, 패키지 관리 등 | Chore: GitHub Actions 타임아웃 조정 |
- DB 이중 지원:
DATABASE_URL환경변수 유무로 PostgreSQL/SQLite 자동 전환 - ETL 자동화: GitHub Actions cron으로 무인 데이터 갱신
- Smart Update: 종료 과정 중복 수집 방지, 증분 수집 지원
- Robustness: 자동 재시도(Retry), 배치 실패 시 row-by-row 폴백, ETL Summary 리포트
- Performance:
@st.cache_data, ETL 사전 집계 캐시(TB_MARKET_CACHE), Pagination, Sampling, DB 인덱스 10개로 대시보드 최적화 - Testing: pytest 209개 테스트 (유틸리티, DB 초기화, ETL 함수, 매출 청구 계산, 사람인 ETL, 설정 검증)
- Visualization: Plotly & Altair 인터랙티브 차트 (히트맵, 히스토그램, 게이지 등)
- 시장 분석: 내부 과정 vs 시장 교차분석, 시계열 트렌드, 경쟁 심화도, 비용-성과 시뮬레이터, 자격증 분석 (scikit-learn)
- 매출 분석: 단위기간별 훈련비 청구 계산 (일훈련비 145,200원 기준), 기수별 매출 비교
- AI 리포트: OpenAI (gpt-5-mini) 기반 기수별 성과 리포트 자동 생성
- 채용 동향: 사람인 API 기반 IT 채용공고 분석 (키워드 20개, 1일 단위 분할 수집, 다중 지역 지원, 진행중/종료 분리)
- 위험 관리: 누적 출결 위험 지표 (결석 3회+, 지각 5회+, 조퇴 5회+), 출결 추이 모니터링