-
본 프로젝트는 멀티 모듈 구조의 Springboot MSA 개발 템플릿 프로젝트입니다.
각 마이크로 서비스는 기능별, 서비스 도메인별 분리되어 있으며, build.gradle 파일을 완전히 분리하여 모듈별 독립적 빌드 환경을 구성하였습니다. -
MSA 의 마이크로 서비스 단위, 모듈 단위, 기능 단위 구현이 되어 있는 프로젝트로,
자동 로깅 처리, JWT 인증/인가 처리, 설정 상수값 응집 처리, API 문서 생성 방법, 데이터베이스 연동 방법, 서버 분산 및 Kafka 연동 방식 등...
구조적으로 명확히 분리하였으며, 클린 코드를 지향하였으므로,
실제 프로젝트에 적용할 기술에 대한 테스트 코드 작성, 및 이식이 용이 합니다.
실제 상황에 사용될 기능들을 재활용 가능하게 구분하였으므로,
추후 어떤 프레임워크를 습득하더라도 이를 기반으로 빠른 습득이 가능합니다.
(ex : 별도 백엔드 프레임워크 습득시 본 프로젝트에서 지원하는 기능과 구조를 카피 하는 방식으로 구현하면 실용적인 코드 개발 능력 습득이 가능하며, 실무에 작성 코드 바로 적용 가능.)
본 프로젝트에서 각 모듈은 MSA 에서의 Micro Service 를 나타냅니다.
각 모듈별 상호간 종속성은 가지지 않으며,
각 서비스 주제별로 구분지었습니다.
위와 같은 구조로 인하여 얻을 수 있는 장점은,
모듈화의 장점인 이식성의 향상과 코드간 결합의 약화를 이루어내고,
구조의 일관된 규칙을 통해 프로젝트 파악의 난이도를 낮추고,
모듈별 단위 테스트를 따로 두어 모듈별 신뢰도를 높이고 분리하여
오래된 코드에 들어가는 에너지 소모를 막을 수 있으며,
각 서비스별 모듈로 분리되어 상호간 코딩 스타일이 다른 숙련된 개발자들 사이의 협업 효율을 높일 수 있습니다.
각 Micro Service 모듈은 src/main/{패키지 경로}/ApplicationMain.kt 파일로 실행 시킬 수 있습니다.
모듈에 따라 필요한 서드 파티 프로그램이 필요한 경우가 있습니다.
이때는 모듈 내의 README.md 파일을 확인하시고, 대부분의 경우 external_files 안에 미리 설정된 도커 파일이 있으므로,
이를 실행시킨다면 환경 준비가 될 것입니다.
각 모듈별 점유 포트 번호는 settings.gradle.kts 파일 안에 모듈 설정과 같이 주석으로 제공됩니다.
본 프로젝트의 멀티 모듈 구조는 범용성을 크게 고려하여 설계하였습니다.
반드시 MSA 를 구현하지 않더라도 상관이 없지만, MSA 를 추천하는 바입니다.
제가 MSA 를 구성한다면,
MSA 의 근본적인 목적이 아키텍쳐의 명확함을 향상시키는 것이므로, 문서화가 첫단계입니다.
설계 단계에서 DDD 에 따라 서비스 도메인과 하부 도메인을 설계한 후,
마이크로 서비스 설계에 맞게 프로젝트를 분리하여 각 서비스를 구현하는 방식을 사용할 것이며,
더 나아가서 Spring Cloud(API 기반이므로 NodeJS, Python 서버 등 호환 가능) 스택과 같은 마이크로 서비스 툴을 사용하여,
MSA 운영시의 안정성을 재고할 것입니다.
Spring Cloud 에 대한 예시 모듈 역시 본 프로젝트 내에 포함되어 있습니다.
- module-template :
템플릿 모듈
멀티 모듈 구조를 구성하는 최소 단위의 모듈입니다.
multiple profile yml 설정, logback 설정, 루트 페이지 구현,
Swagger 문서 설정, 요청/응답 자동 로깅 설정
위와 같은 기능이 구성되어 있습니다. - module-cloud-* :
Spring Cloud 사용 샘플용 모듈입니다.
백업용으로 수평적 확장된 eureka 서버를 3개 두었으며,
eureka 로드밸런서로 round robin 방식으로 트래픽이 분산되게 만든 클라이언트 서버 2개,
요청을 한곳으로 모아주는 gateway 서버를 하나 두었습니다. - module-sample-* :
기능 테스트용 모듈들입니다.
예를들어 sample-jpa 모듈의 경우는 jpa 기술을 사용하기 위해 필요한 최소한의 환경 정보를 가지고 있으며,
이에 대한 테스트 코드들을 포함하고 있습니다.
spring-quartz, spring-batch, apache-kafka, socket, mongodb, redis 와 같은 기술별 샘플 모듈이 있고,
etc 샘플 모듈은 jpa 입출력과 redis 공유 락을 통한 무결성 안정화에 대한 샘플과 같이 여러 기술들이 복합된 기술이나
그외 분류가 어려운 샘플 코드를 구현하는 모듈입니다. - module-auth :
인증/인가 도메인 기능을 담당하는 auth 모듈입니다.
회원 가입, 회원 정보 수정, 회원 탈퇴 등의 기능을 담당하며,
인증/인가 체계는 JWT 를 사용하며, Spring Security 를 사용합니다.
토큰 인증 방식의 장점을 살리기 위하여 메모리 사용량 및 데이터베이스 접근을 최소화 하였습니다.
Redis 를 사용한 공유 메모리를 통하여 블랙리스트 방식을 사용하였으며,
이로인하여 강제 회원 정지 처리, 토큰 만료 처리 등의 세션 인증과 같은 기능 역시 구현하였습니다. - module-payment(예정) :
결제 기능을 마이크로 서비스 단위로 분리한 모듈입니다.
무통장 입금, 실시간 계좌이체, 그외 온라인 payment 서비스를 자유롭게 붙이고 제거하고 수정이 가능한 구조를 지향할 것입니다.
다른 모듈에서 이를 사용할 때에는 독립된 테이블 사이에 브릿지 테이블을 두어 정보 공유를 하고,
메시지 큐와 같은 것으로 통신하게 할 것입니다. - module-service-board :
module-auth 의 인증/인가 기능과 연계되는 게시판 서비스 모듈입니다.
기본적인 CRUD 를 jpa 와 QueryDSL 로 구현하였으며,
게시글 조회수 update 와 같이 다수 비회원의 동시 요청이 발생할 가능성이 많은 API 는
redis 공유락을 사용하여 경쟁 상태(Race Condition) 처리를 하였습니다.
자세한 내용은 모듈 내의 README 파일을 확인하세요. - module-service-rental-reservation :
범용 대여 상품 예약 서비스 모듈입니다.
고객 사용 API 와 관리자 사용 API 를 나누고 권한에 따른 인가 처리를 Spring Security 로 구현하였습니다.
다국적 지원, 상품 재고품 입출고 사이클, 상품 예약 사이클, 결제 모듈과의 분리 처리, 대여품 반납 연체, 손망실 처리 등의 기능을 설계 및 구현했으며,
장소, 제품 뿐 아닌, 이벤트, 진료 등의 모든 종류의 대여 상품 유형에 대하여 예약 기능을 구현하기 위해 필수적인 내용들을 만들어냈습니다.
서비스 구현시 중시한 것은, 설계의 완성도, 기능의 범용성, 확장성, 예약 상태에 따른 적절한 예외처리에 따른 에러 방지, Redis 공유락을 사용한 데이터 무결성 처리에 신경을 썼습니다.
자세한 내용은 모듈 내의 README 파일을 확인하세요.
(해당 모듈의 external_files 폴더 안에 알고리즘 도표, ERD 등의 설계자료를 동봉하였습니다.)
각 모듈별 세부 설명은 각 모듈 경로 내의 README.md 파일을 참고하세요. (현재 각 모듈별 README 작성중)