프로젝트 주제는 "물류 관리 및 배송 시스템을 위한 MSA 기반 플랫폼 개발" 입니다.
MSA 설계를 하기 위해 서비스를 분리하기로 하였습니다.
이때, 어떤 기준으로 분리할 것인가 고민에 휩싸이는데 DDD 특강을 토대로 애그리거트 루트를 파악하고, 독립적으로 확장/축소가 가능한 컨텍스트로 분리하여 ERD 설계를 진행하였습다.
마이크로 서비스 간 통신 방식은 동기식 호출 구조로 이뤄지는데요. 트래픽이 증가하게 되면 서비스 증설과 함께 병목지점이 생기는 문제도 해결해야 할 사항입니다.
- 객체/마이크로 서비스 간 의존성 순환 문제
- 분산된 서비스의 데이터 일관성을 위한 트랜잭션 처리
- 분산된 서비스의 로그 중앙화 환경 구성 문제
기본적인 요구사항은 정해져 있지만, 그 밖의 요구사항은 팀 자체에서 세부적인 내용들을 결정하고 개발을 진행하여야 합니다. 처음 적용해보는 MSA + Mono repo 설계로 인해 어려움 투성이지만 직접 부딪혀보면서 한 층 더 성장할 수 있는 기회라는 생각이 듭니다.
이번 프로젝트에서 제가 담당한 도메인은 "배송", "배송 경로 기록" 입니다.
요구사항을 자세히 분석 및 정리하고, 어떻게 다른 애플리케이션과 rabbitMQ 또는 kafka를 활용하여 소통할 수 있을지 구상해보면 프로젝트 개발에 도움이 될 것 같습니다.
고려해 볼 사항
- API 연동
- 데이터 무결성 유지
- 서비스 간 통신의 신뢰성 확보
목표
- MSA 복장성 이해
- MSA 구축을 통해 실무에서 발생할 수 있는 문제를 간접적으로 경험 및 해결
현재 아래 개발 프로세스 중, 테이블 명세서 및 ERD 작성 까지 진행되었습니다.
개발 프로세스
더보기
- 개요
- B2B 물류 관리 및 배송 시스템
- 각 지역에 허브 센터 존재, 각 허브 센터에서 여러 업체의 물건 보관
- 배송 요청 : 상품이 허브 → 목적지 허브 로 이동
- 프로세스
- 시스템 구조 - 도별 공급 허브 : 각 허브에서 해당 도 내의 모든 주문, 재고 관리, 물류 운영을 담당
- 식품 가공 업체 역할 : 경기도에 위치한 건조 식품 가공품 생산 업체
- 주문 발생 : 부산에 위치한 도매 업체가 물류로 연락하여 50개 오징어 가공품 주문
- 물류 처리 및 재고 이동 : 경기도 허브 → 부산 허브 로 제품 이동은 허브 배송 담당자를 통해 이동 경로에 따라 부산 허브로 제품 전달
- 최종 수령 : 부산 허브 → 수산물 도매 업체 로 제품 전달은 부산 허브 소속의 업체 배송담당자가 물품을 주문한 수산물 도매 업체로 배송
- 요구사항 확인
- 사용자 관리
- 권한
- 마스터 관리자 - 모든 기능 권한
- 허브 관리자 - 해당 허브, 배송 담당자, 업체 관리
- 배송 담당자 - 배송
- 업체 담당자 - 업체 정보, 등록한 상품 관리
- 사용자 비활성화 시 deleted_by, deleted_at 필드로 관리
- 권한
- 허브 관리 - 허브 위치 총 17곳 고정
- 허브간 이동정보 관리 - 데이터 조회를 통해 허브 간 경로 매핑 데이터를 사용
- 배송 담당자 관리 - 타입별 업무 구분
- 허브 배송 담당자 : 물류 시스템 전체 총 10명
- 업체 배송 담당자 : 허브 소속으로, 각 허브별 10명(총 170명)
- 업체 관리 - 모든 업체는 특정 허브 소속됨
- 생산업체 supplier
- 수령업체 recipients
- 상품 관리 - 모든 상품은 특정 업체와 허브에 소속됨
- 주문 관리
- 주문 생성 및 취소 : 주문 생성 → 재고 감소, 주문 취소 → 해당 수량 복원, 재고 없는 경우 주문 실패
- 배송 관리
- 배송 및 배송 경로 기록은 주문 생성과 함께 생성됨
- 슬랙 메시지 관리
- 슬랙 메시지 발송은 엔티티 저장
- 로그인한 모든 사용자 및 내부 시스템에서 메시지 발송 가능
- 기타 공통 사항
- 논리적 삭제 관리
- API 호출 기반 연동 - 서비스 간 데이터 연관성 유지 및 데이터 변경 시 반영할 수 있는 통신 구조 설계
- 트랜잭션 관리 - 일관성 유지, 실패 시 전체 롤백 처리
- 개발 요구 사항
- MSA 기반 아키텍쳐 - 각 서비스가 독립적으로 배포, 확장, 유지보수되도록 설계
- 서비스 간 통신 - REST API, FeignClient 이용(기본 구성으로 권장)
- 인프라 확장 - 시스템 설계 간결하고, MSA app이 수평 확장 될 수 있도록 구성
- 기술 스택
- 백엔드 : Spring Boot 3.x
- 데이터베이스 : PostgreSQL
- 빌드 툴 : Gradle
- API 문서화 : Swagger API 문서 자동화 라이브러리 사용
- 서비스 디스커버리 : Spring Cloud Eureka 사용하여 서비스 관리
- 버전 관리 : Git(GitHub, GitLab, Bitbucket 등)
- 프로젝트 구조
- Layered Architecture : Controller, Service, Domain 계층
- DDD(도메인 주도 설계) 적용
- Entity, DTO 분리
- API 설계
- 서비스 경계 결
- 데이터베이스
- 분산 데이터베이스 : 논리적 또는 물리적으로 독립된 데이터베이스 사용
- Audit 필드 : 데이터 감사 로그 기록
- 보안
- JWT 인증
- 권한 확인
- 비밀번호 암호화
- 데이터 유효성 검사
- 사용자 관리
- 테이블 명세서 및 ERD 작성
- 각 서비스가 독립적으로 동작하므로, 별도의 데이터베이스 스키마를 설계(스키마 분리)
- 각 서비스가 독립적으로 동작하므로, 별도의 데이터베이스 스키마를 설계(스키마 분리)
- 인프라 설계도 작성
- 서버별 통신 방식, 데이터 저장소, 메시지 브로커, API 게이트웨이 등 인프라 요소를 결정
- https://app.diagrams.net/ 사용하여 설계도 작성
- API 명세서 작성
- 백엔드 개발
- 협업 규칙 정하기 - 브랜치 정책, PR 정책, 협업 방식
- 코드 리뷰
- 테스트 및 버그 수정
- 개별 기능 테스트 : 마이크로 서비스별 단위 테스트 & 통합 테스트 작성
- API 실행할 수 있는 테스트 스크립트 or 툴 이용하여 전체 API 커버하는 테스트를 자동화, 로컬에서 바로 사용할 수 있도록 준비
필수 기능
더보기
- 배송담당자 관리
- 효율적인 순차적 배정을 위한 구현 : 배송 담당자 상태(배달중, 대기중)에 따라 대기 중인 담당자List만 라운드로빈으로 할당
- 배차 관리 시스템 : 확장성을 위해 차량 유형(차량톤수, 차폭 등)을 고려하여 물량 분배 필요
- 추가적으로, 허브 배송 담당자는 총 10명으로 왕복/편도 개별적으로 배송 배정 필요
- 배송 관리(주문-배송 서비스간 통신은 비동기 MQ 방식, GPS 이용한 Geofencing 기술로 실시간 경로 추적 )
- 주문 생성되면 주문 데이터를 주문 토픽에 메시지 생성하여 배송, 배송 경로기록 생성
- 배송 담당자에서 배송 순번이 정해지면 배송 토픽에 메시지를 주문에 전달하여, 주문 도메인에서 발송 허브 담당자에게 배송 예상 시간 알림 처리할 수 있도록 처리 및 주문 현재 상태를 변경
- 업체 배송 담당자에게 슬랙 알림 발송 - 실시간 배송 추적
- 배송 데이터 검색 최적화
우아한 형제들 운송 관리 시스템(TMS)
올리브영 배송 및 물류
도전 기능
'팀프로젝트' 카테고리의 다른 글
DDD Aggregate 관점에서 비즈니스 시나리오 (0) | 2025.03.13 |
---|---|
MSA와 DDD 적용하여 프로젝트 구성하기 위한 이해 필요 (0) | 2025.03.12 |
# Jira 이슈와 Github 연동 (0) | 2025.02.20 |
# 단위 테스트 (0) | 2025.02.20 |
# 서비스 단위 테스트 코드 작성 (2) | 2025.02.18 |