Synology NAS를 기반으로 교사와 학생의 수업을 예약하고 관리할 수 있는 수강 신청 어플리케이션입니다.
이 프로젝트는 2023년에 모놀리식에서 시작하여 마이크로서비스(MSA)로 조금씩 전환되는 과정을 기록하고 있습니다. 각 기능은 독립적으로 배포되고 확장 가능한 구조로 재설계 되었으며, 주문 서비스를 제외한 각 서비스 API에 대하여 테스트 케이스가 작성되어 있습니다.
🔗 모놀리식 버전 GitHub 저장소: https://github.com/devhong96/scheduler
🔗 모놀리식 버전 배포 링크: https://seho0218.synology.me:3206
| Service | Description | Status / Repository |
|---|---|---|
| Discovery Service | 서비스 디스커버리 | 🔗 GitHub Repository |
| Config Service | 환경 설정 관리 | 🔒 비공개 |
| Config | 환경 설정 | 🔒 비공개 |
| Service | Description | Repository |
|---|---|---|
| API Gateway Service | Spring Cloud Gateway 기반 | 🔗 GitHub |
| Member Service | 사용자 계정, 인증 및 권한 관리 | 🔗 GitHub |
| Course Service | 수업 일정 생성 및 관리 | 🔗 GitHub |
| Article Service (개발 중) | 문의사항 및 게시판 관리 | 🔗 GitHub |
| Order Service | Kakao, Naver, NicePay와 연동된 결제 처리 | 🔗 GitHub |
-
Eureka 서버 (서비스 디스커버리)
🔗 Eureka Dashboard -
Swagger 문서 (API 문서화)
🔗 Swagger UI
| 구분 | 기술 |
|---|---|
| Backend | Java 17, Spring Boot 3, JPA, QueryDSL, Spring Security 6, JWT |
| MQ | Kafka (3.8.x), RabbitMQ |
| Cloud | Spring Cloud 4.x (Eureka, Config, Gateway, BootStrap, CircuitBreaker) |
| Database | MySQL 8.0, Redis |
| DevOps | Docker, Docker-Compose, GitHub Actions, Docker Hub, Synology NAS (DSM) |
| Monitoring | Prometheus, Grafana, Spring Boot Actuator |
- Synology NAS (개인 서버 기반 MSA 환경 구축)
- Hardware : Synology 920+
- CPU: intel CeleronJ4125 (4C 4T, Base 2.0GHz, Boost 2.70 GHz)
- RAM : 20GB(4 + 16)
- 네트워크 : 가정용 네트워크 500Mbps (공유기 : iptime a5004ns)
- Hardware : Synology 920+
1차 개발 2023.04 ~ 2024.05
- Synology NAS를 이용한 사용자/수업 예약 관리 DB 설계
- Thymeleaf를 사용한 단일 애플리케이션 구조로 통합 개발
- jar파일을 시놀로지에 업로드하여 Shell Script로 직접 실행
2차 개발 2025.02 ~ 2025.05
- 모놀리식 구조로 되어 있던 애플리케이션을 Spring Cloud를 활용하여 MSA로 전환
- GitHub 커밋시, GitHub Actions에서 Kafka·Redis 등 외부서비스는 서비스 컨테이너를 이용하여 테스트 통과 시 Docker Hub로 이미지 푸시하도록 구성
- API Gateway에서 JWT 유효성을 검사하고, 상세 사용자 정보가 필요한 서비스는 OpenFeign을 통해 Member Service로 토큰을 전달하여 Spring Security 인증 후, 정보를 반환하도록 구성
- JPA의 N+1 문제와 페이징 성능 저하를 해결하기 위해 UUID를 외래 키로 도입하여 연관관계 매핑을 최소화하고 QueryDSL Projections를 DTO 조회에 활용하여 데이터 전송량, 최대 85% 절감
- jUnit 5와 Mockito를 이용하여 외부 서비스는 Stub 처리하여 의존성을 제어하고, 핵심 비즈니스 로직 테스트 50건 이상 작성
3차 개발 2025.07 ~
- 대규모 트래픽에 유연하게 대응할 수 있도록 RestTemplate 기반 결제 호출을 WebClient로 전환하고 결제 로직을 별도 모듈로 분리
- 결제 시스템의 설정 변동사항을 감안하여 PG사별 Header·Properties를 YAML로 관리 표준화
- Factory·Strategy 패턴 도입으로 결제 로직을 인터페이스화하고 코드 변경 없이 신규 PG사를 확장할 수 있는 결제 모듈 설계
- Outbox 패턴을 적용하여 이벤트를 DB에 저장하면 트랜잭션 커밋 후, 비동기 발행으로 큐 장애 시에도 유실 없이 재전송 가능하도록 구성
-
회원 가입 및 인증: 이메일 인증을 통해 안전한 회원가입 절차와 비밀번호 찾기 기능을 제공
-
교사 등록 승인: 관리자가 교사의 회원 가입 요청을 검토하고 승인
-
학생 등록 승인: 교사는 학생의 회원가입을 승인
-
스케줄 설정: 교사가 수업을 진행할 수 있는 날짜와 시간을 자유롭게 등록하고 관리
-
수강 신청: 학생이 교사가 등록한 스케줄을 확인하고 실시간으로 수강을 신청
-
온라인 결제: 카카오, 네이버, 나이스페이 등 다양한 PG사와 연동하여 편리한 결제 기능을 제공
-
안정적인 예약 처리: Redisson 분산 락을 통해 동시성 문제 해결
-
신뢰성 있는 데이터 처리: Kafka와 RabbitMQ 기반의 비동기 이벤트를 통해 결제, 예약 등의 데이터를 안정적으로 처리
- 모든 입력 조회 폼에서 입력해야하는 칸에 아무것도 입력하지 않은 경우 오류 메시지가 발생한다.
- 교사와 관리자는 이메일을 통해 아이디 찾기와 비밀번호 찾기를 할 수 있으며 이메일 변경도 가능하다.
- 기본적으로 선착순으로 처리되며 학생이 1시에 신청을 했을 경우,다른 학생은 1시를 선택할 수 없다.
- 학생 명부에 등록된 학생만 수강 신청과 시간표 변경을 할 수 있다.
- Spring security 와 관리자 계정을 통해 교사 아이디에 승인 절차를 부여할 수 있도록 되어있다.
- 관리자 계정은 최고 권한을 갖기 때문에 회원가입을 통해 계정이 생성되지 않고
어플리케이션 실행시 하나의 계정만 생성되며 생성되어 있을 경우 추가 생성되지는 않는다.
- 공지사항을 작성 및 수정 삭제할 수 있다.
- 교사의 권한과 역할을 포함한다.
- 교사 회원 가입시 승인 절차 없이 바로 스케쥴을 관리할 수 있으면 문제가 발생할 수 있기에
회원가입한 교사에게 회원 가입한 교사의 권한 인가와 회수를 할 수 있다. - 학생의 담임 교사를 변경할 수 있다.
'갑'선생님에서 '을'선생님으로 담임교사를 변경할 때, 시간이 겹칠 경우 오류메시지를 보여준다. - 교사 계정을 삭제할 수 있으며 삭제할시, 시간표도 같이 삭제된다.
- 어플리케이션 실행시 자동으로 1개의 계정만 생성된다.
- 회원 가입한 후, 관리자의 권한 인가를 받은 교사만 역할을 수행 할 수 있다.
- 학생을 등록, 삭제하고 시간표를 변경할 수 있다.
- 학생을 삭제할 경우, 학생이 등록한 시간표가 같이 사라진다.
- 교사별 스케쥴이 따로 있어 '갑'선생님이 월요일 1시에 수업이 있어도 '을'선생님이 월요일 1시에 수업을 할 수 있다.
-
담당 교사가 등록해줬을 경우, 수업을 조회하거나 신청, 변경을 할 수 있다.
-
교사 회원가입을 통해 회원가입을 할 경우, BCrypt를 통해 비밀번호가 암호화 되고 관리자의 인가를 받아서 학생의 수업을 삭제할 수 있다.
-
누구나 관리자 아이디에 접근이 가능하도록 되어있기 때문에 주기적(1시간) 단위로 비밀번호가 README의 로그인 정보에 있는 비밀번호로 갱신되며 실제로 서비스할 경우, 이 기능은 탑재되지 않는다.
-
입력한 이메일과 아이디를 바탕으로 아이디 찾기 및 비밀번호 찾기가 가능하다.
-
아이디는 가입시 입력한 이메일로 gmail을 통해 전송되며 비밀번호도 마찬가지로 가입시 입력한 gmail을 통해 발송된 인증번호를 바탕으로 비밀번호를 재설정할 수 있다.
🔗 김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵
🔗 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)
