개요
국비지원 교육기관 운영을 위한 ERP 플랫폼입니다. 수강생용 강의 사이트와 관리자 대시보드를 분리 구성해 수강 신청·출결·성적·상담·만족도 평가 등 교육 운영 전 과정을 통합 관리합니다.

기획 배경
교육기관에서 출결·성적·상담 이력을 개별 도구로 관리하는 비효율을 해결하고자 했습니다. 수강생과 관리자 양측의 흐름을 분리해 역할별 UI를 설계했으며, 실제 국비지원 과정 운영에 바로 적용 가능한 수준을 목표로 했습니다.
주요 기능
- 수강생 사이트: 강의 목록·상세, 수강 신청, 마이페이지(출결·성적·설문·내 정보)
- 관리자 대시보드: 운영 현황 요약, 과정·수강생·출결·성적·상담·만족도 관리

- 출결 관리: 스케줄러 기반 자동 결석 처리, 주말·공휴일 제외 수업일 계산
- SMS 발송: Solapi SDK 연동, 출석률 저조 경고·수강생 공지 문자 발송
- JWT 인증: Access/Refresh 토큰 기반, 역할(STUDENT/INSTRUCTOR/ADMIN) 분리

서비스 아키텍처
프론트엔드(Vercel)와 백엔드(AWS EC2)를 분리 배포한 구조입니다.
[사용자] ──HTTPS──> Vercel (React SPA · React 18 · Vite · Tailwind)
edudy.wonjae.cloud
│ API 호출 (CORS 허용)
▼
AWS EC2 (t3.small · 서울)
Nginx 리버스 프록시 · HTTPS
api.edudy.wonjae.cloud
│
▼
Spring Boot API ──> MySQL
CI/CD — 백엔드: main push → GitHub Actions (bootJar 빌드 → Docker 이미지 → push) → GHCR → EC2 pull·재기동 / 프론트: Vercel 자동 배포
DB 구조

담당 역할
수강생 사이트
| 영역 | 내용 |
|---|---|
| 레이아웃 | 헤더, 푸터, 전체 라우팅 구조 |
| 로그인/회원가입 | 폼 구현, SMS 인증, 토스트 알림 |
| 홈 | 배너 슬라이더, 수강신청 많은 강의 카드 |
| 강의 상세 | 강의 소개·과목·수강평 탭, 수강 신청 |
| 마이페이지 | 출결 확인, 성적 조회, 설문 제출, 내 정보 수정 (공동) |
관리자 사이트
| 영역 | 내용 |
|---|---|
| 수강생관리 | 수강생 목록 조회·상태 관리 |
| 과정관리 | 과정 목록 조회, 수강신청 처리 (공동) |
| 회원관리 | 회원 조회·등급 조정 (공동) |
| 성적관리 | 성적 조회·입력 (공동) |
| 상담일지 | 상담 이력 조회·작성 |
| 강의평가 | 강의·강사 만족도 조회 |
| 사이트관리 | 배너, 과정 노출 우선순위 설정 |
기타: 기능명세서 작성 (공동), AI 기능 검토 및 방향 전환
개발 일정
| 주차 | 작업 |
|---|---|
| 1주차 (06.09~06.15) | 기획·설계, ERD, 기능명세서, 개발 환경 세팅 |
| 2주차 (06.16~06.22) | 수강생 사이트 핵심 페이지, 관리자 주요 기능 |
| 3주차 (06.23~06.27) | 잔여 페이지, 배포, 최종 점검 |
트러블슈팅
공공 API XML 매핑 오류
공공데이터포털 공휴일 API 응답이 XML 형식인데, Java 11부터 JAXB가 JDK에서 제거되면서 XML DTO 매핑이 실패했습니다. build.gradle에 JAXB 의존성 2개(jakarta.xml.bind-api, jaxb-runtime)를 추가해 해결했고, 공휴일 데이터를 DB에 저장해 출결 스케줄러에서 수업일 계산에 활용했습니다.
SPA 라우팅 새로고침 404
React SPA를 Vercel에 배포 후 직접 URL 접근이나 새로고침 시 404가 발생했습니다. Vercel은 기본적으로 정적 파일만 서빙하기 때문에 클라이언트 라우팅 경로를 모릅니다. vercel.json에 모든 경로를 index.html로 rewrite하는 규칙을 추가해 해결했습니다.
CORS 설정
React(Vercel, edudy.wonjae.cloud)에서 Spring Boot API(api.edudy.wonjae.cloud)를 호출할 때 CORS 오류가 발생했습니다. 로컬에서는 동일 출처라 문제없었으나 배포 환경에서는 도메인이 달라 차단됐습니다. Spring Security 설정에서 허용 출처와 메서드를 명시해 해결했습니다.
배운 점
프론트엔드와 백엔드를 서로 다른 환경(Vercel·EC2)에 분리 배포하면서, 로컬에서는 없던 CORS·SPA 새로고침 404·공공 API XML 매핑 같은 문제가 배포 단계에서 처음 드러났습니다. 이를 직접 해결하며 '만드는 것'과 '실제 환경에서 계속 돌아가게 하는 것'은 다른 역량이라는 것을 배웠습니다.