Kotlin으로 구현한 Q-Pang 프로젝트를 Java로 마이그레이션하고, 살을 붙이며 Java/Spring Playground로 활용하기 위한 프로젝트입니다.
- spring-playground는 총 4가지의 마이크로서비스로 이루어진다.
- 각 마이크로서비스로의 접근은 Gateway Server를 통해 이루어지며, 사용자 인증은 Gateway Server에서 수행한다.
- Gateway Server에서 request header에 담긴 jwt를 사용하여 사용자를 검증하고, payload에 담긴 username을 꺼내어 request header에 담아 마이크로서비스를 호출한다.
- Database Schema, Eureka Service Url, JWT Secret 등의 환경 정보는 Config Server에서 중앙 집중하여 관리한다.
- 마이크로서비스간 호출이 필요한 경우, 여러 컨텍스트간에 항상 일관된 데이터가 필요하면 openfeign을 사용하여 동기 방식으로 호출하고, 최종 일관성으로 요구사항을 충족시킬 수 있는 경우 Kafka를 사용하여 이벤트 기반의 비동기 방식으로 호출한다.
- DDD의 전략적 설계를 적용하여 마이크로서비스 도출
- Hexagonal Architecture를 적용하여 비즈니스 로직이 외부 요소에 의존하지 않도록 설계 및 구현
- Apache Kafka를 사용하여 이벤트 기반의 비동기 호출을 통해 마이크로서비스간의 최종 일관성 유지
- JUnit5를 사용하여 예측 가능한 모든 케이스에 대한 테스트 코드 작성
- Spring Cloud, Docker를 사용하여 Cloud Native Application 구성
- 부하 테스트를 통한 주요 병목 지점 확인(WIP)
- DB 다중화를 통한 SPOF 방지 및 부하 분산(WIP)
- 빈번하게 조회되고 실시간성 조건이 존재하지 않는 데이터를 대상으로 캐싱 전략을 도입하여 DB 부하 분산(WIP)
- 최종 일관성이 보장되도록 분산 트랜잭션 관리 전략 도입(WIP)
- 마이크로서비스간 트랜잭션 추적을 고려한 로그 시스템 구축(WIP)
- 마지막 로그인 시간을 기준으로 유저를 비활성화 시키기(WIP)
- 가상의 트래픽을 상정하여 Thread Pool, DB Connection Pool 최적화(WIP)
- flyway:
core:flywayClean core:flywayMigrate
- test :
clean core:flywayClean core:flywayMigrate test --continue
- all module build :
clean bootJar -x test
- Docker Desktop 설치
- 프로젝트 root 경로에서 아래 순서대로 실행
docker-compose -f infra/docker/playground-local.yml up -d playground-mysql
- Run Configuration 에서 구성한 flyway 실행
sh infra/gradle-build.sh
sh infra/docker/docker-image-build.sh
docker-compose -f infra/docker/playground-local.yml up -d