Skip to content

About

order, delivery, inventory, hub domain service

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

ย 

History

950 Commits

Folders and files

NameName
Last commit message
Last commit date
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

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-auto๋ฅผ validate ๋˜๋Š” 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