์ผ๋ฑ ๋ฌผ๋ฅ (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) : ์๋น์ค ๊ฐ ๋ฐ์ดํฐ ์กฐํ ๋ฐ ๊ฒ์ฆ
๋น๋๊ธฐ (Kafka) : ์ด๋ฒคํธ ๊ธฐ๋ฐ ์ฒ๋ฆฌ (์ฃผ๋ฌธ ์์ฑ -> ๋ฐฐ์ก ์์ฑ, ๋ฐฐ์ก ์ํ ๋ณ๊ฒฝ -> ์ฌ๋ ์๋ฆผ)
๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ
ํ๋์ 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 ๊ณตํต ์ค์
ํ ํฝ
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
git clone < repository-url>
cd first-logistics
.env ์ฃผ์ ํญ๋ชฉ์ .env.sampleํ์ธ
# ์ ์ฒด ๋น๋ + ์คํ
docker compose up --build -d
# ์ํ ํ์ธ
docker compose ps
# ๋ก๊ทธ ํ์ธ
docker compose logs -f delivery-service
# ์ข
๋ฃ
docker compose down
# ์ข
๋ฃ + ๋ณผ๋ฅจ ์ญ์ (DB ์ด๊ธฐํ)
docker compose down -v
5. API ํ
์คํธ (IntelliJ HTTP Client)
http/ ๋๋ ํ ๋ฆฌ์ .http ํ์ผ์ IntelliJ์์ ์์๋๋ก ์คํํฉ๋๋ค.
delivery-setup.http - ์ฌ์ ๋ฐ์ดํฐ ์
์
(ํ์๊ฐ์
, ํ๋ธ/์
์ฒด ์์ฑ, ์ฃผ๋ฌธ ์์ฑ)
delivery.http - ๋ฐฐ์ก ์๋น์ค 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 ํ์ผ
๋ณ๋ ํด ์์ด 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.