Skip to content

dongkyunkimdev/spring-playground

Repository files navigation

spring-playground

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를 사용하여 이벤트 기반의 비동기 방식으로 호출한다.

ERD

image

프로젝트 진행 과정

프로젝트 주요 관심사

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

Run Configuration

  • 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

About

Playground for Java and Spring Framework

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published