Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

6 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

MSA (Microservices Architecture) Project

πŸ“š ν”„λ‘œμ νŠΈ κ°œμš”

πŸ€” μ™œ 이 ν”„λ‘œμ νŠΈλ₯Ό λ§Œλ“€μ—ˆλ‚˜μš”?

ν˜„λŒ€μ˜ λŒ€κ·œλͺ¨ μ›Ή μ„œλΉ„μŠ€(Netflix, Amazon, Google, μΉ΄μΉ΄μ˜€ν†‘, λ°°λ‹¬μ˜λ―Όμ‘± λ“±)λŠ” λͺ¨λ‘ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜λ₯Ό μ‚¬μš©ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 기쑴의 λͺ¨λ†€λ¦¬μ‹(단일) μ• ν”Œλ¦¬μΌ€μ΄μ…˜λ§Œ κ²½ν—˜ν•œ κ°œλ°œμžμ—κ²ŒλŠ” λ‹€μŒκ³Ό 같은 어렀움이 μžˆμŠ΅λ‹ˆλ‹€:

  • πŸ€·β€β™‚οΈ "μ„œλΉ„μŠ€λ₯Ό μ–΄λ–»κ²Œ λ‚˜λˆ„μ–΄μ•Ό ν•˜μ§€?"
  • 😰 "μ„œλΉ„μŠ€λΌλ¦¬ μ–΄λ–»κ²Œ ν†΅μ‹ ν•˜μ§€?"
  • 😱 "ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€κ°€ 죽으면 전체가 λ§ˆλΉ„λ˜λŠ” κ±° μ•„λ‹Œκ°€?"
  • 🀯 "λ‘œκ·ΈλŠ” μ–΄λ–»κ²Œ μΆ”μ ν•˜μ§€? 디버깅은 μ–΄λ–»κ²Œ ν•˜μ§€?"

이 ν”„λ‘œμ νŠΈλŠ” μ‹€μ œ μ†μœΌλ‘œ 만져보고 μ‹€ν—˜ν•  수 μžˆλŠ” μ΅œμ†Œν•œμ˜ MSA ν™˜κ²½μ„ μ œκ³΅ν•˜μ—¬, 이둠이 μ•„λ‹Œ μ²΄ν—˜μ„ ν†΅ν•œ ν•™μŠ΅μ„ λͺ©ν‘œλ‘œ ν•©λ‹ˆλ‹€.

🎯 무엇을 배울 수 μžˆλ‚˜μš”?

1단계: MSA의 κΈ°λ³Έ κ°œλ… 체득

  • 단일 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ vs λΆ„μ‚° μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 차이점을 λͺΈμœΌλ‘œ 느끼기
  • 독립적인 배포가 μ™œ μ€‘μš”ν•œμ§€ μ΄ν•΄ν•˜κΈ°
  • μ„œλΉ„μŠ€ κ°„ μ˜μ‘΄μ„±μ΄ μ–΄λ–€ 문제λ₯Ό μΌμœΌν‚€λŠ”μ§€ κ²½ν—˜ν•˜κΈ°

2단계: μ‹€μ œ 문제 상황 λŒ€μ‘

  • 🚨 "UserServiceκ°€ κ°‘μžκΈ° μ£½μ—ˆμ–΄μš”!" β†’ PostServiceλŠ” μ–΄λ–»κ²Œ λŒ€μ‘ν•΄μ•Ό ν• κΉŒ?
  • πŸ”„ "νŠΈλž˜ν”½μ΄ λͺ°λ €μ„œ UserService만 ν™•μž₯ν•˜κ³  μ‹Άμ–΄μš”" β†’ μ–΄λ–»κ²Œ ν•΄μ•Ό ν• κΉŒ?
  • πŸ“Š "μ–΄λŠ μ„œλΉ„μŠ€μ—μ„œ μ—λŸ¬κ°€ λ°œμƒν–ˆλŠ”μ§€ λͺ¨λ₯΄κ² μ–΄μš”" β†’ μ–΄λ–»κ²Œ μΆ”μ ν• κΉŒ?

3단계: 싀무 적용 λŠ₯λ ₯ λ°°μ–‘

  • Spring Cloud μƒνƒœκ³„ 이해
  • Docker/Kubernetes ν™˜κ²½μ—μ„œμ˜ 배포 κ²½ν—˜
  • λͺ¨λ‹ˆν„°λ§ 및 λ‘œκΉ… μ‹œμŠ€ν…œ ꡬ좕 방법

🎯 ν•™μŠ΅ λͺ©ν‘œ

1️⃣ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜ 이해

  • λͺ¨λ†€λ¦¬μ‹ vs λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€: 전톡적인 단일 μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€μ˜ 차이점 이해
  • μ„œλΉ„μŠ€ 뢄리: λ„λ©”μΈλ³„λ‘œ μ„œλΉ„μŠ€λ₯Ό λΆ„λ¦¬ν•˜λŠ” 방법과 κ·Έ μž₯단점 ν•™μŠ΅
  • 독립적 배포: 각 μ„œλΉ„μŠ€κ°€ λ…λ¦½μ μœΌλ‘œ 개발, 배포, ν™•μž₯될 수 μžˆμŒμ„ μ²΄ν—˜

2️⃣ μ„œλΉ„μŠ€ κ°„ 톡신 (Inter-Service Communication)

  • HTTP REST API: μ„œλΉ„μŠ€ κ°„ HTTP 기반 동기 톡신 κ΅¬ν˜„
  • RestTemplate μ‚¬μš©λ²•: Spring Bootμ—μ„œ λ‹€λ₯Έ μ„œλΉ„μŠ€ 호좜 방법
  • μ„œλΉ„μŠ€ μ£Όμ†Œ 관리: ν•˜λ“œμ½”λ”©λœ URL vs μ„œλΉ„μŠ€ λ””μŠ€μ»€λ²„λ¦¬ κ°œλ… 이해

3️⃣ μž₯μ•  처리 및 볡원λ ₯ (Resilience)

  • Graceful Degradation: 의쑴 μ„œλΉ„μŠ€ μž₯μ•  μ‹œ μš°μ•„ν•œ μ„±λŠ₯ μ €ν•˜ 처리
  • Fallback λ©”μ»€λ‹ˆμ¦˜: κΈ°λ³Έκ°’ λ°˜ν™˜μ„ ν†΅ν•œ μ„œλΉ„μŠ€ 연속성 보μž₯
  • Circuit Breaker νŒ¨ν„΄: 연쇄 μž₯μ•  λ°©μ§€λ₯Ό μœ„ν•œ κΈ°λ³Έ κ°œλ… 이해

4️⃣ μ»¨ν…Œμ΄λ„ˆν™” 및 μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜

  • Docker μ»¨ν…Œμ΄λ„ˆ: 각 λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λ₯Ό 독립적인 μ»¨ν…Œμ΄λ„ˆλ‘œ νŒ¨ν‚€μ§•
  • Docker Compose: 닀쀑 μ»¨ν…Œμ΄λ„ˆ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 관리
  • λ„€νŠΈμ›Œν¬ 뢄리: μ»¨ν…Œμ΄λ„ˆ κ°„ λ‚΄λΆ€ λ„€νŠΈμ›Œν¬ 톡신 ꡬ성

5️⃣ λͺ¨λ‹ˆν„°λ§ 및 디버깅

  • 둜그 μˆ˜μ§‘: λΆ„μ‚° μ‹œμŠ€ν…œμ—μ„œμ˜ 둜그 κ΄€λ¦¬μ˜ μ€‘μš”μ„±
  • μ„œλΉ„μŠ€ μƒνƒœ 확인: Health Check 및 μƒνƒœ λͺ¨λ‹ˆν„°λ§
  • λΆ„μ‚° 좔적: μ—¬λŸ¬ μ„œλΉ„μŠ€λ₯Ό κ±°μΉ˜λŠ” μš”μ²­μ˜ 흐름 이해

πŸ—οΈ μ•„ν‚€ν…μ²˜ μ„€λͺ…

μ„œλΉ„μŠ€ ꡬ성

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    HTTP Request    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Client        β”‚ ─────────────────→ β”‚   PostService    β”‚
β”‚ (Browser/Tool)  β”‚                    β”‚   (Port: 8080)   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜
                                                  β”‚
                                                  β”‚ HTTP Call
                                                  β”‚ GET /users/{id}
                                                  ↓
                                       β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                                       β”‚   UserService    β”‚
                                       β”‚   (Port: 8081)   β”‚
                                       β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

톡신 흐름

  1. ν΄λΌμ΄μ–ΈνŠΈ β†’ PostService에 κ²Œμ‹œκΈ€ 정보 μš”μ²­
  2. PostService β†’ UserService에 μž‘μ„±μž 정보 μš”μ²­
  3. UserService β†’ μ‚¬μš©μž 데이터 λ°˜ν™˜
  4. PostService β†’ κ²Œμ‹œκΈ€ + μž‘μ„±μž 정보 μ‘°ν•©ν•˜μ—¬ μ΅œμ’… 응닡

μž₯μ•  μ‹œλ‚˜λ¦¬μ˜€

❌ UserService μž₯μ•  λ°œμƒ
   ↓
βœ… PostServiceλŠ” "Unknown User"둜 λŒ€μ²΄ν•˜μ—¬ μ„œλΉ„μŠ€ 계속 제곡
   (Graceful Degradation)

πŸ’Ό 싀무 연결점

🏒 μ‹€μ œ κΈ°μ—…μ—μ„œλŠ” μ–΄λ–»κ²Œ μ‚¬μš©λ˜κ³  μžˆμ„κΉŒ?

🎬 Netflix의 경우

  • 700개 μ΄μƒμ˜ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 운영
  • ν•˜λ£¨μ— μˆ˜μ‹­μ–΅ 건의 API 호좜 처리
  • μž₯μ•  볡ꡬ μ‹œκ°„: 전체 μ„œλΉ„μŠ€ 쀑단 없이 κ°œλ³„ μ„œλΉ„μŠ€λ§Œ 볡ꡬ
  • κ°œλ°œνŒ€: 각 μ„œλΉ„μŠ€λ³„λ‘œ 독립적인 νŒ€ ꡬ성 (2-Pizza Team)

πŸ›’ 쿠팑의 경우

  • μ£Όλ¬Έ, 결제, 배솑, μƒν’ˆ λ“± 도메인별 μ„œλΉ„μŠ€ 뢄리
  • λΈ”λž™ν”„λΌμ΄λ°μ΄ 같은 λŒ€μš©λŸ‰ νŠΈλž˜ν”½ μ‹œ ν•„μš”ν•œ μ„œλΉ„μŠ€λ§Œ ν™•μž₯
  • A/B ν…ŒμŠ€νŠΈ: νŠΉμ • μ„œλΉ„μŠ€λ§Œ μƒˆ λ²„μ „μœΌλ‘œ λ°°ν¬ν•˜μ—¬ μ‹€ν—˜

πŸ’¬ μΉ΄μΉ΄μ˜€ν†‘μ˜ 경우

  • λ©”μ‹œμ§€, 친ꡬ, ν”„λ‘œν•„, κ²Œμž„ λ“± κΈ°λŠ₯별 μ„œλΉ„μŠ€ 뢄리
  • μ‹€μ‹œκ°„ λ©”μ‹œμ§•: 각 μ„œλΉ„μŠ€ κ°„ 비동기 ν†΅μ‹ μœΌλ‘œ λΉ λ₯Έ 응닡
  • κΈ€λ‘œλ²Œ μ„œλΉ„μŠ€: μ§€μ—­λ³„λ‘œ 독립적인 μ„œλΉ„μŠ€ 배포

πŸ”§ 이 ν”„λ‘œμ νŠΈ β†’ 싀무 μ—°κ²° λ‘œλ“œλ§΅

ν˜„μž¬ ν”„λ‘œμ νŠΈμ—μ„œ κ²½ν—˜ν•˜λŠ” 것

UserService (μ‚¬μš©μž 관리) ←→ PostService (κ²Œμ‹œκΈ€ 관리)

μ‹€λ¬΄μ—μ„œ ν™•μž₯λ˜λŠ” λͺ¨μŠ΅

πŸ” AuthService     ←→  πŸ›’ OrderService
      ↕                    ↕
πŸ‘€ UserService     ←→  πŸ’³ PaymentService  
      ↕                    ↕
πŸ“ PostService     ←→  πŸ“¦ DeliveryService
      ↕                    ↕
πŸ“Š AnalyticsService ←→  πŸ“§ NotificationService

이 ν”„λ‘œμ νŠΈ μ™„λ£Œ ν›„ λ‹€μŒ 단계

  1. 쀑급 κ³Όμ • (3-6κ°œμ›”)

    • λ°μ΄ν„°λ² μ΄μŠ€ 뢄리 (각 μ„œλΉ„μŠ€λ³„ 독립 DB)
    • λ©”μ‹œμ§€ 큐 λ„μž… (RabbitMQ, Kafka)
    • API Gateway κ΅¬ν˜„
  2. κ³ κΈ‰ κ³Όμ • (6-12κ°œμ›”)

    • Kubernetes ν΄λŸ¬μŠ€ν„° ꡬ좕
    • Service Mesh λ„μž…
    • λΆ„μ‚° 좔적 μ‹œμŠ€ν…œ ꡬ좕
  3. 싀무 적용 (1λ…„+)

    • λŒ€μš©λŸ‰ νŠΈλž˜ν”½ 처리
    • λ©€ν‹° 리전 배포
    • DevOps νŒŒμ΄ν”„λΌμΈ ꡬ좕

πŸ’° 컀리어 κ΄€μ μ—μ„œμ˜ κ°€μΉ˜

Junior β†’ Mid-level Developer

  • βœ… "MSA ν™˜κ²½μ—μ„œ 개발 κ²½ν—˜ 있음"
  • βœ… "μ„œλΉ„μŠ€ κ°„ 톡신 섀계 κ°€λŠ₯"
  • βœ… "Docker/Kubernetes 기초 이해"

Mid-level β†’ Senior Developer

  • βœ… "λŒ€κ·œλͺ¨ λΆ„μ‚° μ‹œμŠ€ν…œ 섀계 κ²½ν—˜"
  • βœ… "μž₯μ•  λŒ€μ‘ 및 볡ꡬ μ „λž΅ 수립"
  • βœ… "νŒ€ κ°„ ν˜‘μ—…μ„ μœ„ν•œ API 섀계"

μ‹€μ œ λ©΄μ ‘μ—μ„œ λ‚˜μ˜€λŠ” μ§ˆλ¬Έλ“€

  • "μ„œλΉ„μŠ€ κ°„ 데이터 일관성은 μ–΄λ–»κ²Œ 보μž₯ν•˜λ‚˜μš”?" β†’ 이 ν”„λ‘œμ νŠΈμ—μ„œ κ²½ν—˜ν•œ Fallback λ©”μ»€λ‹ˆμ¦˜μ΄ 기초
  • "ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€ μž₯μ• κ°€ 전체에 영ν–₯을 μ£Όμ§€ μ•ŠμœΌλ €λ©΄?" β†’ Circuit Breaker νŒ¨ν„΄μ˜ ν•„μš”μ„± 이해
  • "μ„œλΉ„μŠ€ 배포 μ‹œ 무쀑단 λ°°ν¬λŠ” μ–΄λ–»κ²Œ ν•˜λ‚˜μš”?" β†’ 독립적 배포의 μ€‘μš”μ„± μ²΄ν—˜

πŸ”¬ μ‹€μŠ΅μ„ 톡해 μ²΄ν—˜ν•  수 μžˆλŠ” 것

βœ… 정상 상황

  • λͺ¨λ“  μ„œλΉ„μŠ€κ°€ 정상 μž‘λ™ν•  λ•Œμ˜ μš”μ²­ 흐름
  • μ„œλΉ„μŠ€ κ°„ 데이터 μ‘°ν•© 및 응닡 생성

⚠️ μž₯μ•  상황

  • UserService 쀑단 μ‹œ PostService의 λ™μž‘
  • Fallback λ©”μ»€λ‹ˆμ¦˜μ„ ν†΅ν•œ μ„œλΉ„μŠ€ 연속성

πŸ”„ 볡ꡬ 상황

  • μž₯μ•  μ„œλΉ„μŠ€ 볡ꡬ ν›„ 정상 λ™μž‘ 재개
  • μ‹œμŠ€ν…œμ˜ μžκ°€ 볡ꡬ λŠ₯λ ₯

πŸ“Š ν™•μž₯μ„± μ‹€ν—˜

  • 각 μ„œλΉ„μŠ€μ˜ 독립적인 μŠ€μΌ€μΌλ§
  • λ‘œλ“œλ°ΈλŸ°μ‹± 및 λΆ€ν•˜ λΆ„μ‚°

πŸŽ“ ν•™μŠ΅ 단계별 μ ‘κ·Ό

Phase 1: κΈ°λ³Έ 이해 (ν˜„μž¬ κ΅¬ν˜„λœ λ‚΄μš©)

  • μ„œλΉ„μŠ€ 뢄리 및 독립 μ‹€ν–‰
  • HTTP 기반 μ„œλΉ„μŠ€ κ°„ 톡신
  • 기본적인 μž₯μ•  처리 (Fallback)
  • Docker μ»¨ν…Œμ΄λ„ˆν™”

Phase 2: 쀑급 ν™•μž₯ (μΆ”ν›„ ν•™μŠ΅ ꢌμž₯)

  • Service Discovery κ΅¬ν˜„ (Eureka)
  • API Gateway μΆ”κ°€ (Spring Cloud Gateway)
  • Circuit Breaker νŒ¨ν„΄ (Resilience4j)
  • λΆ„μ‚° μ„€μ • 관리 (Spring Cloud Config)

Phase 3: κ³ κΈ‰ 운영 (싀무 적용)

  • Kubernetes μ˜€μΌ€μŠ€νŠΈλ ˆμ΄μ…˜
  • Service Mesh λ„μž…
  • λΆ„μ‚° 좔적 μ‹œμŠ€ν…œ
  • μ€‘μ•™ν™”λœ λ‘œκΉ… (ELK Stack)

πŸ“– μ°Έκ³  자료

λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ μ•„ν‚€ν…μ²˜ κ΄€λ ¨ λ„μ„œ

  • "λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ νŒ¨ν„΄" - Chris Richardson
  • "Building Microservices" - Sam Newman
  • "Microservices AntiPatterns and Pitfalls" - Mark Richards

Spring Cloud 곡식 λ¬Έμ„œ

μ‹€μŠ΅ ν™˜κ²½ ν™•μž₯ 아이디어

  • λ°μ΄ν„°λ² μ΄μŠ€ 뢄리 (각 μ„œλΉ„μŠ€λ³„ 독립 DB)
  • 비동기 λ©”μ‹œμ§• (RabbitMQ, Apache Kafka)
  • λ³΄μ•ˆ 및 인증 (OAuth2, JWT)
  • λͺ¨λ‹ˆν„°λ§ λŒ€μ‹œλ³΄λ“œ (Prometheus + Grafana)

πŸ› οΈ 기술 μŠ€νƒ

Backend Framework

  • Spring Boot 3.1.2 - λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ κΈ°λ³Έ ν”„λ ˆμž„μ›Œν¬
  • Java 17 - μ΅œμ‹  LTS λ²„μ „μœΌλ‘œ ν–₯μƒλœ μ„±λŠ₯κ³Ό λ³΄μ•ˆ
  • RestTemplate - μ„œλΉ„μŠ€ κ°„ HTTP 톡신

Containerization & Orchestration

  • Docker - 각 μ„œλΉ„μŠ€μ˜ 독립적인 μ»¨ν…Œμ΄λ„ˆν™”
  • Docker Compose - 닀쀑 μ»¨ν…Œμ΄λ„ˆ ν™˜κ²½ 관리
  • Gradle Wrapper - λΉŒλ“œ 도ꡬ 및 μ˜μ‘΄μ„± 관리

Testing & Monitoring

  • Spring Boot Test - λ‹¨μœ„ ν…ŒμŠ€νŠΈ 및 톡합 ν…ŒμŠ€νŠΈ
  • HTTP Client - API μ—”λ“œν¬μΈνŠΈ ν…ŒμŠ€νŠΈ
  • Docker Logs - μ»¨ν…Œμ΄λ„ˆ μˆ˜μ€€ λ‘œκΉ…

πŸ“‘ API λͺ…μ„Έμ„œ

UserService (Port: 8081)

Method Endpoint Description Response
GET /users/{id} μ‚¬μš©μž 정보 쑰회 {"id": 1, "name": "User 1"}

PostService (Port: 8080)

Method Endpoint Description Response
GET /posts/{id} κ²Œμ‹œκΈ€ 정보 쑰회
(μž‘μ„±μž 정보 포함)
{"id": 1, "title": "Post 1", "content": "...", "author": "User 1"}

μ„œλΉ„μŠ€ κ°„ λ‚΄λΆ€ 톡신

PostService β†’ UserService
GET http://userservice:8081/users/{id}  # Docker λ‚΄λΆ€ λ„€νŠΈμ›Œν¬
GET http://localhost:8081/users/{id}    # 둜컬 개발 ν™˜κ²½

πŸ›οΈ ν”„λ‘œμ νŠΈ ꡬ쑰

msa/
β”œβ”€β”€ UserService/                 # μ‚¬μš©μž μ„œλΉ„μŠ€
β”‚   β”œβ”€β”€ src/main/java/
β”‚   β”‚   └── com/example/userservice/
β”‚   β”‚       β”œβ”€β”€ UserServiceApplication.java
β”‚   β”‚       β”œβ”€β”€ UserController.java
β”‚   β”‚       └── UserDto.java
β”‚   β”œβ”€β”€ Dockerfile              # μ»¨ν…Œμ΄λ„ˆ λΉŒλ“œ μ„€μ •
β”‚   └── build.gradle            # μ˜μ‘΄μ„± 관리
β”‚
β”œβ”€β”€ PostService/                # κ²Œμ‹œκΈ€ μ„œλΉ„μŠ€
β”‚   β”œβ”€β”€ src/main/java/
β”‚   β”‚   └── com/example/postservice/
β”‚   β”‚       β”œβ”€β”€ PostServiceApplication.java
β”‚   β”‚       β”œβ”€β”€ PostController.java
β”‚   β”‚       β”œβ”€β”€ PostDto.java
β”‚   β”‚       β”œβ”€β”€ UserClient.java     # UserService 호좜 ν΄λΌμ΄μ–ΈνŠΈ
β”‚   β”‚       └── RestTemplateConfig.java
β”‚   β”œβ”€β”€ Dockerfile
β”‚   └── build.gradle
β”‚
β”œβ”€β”€ src/test/                   # ν…ŒμŠ€νŠΈ 파일
β”‚   β”œβ”€β”€ request.http            # API ν…ŒμŠ€νŠΈμš© HTTP 파일
β”‚   └── post-check.http         # 톡합 ν…ŒμŠ€νŠΈμš© HTTP 파일
β”‚
β”œβ”€β”€ docker-compose.yml          # 닀쀑 μ»¨ν…Œμ΄λ„ˆ μ„€μ •
β”œβ”€β”€ docker-setup.sh             # μžλ™ ν™˜κ²½ μ„€μ • 슀크립트
β”œβ”€β”€ test-msa.sh                 # 톡합 ν…ŒμŠ€νŠΈ 슀크립트
└── README.md                   # ν”„λ‘œμ νŠΈ λ¬Έμ„œ

πŸš€ How to Run Now

Option 1: Use the Windows Script (Recommended)

run-services.bat

This script will automatically:

  • Set up Gradle wrappers for both services
  • Build UserService and PostService
  • Start both services on their respective ports
  • Test the services

Option 2: Manual Build and Run

# Step 1: Build both services
build-services.bat

# Step 2: Run UserService (in one terminal)
cd UserService
java -jar build\libs\user-service-0.0.1-SNAPSHOT.jar

# Step 3: Run PostService (in another terminal)
cd PostService
java -jar build\libs\post-service-0.0.1-SNAPSHOT.jar

Option 3: Troubleshooting

troubleshooting.bat

Use this script to:

  • Check service status
  • Restart services
  • Diagnose connection issues
  • Test service communication

Service URLs

πŸ§ͺ Testing Guide

ν…ŒμŠ€νŠΈ μ€€λΉ„

  1. μ„œλΉ„μŠ€ μ‹€ν–‰ 확인
    # Docker μ»¨ν…Œμ΄λ„ˆ μƒνƒœ 확인
    docker ps
    
    # λ˜λŠ” 둜컬 μ‹€ν–‰ μ‹œ ν”„λ‘œμ„ΈμŠ€ 확인
    curl http://localhost:8081/users/1
    curl http://localhost:8080/posts/1

HTTP ν…ŒμŠ€νŠΈ 파일 μ‚¬μš©

ν”„λ‘œμ νŠΈμ— ν¬ν•¨λœ .http νŒŒμΌμ„ VS Code λ˜λŠ” IntelliJμ—μ„œ μ‹€ν–‰:

πŸ“ src/test/request.http

  • UserService 단독 ν…ŒμŠ€νŠΈ
  • PostService 정상 호좜 ν…ŒμŠ€νŠΈ
  • PostService μž₯μ•  상황 ν…ŒμŠ€νŠΈ

πŸ“ src/test/post-check.http

  • PostService와 UserService κ°„μ˜ 톡신 ν…ŒμŠ€νŠΈ
  • μž₯μ•  볡ꡬ μ‹œλ‚˜λ¦¬μ˜€ ν…ŒμŠ€νŠΈ

ν…ŒμŠ€νŠΈ μ‹œλ‚˜λ¦¬μ˜€

1️⃣ 정상 톡신 ν…ŒμŠ€νŠΈ

# UserService ν…ŒμŠ€νŠΈ
curl -X GET http://localhost:8081/users/1 \
  -H "Accept: application/json"

# PostService ν…ŒμŠ€νŠΈ (UserService 호좜 포함)
curl -X GET http://localhost:8080/posts/1 \
  -H "Accept: application/json"

μ˜ˆμƒ κ²°κ³Ό:

// UserService 응닡
{"id":1,"name":"User 1"}

// PostService 응닡 (UserService 호좜 성곡)
{"id":1,"title":"Post 1","content":"This is the content of post 1","author":"User 1"}

2️⃣ μž₯μ•  상황 ν…ŒμŠ€νŠΈ

# UserService 쀑단
docker stop userservice

# PostService 호좜 (μž₯μ•  상황)
curl -X GET http://localhost:8080/posts/1 \
  -H "Accept: application/json"

μ˜ˆμƒ κ²°κ³Ό:

// UserService 호좜 μ‹€νŒ¨ μ‹œ
{"id":1,"title":"Post 1","content":"This is the content of post 1","author":"Unknown User"}

3️⃣ μ„œλΉ„μŠ€ 볡ꡬ ν…ŒμŠ€νŠΈ

# UserService μž¬μ‹œμž‘
docker start userservice

# μž μ‹œ λŒ€κΈ° ν›„ λ‹€μ‹œ ν…ŒμŠ€νŠΈ
sleep 10
curl -X GET http://localhost:8080/posts/1 \
  -H "Accept: application/json"

μžλ™ν™”λœ ν…ŒμŠ€νŠΈ

Docker ν™˜κ²½ 전체 ν…ŒμŠ€νŠΈ

# 전체 ν™˜κ²½ μ„€μ • 및 ν…ŒμŠ€νŠΈ
./docker-setup.sh

# λ˜λŠ” Windowsμ—μ„œ
docker-setup.bat

🎯 원클릭 톡합 ν…ŒμŠ€νŠΈ (μΆ”μ²œ!)

# μžλ™ν™”λœ MSA ν…ŒμŠ€νŠΈ μ‹€ν–‰
./test-msa.sh

이 μŠ€ν¬λ¦½νŠΈλŠ” λ‹€μŒμ„ μžλ™μœΌλ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€:

  • βœ… Docker μ»¨ν…Œμ΄λ„ˆ μƒνƒœ 확인
  • βœ… UserService μ—°κ²° ν…ŒμŠ€νŠΈ
  • βœ… PostService 정상 호좜 ν…ŒμŠ€νŠΈ
  • βœ… μž₯μ•  μ‹œλ‚˜λ¦¬μ˜€ ν…ŒμŠ€νŠΈ (UserService 쀑단)
  • βœ… μ„œλΉ„μŠ€ 볡ꡬ ν…ŒμŠ€νŠΈ
  • βœ… μ΅œμ’… μƒνƒœ 확인

연속 ν…ŒμŠ€νŠΈ 슀크립트

#!/bin/bash
echo "=== MSA μ„œλΉ„μŠ€ ν…ŒμŠ€νŠΈ μ‹œμž‘ ==="

echo "1. UserService ν…ŒμŠ€νŠΈ..."
curl -s http://localhost:8081/users/1 | jq .

echo "2. PostService 정상 ν…ŒμŠ€νŠΈ..."
curl -s http://localhost:8080/posts/1 | jq .

echo "3. UserService 쀑단..."
docker stop userservice

echo "4. PostService μž₯μ•  ν…ŒμŠ€νŠΈ..."
curl -s http://localhost:8080/posts/1 | jq .

echo "5. UserService 볡ꡬ..."
docker start userservice
sleep 5

echo "6. PostService 볡ꡬ ν…ŒμŠ€νŠΈ..."
curl -s http://localhost:8080/posts/1 | jq .

echo "=== ν…ŒμŠ€νŠΈ μ™„λ£Œ ==="

둜그 λͺ¨λ‹ˆν„°λ§

μ‹€μ‹œκ°„ 둜그 확인:

# λͺ¨λ“  μ„œλΉ„μŠ€ 둜그 μ‹€μ‹œκ°„ 확인
docker-compose logs -f

# κ°œλ³„ μ„œλΉ„μŠ€ 둜그 확인
docker logs -f userservice
docker logs -f postservice

μ„±λŠ₯ ν…ŒμŠ€νŠΈ

κ°„λ‹¨ν•œ λΆ€ν•˜ ν…ŒμŠ€νŠΈ:

# Apache Bench μ‚¬μš© (μ„€μΉ˜ ν•„μš”)
ab -n 100 -c 10 http://localhost:8080/posts/1

# curl을 μ΄μš©ν•œ 반볡 ν…ŒμŠ€νŠΈ
for i in {1..10}; do
  echo "Test $i:"
  time curl -s http://localhost:8080/posts/1
  echo
done

Build

To build the project:

./gradlew build

Dependencies

  • Spring Boot Starter Web
  • Spring Boot Starter Test (for testing)

Block 2: Docker ν™˜κ²½ μ „ν™˜ μ‹€μŠ΅ μ•ˆλ‚΄

1. 포트 μ„€μ • 확인

  • UserServiceλŠ” 8081
  • PostServiceλŠ” 8080μ—μ„œ μ‹€ν–‰λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€

2. Dockerfile μž‘μ„±

  • 각 μ„œλΉ„μŠ€ 디렉토리에 Dockerfile을 직접 μž‘μ„±ν•˜μ„Έμš”

3. Docker λ„€νŠΈμ›Œν¬ 생성

docker network create msa-network

4. μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰

방법 1: Docker Compose μ‚¬μš© (ꢌμž₯)

# 전체 μ„œλΉ„μŠ€ ν•œ λ²ˆμ— μ‹€ν–‰
docker-compose up -d --build

# μ„œλΉ„μŠ€ 쀑지
docker-compose down

방법 2: κ°œλ³„ μ»¨ν…Œμ΄λ„ˆ μ‹€ν–‰

# UserService λΉŒλ“œ 및 μ‹€ν–‰
cd UserService
docker build -t userservice .
docker run -d --name userservice --network msa-network -p 8081:8081 userservice

# PostService λΉŒλ“œ 및 μ‹€ν–‰
cd PostService
docker build -t postservice .
docker run -d --name postservice --network msa-network -p 8080:8080 postservice

방법 3: μžλ™ν™” 슀크립트 μ‚¬μš©

# Linux/Mac
./docker-setup.sh

# Windows
docker-setup.bat

5. PostService β†’ UserService 호좜 μ£Όμ†Œ

  • λ‚΄λΆ€ DNS 이름을 μ‚¬μš©ν•΄μ•Ό ν•˜λ―€λ‘œ http://userservice:8081둜 ν˜ΈμΆœν•΄μ•Ό ν•©λ‹ˆλ‹€

6. 톡신 확인 ν…ŒμŠ€νŠΈ

  • .http νŒŒμΌμ„ μ‚¬μš©ν•΄ PostService의 λ™μž‘μ„ ν™•μΈν•΄λ³΄μ„Έμš”
  • μ‹€νŒ¨ μ‹€ν—˜μ„ μœ„ν•΄ UserServiceλ₯Ό μ€‘λ‹¨ν•œ μƒνƒœμ—μ„œλ„ ν˜ΈμΆœν•΄λ³΄μ„Έμš”

7. 문제 ν•΄κ²°

μ»¨ν…Œμ΄λ„ˆ 둜그 확인

# UserService 둜그
docker logs userservice

# PostService 둜그
docker logs postservice

λ„€νŠΈμ›Œν¬ μ—°κ²° 확인

# λ„€νŠΈμ›Œν¬ λͺ©λ‘ 확인
docker network ls

# λ„€νŠΈμ›Œν¬ 상세 정보 확인
docker network inspect msa-network

μ»¨ν…Œμ΄λ„ˆ μž¬μ‹œμž‘

# κ°œλ³„ μ»¨ν…Œμ΄λ„ˆ μž¬μ‹œμž‘
docker restart userservice
docker restart postservice

# λ˜λŠ” Docker Compose μ‚¬μš©
docker-compose restart

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages