Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

950 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

일등 물류 (First Logistics)

MSA 기반 물류 관리 플랫폼입니다. Monorepo + Multi-Module 구조로 DDD 4계층 아키텍처를 적용하며, 주문 생성부터 배송 완료까지의 전체 물류 흐름을 관리합니다. 서비스 간 통신은 Kafka를 활용한 비동기 이벤트 메시징과 FeignClient 기반 동기 호출을 병행합니다.


목차


팀원 역할분담

팀원 담당 도메인
공통 (다같이) common, common-jpa, common-event, common-security, common-swagger
승원 업체, 상품(재고)
진건 회원(인증, 권한), API Gateway(인증, 인가, 라우팅), common-security, Spring Cloud, Eureka
현희 알림(슬랙), AI
하은 주문
재빈 배송
세희 허브(경로)

기술 스택

구분 기술
Language Java 21
Framework Spring Boot 3.5.x, Spring Cloud 2025.0.1
Build Gradle 9.2.0 (Multi-Module)
Database PostgreSQL 16 (pgvector), Master/Slave 읽기-쓰기 분리
Cache Redis 7.2
Message Broker Apache Kafka (KRaft)
Query QueryDSL 5.0 (커서 기반 페이지네이션)
AI Spring AI (OpenAI, pgvector)
Service Discovery Spring Cloud Eureka
API Gateway Spring Cloud Gateway
인증/인가 Spring Security + Keycloak (JWT)
분산 추적 Zipkin
Infrastructure Docker, Docker Compose
API 문서 Swagger (SpringDoc OpenAPI)
Testing JUnit 5, Mockito, H2

프로젝트 목적

일등 물류는 전국 17개 허브를 기반으로 한 B2B 물류 배송 플랫폼입니다.

  • 주문 기반 배송 자동 생성: 주문 승인 시 Kafka 이벤트를 통해 배송이 자동으로 생성되고, 허브 간 최적 경로가 계산됩니다.
  • 배송 담당자 자동 배정: 허브별 배송 담당자가 순번 기반으로 자동 배정되며, 분산락으로 동시성을 제어합니다.
  • 실시간 배송 상태 추적: 배송 상태 변경 시 Kafka 이벤트를 통해 Slack 알림이 발송됩니다.
  • AI 연동: OpenAI를 활용한 메시지 생성 및 pgvector 기반 유사도 검색을 지원합니다.
  • 역할 기반 접근 제어: MASTER, HUB_MANAGER, DELIVERY_MANAGER, COMPANY_MANAGER 4단계 권한 체계를 적용합니다.

아키텍처

                          [Client]
                             |
                        [API Gateway]  ── JWT 검증, 라우팅
                             |
                      [Eureka Server]  ── 서비스 디스커버리
                             |
        ┌────────┬───────┬───────┬────────┬────────┬────────┬────────┐
        |        |       |       |        |        |        |        |
     [User]  [Hub]  [Company] [Product] [Order] [Delivery] [Noti]  [AI]
        |        |       |       |        |        |        |        |
        └────────┴───────┴───────┴────┬───┴────────┴────────┴────────┘
                                      |
                    ┌─────────────────┼─────────────────┐
                    |                 |                 |
              [PostgreSQL]       [Kafka]          [Redis]
            Master / Slave     이벤트 브로커        캐시

서비스 간 통신

  • 동기 (FeignClient): 서비스 간 데이터 조회 및 검증

    일등물류-Event Storming
  • 비동기 (Kafka): 이벤트 기반 처리 (주문 생성 -> 배송 생성, 배송 상태 변경 -> 슬랙 알림)

    일등물류-Event Storming (3)

데이터베이스 구조

하나의 PostgreSQL 인스턴스에서 논리적으로 분리합니다.

PostgreSQL (5432)
├── DB: first-logistics (Master - 쓰기)
│   ├── delivery 스키마
│   ├── orders 스키마
│   ├── hub 스키마
│   ├── company 스키마
│   ├── product 스키마
│   ├── users 스키마
│   ├── notification 스키마
│   └── ai 스키마
└── DB: first-logistics-slave (Slave - 읽기)
    └── (동일 스키마 구조, Logical Replication)
  • @Transactional -> Master DB
  • @Transactional(readOnly = true) -> Slave DB

서비스 구성

서비스 담당 도메인 포트 설명
eureka-server 서비스 디스커버리 19090 모든 마이크로서비스 위치 관리
api-gateway API Gateway 80 외부 요청 라우팅 + 인증/인가
user-service 사용자, 인증 8080 회원가입(승인 기반), 로그인, JWT, Keycloak 연동
hub-service 허브, 허브간 이동정보 8083 17개 허브 관리, 허브 간 경로, Redis 캐싱
company-service 업체 8084 생산/수령 업체 관리
product-service 상품 8085 상품 및 재고 관리
order-service 주문 8082 주문 생성/취소, 재고 감소/복원, 배송 생성 트리거
delivery-service 배송, 배송경로, 배송담당자 8081 배송 전체 흐름 관리, 배송담당자 순번 배정
notification-service 슬랙 메시지 8086 AI 연동 메시지 생성, Slack API 발송
ai-service AI 8087 OpenAI 기반 메시지 생성, pgvector 유사도 검색

공통 모듈

모듈 설명
common 예외 처리, 공통 응답 포맷, ErrorCode/SuccessCode
common-jpa BaseEntity, JPA Auditing, Master/Slave DataSource 라우팅
common-event Kafka Producer/Consumer 공통 설정, ConsistentHashPartitioner
common-security @RequireRole/@OnlyMaster AOP, SecurityUtils, UserRole
common-swagger Swagger 공통 설정

Kafka 토픽

토픽 Producer Consumer 설명
order.accepted order-service delivery-service 주문 승인 시 배송 자동 생성
order.cancelled order-service delivery-service 주문 취소 시 배송 취소
user.status.changed user-service delivery-service 사용자 승인 시 배송담당자 자동 생성
delivery.created delivery-service notification-service 배송 생성 알림
delivery.status.changed delivery-service notification-service 배송 상태 변경 알림

인프라

인프라 포트 설명
PostgreSQL (pgvector) 5432 Master + Slave (Logical Replication)
Redis 6379 허브 정보 캐싱, 분산락
Kafka (KRaft) 9092 / 29092 이벤트 브로커 (내부/외부)
Kafka UI 8989 Kafka 토픽 모니터링
Zipkin 9411 분산 추적
Keycloak 3300 OAuth2/OIDC 인증 서버

프로젝트 구조

펼쳐보기
first-logistics/                    # 루트 (Monorepo)
├── common/                         # 공통 모듈 (예외, 응답 포맷)
├── common-jpa/                     # JPA Auditing, Master/Slave 라우팅
├── common-event/                   # Kafka 공통 설정
├── common-security/                # 권한 AOP (@RequireRole)
├── common-swagger/                 # Swagger 공통 설정
├── eureka-server/                  # 서비스 디스커버리
├── api-gateway/                    # API Gateway
├── user-service/                   # 사용자 서비스
├── hub-service/                    # 허브 서비스
├── company-service/                # 업체 서비스
├── product-service/                # 상품 서비스
├── order-service/                  # 주문 서비스
├── delivery-service/               # 배송 서비스
├── notification-service/           # 알림 서비스
├── ai-service/                     # AI 서비스
├── docker/
│   └── postgres/init.sql           # DB + 스키마 초기화
├── http/                           # IntelliJ HTTP Client 테스트
│   ├── delivery-setup.http         # 배송 통합 테스트 셋업
│   ├── delivery.http               # 배송 API 테스트
│   └── http-client.env.json        # 환경변수
├── docker-compose.yml
├── .env                            # 환경변수 (Git 미포함)
└── .env.sample                     # 환경변수 템플릿

