Skip to content

devhong96/scheduler-MSA

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

33 Commits
 
 
 
 
 
 

Repository files navigation

📅 Scheduler-MSA (1인 개발)

Synology NAS를 기반으로 교사와 학생의 수업을 예약하고 관리할 수 있는 수강 신청 어플리케이션입니다.

이 프로젝트는 2023년에 모놀리식에서 시작하여 마이크로서비스(MSA)로 조금씩 전환되는 과정을 기록하고 있습니다. 각 기능은 독립적으로 배포되고 확장 가능한 구조로 재설계 되었으며, 주문 서비스를 제외한 각 서비스 API에 대하여 테스트 케이스가 작성되어 있습니다.

🔗 모놀리식 버전 GitHub 저장소: https://github.com/devhong96/scheduler

🔗 모놀리식 버전 배포 링크: https://seho0218.synology.me:3206


📌 Git 저장소 목록

🛠️ Infra

Service Description Status / Repository
Discovery Service 서비스 디스커버리 🔗 GitHub Repository
Config Service 환경 설정 관리 🔒 비공개
Config 환경 설정 🔒 비공개

🚀 Application Services Repository

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

🚀 서비스 엔드포인트


🛠️ 기술 스택 (Tech Stack)

구분 기술
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

🖥️ Infrastructure

  • 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)

⚙️ Scheduler-MSA Architecture Diagram

scheduler.png


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에 저장하면 트랜잭션 커밋 후, 비동기 발행으로 큐 장애 시에도 유실 없이 재전송 가능하도록 구성

🏗️ 설계 특징

사용자 관리 (Member Management)

  • 회원 가입 및 인증: 이메일 인증을 통해 안전한 회원가입 절차와 비밀번호 찾기 기능을 제공

  • 교사 등록 승인: 관리자가 교사의 회원 가입 요청을 검토하고 승인

  • 학생 등록 승인: 교사는 학생의 회원가입을 승인

수업 및 스케줄 관리 (Course & Schedule Management)

  • 스케줄 설정: 교사가 수업을 진행할 수 있는 날짜와 시간을 자유롭게 등록하고 관리

  • 수강 신청: 학생이 교사가 등록한 스케줄을 확인하고 실시간으로 수강을 신청

결제 및 시스템 (Payment & System)

  • 온라인 결제: 카카오, 네이버, 나이스페이 등 다양한 PG사와 연동하여 편리한 결제 기능을 제공

  • 안정적인 예약 처리: Redisson 분산 락을 통해 동시성 문제 해결

  • 신뢰성 있는 데이터 처리: Kafka와 RabbitMQ 기반의 비동기 이벤트를 통해 결제, 예약 등의 데이터를 안정적으로 처리


기본 기능

공통 기능

  • 모든 입력 조회 폼에서 입력해야하는 칸에 아무것도 입력하지 않은 경우 오류 메시지가 발생한다.
  • 교사와 관리자는 이메일을 통해 아이디 찾기와 비밀번호 찾기를 할 수 있으며 이메일 변경도 가능하다.
  • 기본적으로 선착순으로 처리되며 학생이 1시에 신청을 했을 경우,다른 학생은 1시를 선택할 수 없다.
  • 학생 명부에 등록된 학생만 수강 신청과 시간표 변경을 할 수 있다.
  • Spring security 와 관리자 계정을 통해 교사 아이디에 승인 절차를 부여할 수 있도록 되어있다.
  • 관리자 계정은 최고 권한을 갖기 때문에 회원가입을 통해 계정이 생성되지 않고
    어플리케이션 실행시 하나의 계정만 생성되며 생성되어 있을 경우 추가 생성되지는 않는다.

관리자

  • 공지사항을 작성 및 수정 삭제할 수 있다.
  • 교사의 권한과 역할을 포함한다.
  • 교사 회원 가입시 승인 절차 없이 바로 스케쥴을 관리할 수 있으면 문제가 발생할 수 있기에
    회원가입한 교사에게 회원 가입한 교사의 권한 인가와 회수를 할 수 있다.
  • 학생의 담임 교사를 변경할 수 있다.
    '갑'선생님에서 '을'선생님으로 담임교사를 변경할 때, 시간이 겹칠 경우 오류메시지를 보여준다.
  • 교사 계정을 삭제할 수 있으며 삭제할시, 시간표도 같이 삭제된다.
  • 어플리케이션 실행시 자동으로 1개의 계정만 생성된다.

교사

  • 회원 가입한 후, 관리자의 권한 인가를 받은 교사만 역할을 수행 할 수 있다.
  • 학생을 등록, 삭제하고 시간표를 변경할 수 있다.
  • 학생을 삭제할 경우, 학생이 등록한 시간표가 같이 사라진다.
  • 교사별 스케쥴이 따로 있어 '갑'선생님이 월요일 1시에 수업이 있어도 '을'선생님이 월요일 1시에 수업을 할 수 있다.

학생

  • 담당 교사가 등록해줬을 경우, 수업을 조회하거나 신청, 변경을 할 수 있다.

  • 인증 및 보안

  • 교사 회원가입을 통해 회원가입을 할 경우, BCrypt를 통해 비밀번호가 암호화 되고 관리자의 인가를 받아서 학생의 수업을 삭제할 수 있다.

  • 누구나 관리자 아이디에 접근이 가능하도록 되어있기 때문에 주기적(1시간) 단위로 비밀번호가 README의 로그인 정보에 있는 비밀번호로 갱신되며 실제로 서비스할 경우, 이 기능은 탑재되지 않는다.

  • 입력한 이메일과 아이디를 바탕으로 아이디 찾기 및 비밀번호 찾기가 가능하다.

  • 아이디는 가입시 입력한 이메일로 gmail을 통해 전송되며 비밀번호도 마찬가지로 가입시 입력한 gmail을 통해 발송된 인증번호를 바탕으로 비밀번호를 재설정할 수 있다.


📚 참고한 강의

🔗 김영한의 스프링 로드맵

🔗 김영한의 스프링 부트와 JPA 실무 완전 정복 로드맵

🔗 Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)

🔗 스프링부트로 직접 만들면서 배우는 대규모 시스템 설계 - 게시판

🔗 대규모 트래픽 처리를 위한 부하테스트 입문/실전

About

(개인프로젝트) 교사와 학생의 시간대 기반 수강신청 마이크로서비스 시스템

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors