개요
KDT(국민내일배움카드) 국비지원 교육과정과 온라인 강의 마켓플레이스를 하나로 통합한 LMS 플랫폼입니다. 수강생·강사·매니저·관리자 4개 역할로 권한을 분리하고, Spring Boot + Thymeleaf(공개 페이지)와 React SPA(대시보드)를 혼합 구조로 구현했습니다. 5인 팀 프로젝트로 4주간 진행했습니다.

주요 기능
| 역할 | 기능 |
|---|---|
| 수강생 | KDT 과정 목록·신청, 온라인 강의 구매(장바구니·결제·환불), S3 영상 수강, 출석 확인, 테스트 응시 |
| 강사 | 커리큘럼·영상 등록, 강의 진행 현황 대시보드 |
| 매니저 | 출석 관리, KDT 상담 목록, 게시판 관리 |
| 관리자 | KDT 과정·세션 등록, 테스트 출제·채점, IP 기반 출석 제어, 통계 대시보드, 회원 관리 |

서비스 아키텍처
Thymeleaf(공개 페이지)와 React SPA(대시보드)를 하나의 WAR로 묶은 혼합 모놀리식 구조입니다.
[사용자] ──HTTPS──> AWS EC2 (t3.small · 서울)
Nginx 리버스 프록시 · HTTPS
│
▼
Spring Boot ── Thymeleaf (공개 페이지)
└─ React SPA (대시보드, WAR에 빌드 포함)
│
├─> MySQL
└─> AWS S3 (강의 영상)
CI/CD — main 브랜치 push → GitHub Actions (① npm ci && build(React) → ② bootWar 빌드 → Docker 이미지 → push) → GHCR → EC2 pull·재기동
DB 구조

담당 역할
팀 프로젝트 당시
- 공개 페이지 Thymeleaf 프론트엔드 담당 — 메인, 강의 목록·상세, 국비 과정 목록·상세 페이지 구현
- 관리자 대시보드 회원관리 백엔드 — 회원 목록 조회·수정·삭제 REST API 구현
프로젝트 이후 단독 개선
- UI 전면 리디자인 — 비로그인 공개 페이지 18개 파일 다크네이비+오렌지 팔레트로 재설계
- 스케줄러 버그 수정 — 시작일이 미래인 세션이 ONGOING으로 잘못 변경되어 신청 버튼 미노출되던 문제 수정
- S3 영상 업로드 수정 — 업로드 오류 및 계정 미설정 상태였던 것을 수정해 정상화
- CI/CD React 빌드 누락 수정 — Actions에 React 빌드 단계 누락으로 배포 후 대시보드 404, 워크플로우 보완
- Docker + CI/CD — GitHub Actions → GHCR → EC2 자동 배포 구성 (bootWar 빌드 방식)
개발 일정
| 기간 | 작업 |
|---|---|
| 12/23~12/29 | 요구사항 분석, 프로젝트 셋팅 |
| 12/30~1/5 | 회원관리, 국비 관리 구현 |
| 1/6~1/12 | 강의 관리(온라인+국비), 결제 관리 구현 |
| 1/13~1/15 | 시스템 통합·테스트, 배포, 발표 준비 |
트러블슈팅
스케줄러 ONGOING 버그
KDT 세션 상태를 주기적으로 업데이트하는 스케줄러(updateSessionsToOngoing)가 시작일이 미래인 세션까지 ONGOING으로 변경해 신청 버튼이 사라지는 문제가 있었습니다. 쿼리의 날짜 조건(start_date <= now())이 누락되어 있었고, 조건을 추가해 해결했습니다.
CI/CD React 빌드 누락
GitHub Actions 배포 후 React 대시보드가 404로 표시되는 문제가 있었습니다. CI 스크립트에 npm ci && npm run build 단계가 빠져 있어 빌드된 정적 파일이 WAR에 포함되지 않았습니다. Actions 워크플로우에 빌드 단계를 추가해 해결했습니다.
배운 점
회원관리 백엔드와 스케줄러를 다루며, 쿼리의 작은 조건 하나(start_date <= now())가 누락된 것만으로도 사용자에게 보이는 기능이 망가질 수 있다는 것을 경험했습니다. 또 CI 스크립트에서 React 빌드 단계가 빠져 배포가 깨진 일을 겪으며, 코드뿐 아니라 빌드·배포 파이프라인 전체를 이해하고 있어야 한다는 점을 배웠습니다.