도메인 서비스 패키지 구조 (DDD 4계층)

{domain}-service/
└── src/main/java/com/firstlogistics/{domain}/
    ├── presentation/               # Controller, Request/Response DTO
    ├── application/                # Service (Command/Query 분리), Port
    ├── domain/                     # Entity, VO, Repository 인터페이스
    └── infrastructure/             # JPA 구현체, Kafka, FeignClient

실행 방법

사전 요구사항

  • Java 21
  • Docker 24+, Docker Compose v2+
  • Git

1. 프로젝트 클론

git clone <repository-url>
cd first-logistics

2. 환경변수 설정

cp .env.sample .env

.env 주요 항목은 .env.sample확인

3. Docker Compose 실행

# 전체 빌드 + 실행
docker compose up --build -d

# 상태 확인
docker compose ps

# 로그 확인
docker compose logs -f delivery-service

# 종료
docker compose down

# 종료 + 볼륨 삭제 (DB 초기화)
docker compose down -v

4. 접속 URL

서비스 URL
API Gateway http://localhost
Eureka Dashboard http://localhost:19090
Kafka UI http://localhost:8989
Zipkin http://localhost:9411
Keycloak http://localhost:3300

Swagger UI

서비스 URL
user-service http://localhost:8080/swagger-ui/index.html
delivery-service http://localhost:8081/swagger-ui/index.html
order-service http://localhost:8082/swagger-ui/index.html
hub-service http://localhost:8083/swagger-ui/index.html
company-service http://localhost:8084/swagger-ui/index.html
product-service http://localhost:8085/swagger-ui/index.html
notification-service http://localhost:8086/swagger-ui/index.html
ai-service http://localhost:8087/swagger-ui/index.html

5. API 테스트 (IntelliJ HTTP Client)

http/ 디렉토리의 .http 파일을 IntelliJ에서 순서대로 실행합니다.

  1. delivery-setup.http - 사전 데이터 셋업 (회원가입, 허브/업체 생성, 주문 생성)
  2. delivery.http - 배송 서비스 API 테스트

API 엔드포인트

기본 API Gateway (http://localhost) 경유

서비스 주요 URL 패턴 설명
User /api/v1/users/** 회원가입, 로그인, 사용자 관리
Hub /api/v1/hubs/** 허브 CRUD, 허브 간 이동정보
Hub Connection /api/v1/hub-connections/** 허브 간 경로 관리
Company /api/v1/companies/** 업체 CRUD
Product /api/v1/products/** 상품 및 재고 관리
Order /api/v1/orders/** 주문 생성/취소/승인
Delivery /api/v1/deliveries/** 배송 CRUD, 상태 변경
Delivery Manager /api/v1/delivery-managers/** 배송 담당자 관리
Notification /api/v1/notifications/** 슬랙 알림

전체 물류 흐름

1. 주문 생성 (order-service)
   └─> Kafka [order.created] ─> 재고 예약 (product-service)
   └─> Kafka [stock.reserved] ─> 재고 예약 성공 수신

2. 주문 승인 (order-service)
   └─> Kafka [order.accepted] ─> 배송 생성 (delivery-service) + 재고 차감 (product-service)

3. 배송 생성 (delivery-service)
   └─> 허브 간 최적 경로 조회 (hub-service, FeignClient)
   └─> 배송 담당자 자동 배정 (분산락)
   └─> Kafka [delivery.created] ─> 주문 완료 처리 (order-service)
                                └─> 배송 담당자 알림 (notification-service)

4. 배송 진행
   허브 배송 시작 (start)
   └─> 허브 도착 (arrive-hub)
   └─> 허브 입고 (receive-hub)
   └─> [경유지 반복]
   └─> 업체 배송 시작 (start-company)
   └─> 배송 완료 (complete)
   └─> 각 단계마다 Kafka [delivery.status.changed]

5. 알림 발송 (notification-service)
   └─> 배송 이벤트 수신
   └─> AI 메시지 생성 (ai-service)
   └─> Slack 알림 발송

※ 실패 시 Saga 보상: 배송 생성 실패 -> 주문 자동 취소, 배송 취소 실패 -> 주문 서비스 보상

기술적 의사결정

주제 요약
DDD 4계층 아키텍처 표현/응용/도메인/인프라 계층 분리로 비즈니스 로직 보호, 도메인 엔티티와 JPA 엔티티 분리
CQRS 패턴 CommandService/QueryService 분리, Command는 도메인 엔티티, Query는 QueryDSL Projection 사용
이벤트 기반 비동기 통신 주문-배송 간 Kafka 이벤트로 결합도 최소화, at-least-once + 멱등성 보장
Saga 보상 트랜잭션 배송 생성 실패 시 delivery.creation.failed 이벤트로 주문 자동 취소
분산락 (Redisson) 배송 담당자 배정 시 동시성 제어, Facade 패턴으로 락 획득 후 서비스 호출
낙관적 락 배송/배송담당자 엔티티 @Version으로 동시 수정 충돌 감지
Master/Slave 읽기-쓰기 분리 common-jpa에서 RoutingDataSource로 readOnly 트랜잭션을 Slave로 라우팅
커서 기반 페이지네이션 offset 방식의 데이터 누락 문제 해결, createdAt + id 복합키 커서
Strategy 패턴 권한 검증 역할별 PermissionStrategy로 데이터 레벨 접근 제어
Port-Adapter 패턴 Application은 Port 인터페이스만 의존, FeignClient는 Infrastructure에서 Adapter로 구현

테스트

# 전체 테스트
./gradlew test

# 특정 서비스 테스트
./gradlew :delivery-service:test

# 테스트 리포트
open delivery-service/build/reports/tests/test/index.html

테스트 전략

레이어 전략 도구
Service Mockito + BDD 스타일 단위 테스트 JUnit 5, Mockito, AssertJ
Integration @SpringBootTest + H2 인메모리 DB JUnit 5, H2
E2E (수동) IntelliJ HTTP Client로 실제 서버 대상 API 흐름 검증 .http 파일

IntelliJ HTTP Client

별도 툴 없이 IDE에서 API를 호출하고, .http 파일을 Git으로 팀 전체가 공유합니다.

  • 연속 호출: JavaScript로 이전 응답값을 다음 요청에 활용 (회원가입 -> 로그인 -> 주문 생성 -> 배송 조회)
  • 환경 분리: http-client.env.json으로 환경별 URL/토큰 관리

권한 체계

권한 설명
MASTER 마스터 관리자 - 모든 기능 접근 가능
HUB_MANAGER 허브 관리자 - 담당 허브의 업체/배송담당자 관리
DELIVERY_MANAGER 배송 담당자 - 허브 배송 또는 업체 배송 담당
COMPANY_MANAGER 업체 담당자 - 소속 업체/상품 관리
  • Gateway에서 JWT 검증 후 사용자 정보를 헤더로 전달
  • 각 서비스에서 @RequireRole AOP로 역할 검증
  • DeliveryPermissionValidator Strategy 패턴으로 데이터 레벨 접근 제어

브랜치 전략

prod <- dev <- feat/{domain}/{layer}/{issue번호}-{설명}
예) feat/order/application/3-order-service-read

주의사항

  • .env 파일은 절대 Git에 커밋하지 마세요 (.gitignore에 포함됨)
  • 프로덕션 배포 시 ddl-autovalidate 또는 none으로 변경하세요
  • Keycloak 초기 기동에 1~2분 소요될 수 있습니다

라이선스

This project is for educational purposes.

About

order, delivery, inventory, hub domain service

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages