π± MSA κΈ°λ° λ¬Όλ₯ Β· λ°°μ‘ κ΄λ¦¬ νλ«νΌ
HubLinkλ μ£Όλ¬Έ, λ°°μ‘, νλΈ, μ
체, μν, μ¬κ³ , κ²°μ , μλ¦Ό κΈ°λ₯μ λ
립μ μΈ λ§μ΄ν¬λ‘μλΉμ€λ‘ λΆλ¦¬ν λ¬Όλ₯Β·λ°°μ‘ κ΄λ¦¬ νλ«νΌμ
λλ€.
Spring Cloud Gateway, Eureka, Config Serverλ₯Ό κΈ°λ°μΌλ‘ μλΉμ€ λΌμ°ν
κ³Ό λμ€μ»€λ²λ¦¬, μ€μ μ€μ κ΄λ¦¬λ₯Ό ꡬμ±νμμΌλ©°, Redis Streams, Kafkaλ₯Ό νμ©ν μ΄λ²€νΈ κΈ°λ° μ²λ¦¬ ꡬ쑰λ₯Ό μ μ©νμ΅λλ€.
λν Docker Compose κΈ°λ° λ‘컬 μ€ν νκ²½κ³Ό AWS EC2, RDS, ECR, ALB κΈ°λ° λ°°ν¬ κ΅¬μ‘°λ₯Ό ꡬμ±νμ¬ μλΉμ€λ³ λ
립 λ°°ν¬μ μ΄μ νμ₯μ±μ κ³ λ €νμ΅λλ€.
HubLinkλ MSA νκ²½μμ μ£Όλ¬Έ, μ¬κ³ , λ°°μ‘ λ± μλΉμ€ κ°μ λ°μνλ λΆμ° νΈλμμ
λ¬Έμ λ₯Ό μ§μ λ€λ£¨λ κ²μ λͺ©νλ‘ νλ€.
μ£Όλ¬Έ μμ± λ° μ¬κ³ μ°¨κ° κ³Όμ μμλ λμμ± μΆ©λμ΄ λ°μν μ μμΌλ―λ‘, λ½ μ λ΅κ³Ό νΈλμμ
μ²λ¦¬ λ°©μμ μ μ©νμ¬ λ°μ΄ν° μ ν©μ±μ 보μ₯νλ€.
λν Saga Orchestration κΈ°λ°μ νΈλμμ
κ΄λ¦¬ λ°©μμ μ μ©νμ¬ μ£Όλ¬Έ, μ¬κ³ , λ°°μ‘ μλΉμ€ κ° μμ
νλ¦μ μ μ΄νκ³ , μ€ν¨ λ°μ μ 보μ νΈλμμ
μ ν΅ν΄ μΌκ΄μ±μ μ μ§νλ€.
μΈλΆ API νΈμΆ μ€ν¨, λ©μμ§ μ²λ¦¬ μ€ν¨, νΉμ μλΉμ€ μ₯μ κ° λ°μνλλΌλ μ 체 μμ€ν
μ΄ μ€λ¨λμ§ μλλ‘ μ€ν¨ μνλ₯Ό μ μ₯νκ³ μ¬μ²λ¦¬ κ°λ₯ν ꡬ쑰λ₯Ό ꡬμ±νλ€.
λ©μμ§ νκ²½μμ λμΌ μ΄λ²€νΈκ° μ€λ³΅ μλΉλλλΌλ λμΌ μμ
μ΄ λ°λ³΅ μνλμ§ μλλ‘ λ©±λ±μ± μ²λ¦¬λ₯Ό μ μ©νλ€.
μ΅μ’
μ μΌλ‘ λ¨μν μλΉμ€λ₯Ό λΆλ¦¬νλ λ° κ·ΈμΉμ§ μκ³ , λ
립 λ°°ν¬, μ₯μ 격리, μ΄λ²€νΈ κΈ°λ° ν΅μ , λμμ± μ μ΄, λͺ¨λν°λ§μ μ§μ ꡬννλ©° MSAμ μ₯μ κ³Ό νκ³λ₯Ό ν¨κ» μ΄ν΄νλ κ²μ λͺ©νλ‘ νλ€.
μ΄λ¦
λ΄λΉ μμ
μ΄μ±κ·Ό
user-service, μΈμ¦/κΆν μ°λ, Redis, CI/CD
κΉμ μ
hub-service, company-service, ArchUnit
μ΅μ€κ·Ό
product-service, stock-service, Kafka
κΉμμ±
order-service, Kafka
λ°μ±μ°
delivery-service, λΆμ°λ½, Kafka
μ‘°νμ
ai-service, slack-service, λ°°ν¬
μλΉμ€
μ£Όμ κΈ°λ₯
User Service
νμκ°μ
, λ‘κ·ΈμΈ, JWT μΈμ¦, κΆν κ΄λ¦¬
Company Service
μ
체 λ±λ‘ λ° μ
체 μ 보 κ΄λ¦¬
Hub Service
νλΈ λ±λ‘, νλΈ κ° μ΄λ κ²½λ‘ κ΄λ¦¬
Product Service
μν λ±λ‘, μν μ‘°ν, μν μ 보 κ΄λ¦¬
Stock Service
μ¬κ³ κ΄λ¦¬, μ¬κ³ μ°¨κ° λ° λ³΅κ΅¬
Order Service
μ£Όλ¬Έ μμ±, μ£Όλ¬Έ μ‘°ν, μ£Όλ¬Έ μν κ΄λ¦¬, μ£Όλ¬Έ μ·¨μ
Delivery Service
λ°°μ‘ μμ±, λ°°μ‘ μν λ³κ²½, νλΈ μ΄λ μΆμ
Slack Service
Slack μλ¦Ό μ μ‘, μ΄λ²€νΈ κΈ°λ° λ©μμ§ μ²λ¦¬
AI Service
AI κΈ°λ° λ°μ‘ μν μμ± λ° λ©μμ§ μμ±
API Gateway
μΈμ¦ νν° μ²λ¦¬, μλΉμ€ λΌμ°ν
Eureka / Config Server
μλΉμ€ λμ€μ»€λ²λ¦¬ λ° μ€μ μ€μ κ΄λ¦¬
π μμ€ν
μν€ν
μ²
Service
Port
Description
eureka-server
19090
μλΉμ€ λμ€μ»€λ²λ¦¬ μλ²
api-gateway
19091
API Gateway
config-server
19092
Spring Cloud Config Server
Service
Port
Description
user-service
19093
μ¬μ©μ, μΈμ¦, κΆν κ΄λ¦¬
order-service
19094
μ£Όλ¬Έ κ΄λ¦¬
hub-service
19095
νλΈ λ° νλΈ κ²½λ‘ κ΄λ¦¬
company-service
19096
μ
체 κ΄λ¦¬
product-service
19097
μν κ΄λ¦¬
stock-service
19098
μ¬κ³ κ΄λ¦¬
delivery-service
19099
λ°°μ‘ λ° λ°°μ‘ κ²½λ‘ κ΄λ¦¬
slack-service
19100
Slack μλ¦Ό μ²λ¦¬
ai-service
19101
AI λ©μμ§ μμ± λ° κ΄λ¦¬
π External Infrastructure
Service
Port
Description
PostgreSQL
5432
κ΄κ³ν λ°μ΄ν°λ² μ΄μ€
Redis
6379
μΊμ, ν ν°, λΆμ°λ½
Zipkin
9411
λΆμ° μΆμ
Prometheus
9090
λ©νΈλ¦ μμ§
Grafana
3000
λͺ¨λν°λ§ λμ보λ
Java 17
Spring Boot 3.x
Spring Security
Spring Data JPA
Hibernate
JWT
Spring Cloud OpenFeign
Resilience4j
ArchUnit
π Messaging / Event Driven
Redis Streams
Apache Kafka
Spring Cloud Gateway
Eureka Service Discovery
Spring Cloud Config Server
Config Repository
AWS EC2
AWS RDS
AWS ECR
AWS ALB
AWS VPC
Public / Private Subnet
Internet Gateway
Docker
Docker Compose
GitHub Actions
π Monitoring / Tracing
Prometheus
Grafana
Zipkin
Spring Boot Actuator
hub-link
βββ core-common # μλΉμ€ κ³΅ν΅ λͺ¨λ
β βββ auth # μΈμ¦/μΈκ° κ³΅ν΅ μ²λ¦¬
β βββ error # κ³΅ν΅ μμΈ λ° μλ¬ μ½λ
β βββ JpaAuditing # JPA Auditing κ³΅ν΅ μ€μ
β βββ response # κ³΅ν΅ μλ΅ νμ
β βββ stream # μ΄λ²€νΈ μ€νΈλ¦Ό κ³΅ν΅ μμ/DTO
β
βββ eureka-server # μλΉμ€ λμ€μ»€λ²λ¦¬ μλ²
βββ config-server # μ€μ μ€μ κ΄λ¦¬ μλ²
β
βββ api-gateway # API Gateway
β βββ config # Gateway λ° Swagger μ€μ
β βββ exception # Gateway μμΈ μ²λ¦¬
β βββ filter # μΈμ¦/μΈκ° νν°
β βββ response # Gateway μλ΅ μ²λ¦¬
β βββ util # Gateway μ νΈ
β
βββ user-service # μ¬μ©μ, μΈμ¦, κΆν κ΄λ¦¬
βββ hub-service # νλΈ λ° νλΈ κ²½λ‘ κ΄λ¦¬
βββ company-service # μ
체 κ΄λ¦¬
βββ product-service # μν κ΄λ¦¬
βββ stock-service # μ¬κ³ κ΄λ¦¬
βββ order-service # μ£Όλ¬Έ κ΄λ¦¬
βββ delivery-service # λ°°μ‘ λ° λ°°μ‘ κ²½λ‘ κ΄λ¦¬
βββ slack-service # Slack μλ¦Ό μ²λ¦¬
βββ ai-service # AI λ©μμ§ μμ± λ° κ΄λ¦¬
main
develop
feature/*
hotfix/*
PR κΈ°λ° μ½λ 리뷰 μ§ν
Gemini Code Assist κΈ°λ° AI μ½λ 리뷰 μ μ©
μ½λ λ° Git 컨벀μ
λ¬Έμ κΈ°λ° νμ
μ§ν
νλ‘μ νΈ λ£¨νΈμ .env νμΌμ μμ±νκ³ μλ κ°μ νκ²½μ λ§κ² μμ ν©λλ€.
# Database
DB_URL = jdbc:postgresql://localhost:5432/hublink
DB_USERNAME =
DB_PASSWORD =
# Redis
REDIS_HOST = localhost
REDIS_PORT = 6379
REDIS_PASSWORD =
# Eureka / Config
EUREKA_URL = http://localhost:19090/eureka/
CONFIG_SERVER_URL = http://localhost:19092
# JWT
JWT_SECRET = change-me-change-me-change-me-change-me
# External API
SLACK_BOT_TOKEN = xoxb-your-slack-bot-token
AI_API_URL = https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent
AI_API_KEY = your-gemini-api-key
# Monitoring / Tracing
ZIPKIN_URL = http://localhost:9411/api/v2/spans
# ECR
ECR_REGISTRY = your-aws-account-id.dkr.ecr.ap-northeast-2.amazonaws.com
# Swagger
SWAGGER_GATEWAY_URL = http://localhost:19091
git clone https://github.com/organization/hublink.git
π νκ²½ λ³μ νμΌ μμ±
.env.example νμΌμ μ°Έκ³ νμ¬ νλ‘μ νΈ λ£¨νΈμ .env νμΌμ μμ±
νμν κ°μ λ‘컬 νκ²½μ λ§κ² μμ
π μ 체 μλΉμ€ λΉλ
ν
μ€νΈ μ μΈνκ³ λΉλ
./gradlew clean build -x test
π Docker Compose μ€ν
νΉμ μλΉμ€λ§ μ€ν
docker compose up -d api-gateway order-service delivery-service
π μ€ν μν νμΈ
docker compose logs -f api-gateway
π μ£Όμ μ μ μ£Όμ
Kafka κΈ°λ° μ΄λ²€νΈ μ€νΈλ¦¬λ° λμ
Saga ν¨ν΄ κΈ°λ° λΆμ° νΈλμμ
μ²λ¦¬
Redis λΆμ°λ½ κΈ°λ° λμμ± μ μ΄