01.Micro Service

Micro Service

Monolith System

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ ν•œ λ©μ–΄λ¦¬λ‘œ ꡬ성

  • 단일 ν”„λ‘œμ„ΈμŠ€ μ‹€ν–‰

  • ν•œκΊΌλ²ˆμ— μˆ˜μ •, 배포 ν•„μš” -> μ„œλΉ„μŠ€ 쀑단

  • ν•˜λ‚˜κ°€ μ‹€νŒ¨ν•˜λ©΄ λͺ¨λ‘ μ‹€νŒ¨

  • λͺ¨λ…Έλ¦¬μŠ€λ₯Ό ν΄λΌμš°λ“œ μΈν”„λΌμ—μ„œ ν™œμš© μ‹œ μŠ€μΌ€μΌ 아웃 λŒ€μƒμ€ λͺ¨λ…Έλ¦¬μŠ€ 전체

    • ν™•μž₯μ„±, 탄λ ₯μ„± 보μž₯이 κ°€λŠ₯ν•˜λ‚˜ λΉ„μš©μ΄ λΉ„νš¨μœ¨μ 

β”œβ”€β”€ Client
β”‚   β”œβ”€β”€ Server1
β”‚   β”œβ”€β”€ Server2
β”‚   └── Server3
β”‚      └── DataBase
└── 

Micro Service

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ μ—¬λŸ¬ 개의 μ„œλΉ„μŠ€ 쑰각으둜 ꡬ성

  • μ„œλΉ„μŠ€λŠ” 각기 독립적인 κΈ°λŠ₯을 제곡

  • μ„œλΉ„μŠ€κ°€ μ‚¬μš©ν•˜λŠ” μ €μž₯μ†ŒλŠ” λ‹€λ₯Έ μ„œλΉ„μŠ€μ™€ μ™„λ²½νžˆ 격리

    • λ…λ¦½μ μœΌλ‘œ μˆ˜μ •, 별도 배포, ν™•μž₯ κ°€λŠ₯

  • ν•˜λ‚˜μ˜ μ„œλΉ„μŠ€ μ‹€νŒ¨λŠ” 전체 μ‹€νŒ¨κ°€ μ•„λ‹Œ 뢀뢄적인 μ‹€νŒ¨λ₯Ό 의미

β”œβ”€β”€ Client
β”‚   β”œβ”€β”€ Servive A
β”‚   β”‚  └── DataBase A
β”‚   β”‚
β”‚   β”œβ”€β”€ Servive B
β”‚   β”‚  └── DataBase B
β”‚   β”‚
β”‚   β”œβ”€β”€ Servive C-1
β”‚   β”œβ”€β”€ Servive C-2
β”‚   └── Servive C-3
β”‚      └── DataBase C
└── 

...

λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€μ˜ μ •μ˜

  • Public Interface, 데이터 μΊ‘μŠν™”

  • ν™•μž₯ μ‹œ, νŠΉμ • κΈ°λŠ₯별 λ…λ¦½μ μœΌλ‘œ ν™•μž₯ κ°€λŠ₯

  • νŠΉμ • μ„œλΉ„μŠ€μ˜ λ³€κ²½ μ‹œ ν•΄λ‹Ή μ„œλΉ„μŠ€λ§Œ λΉŒλ“œ, 배포

  • λ…λ¦½μ μœΌλ‘œ μ„œλ‘œ λ‹€λ₯Έ μ–Έμ–΄λ‘œ 개발 κ°€λŠ₯

β”œβ”€β”€ Client
β”‚   β”œβ”€β”€ Java Service
β”‚   β”‚  └── Oracle
β”‚   β”‚
β”‚   β”œβ”€β”€ Node.JS Service
β”‚   β”‚  └── MariaDB
β”‚   β”‚
β”‚   β”œβ”€β”€ C# Service
β”‚   β”‚  └── MySQL
β”‚   β”‚
β”‚ 
  • μ—¬λŸ¬ 개의 μž‘μ€ μ„œλΉ„μŠ€ μ§‘ν•©μœΌλ‘œ κ°œλ°œν•˜λŠ” μ ‘κ·Ό 방법

  • 각 μ„œλΉ„μŠ€λŠ” κ°œλ³„ ν”„λ‘œμ„ΈμŠ€μ—μ„œ μ‹€ν–‰

  • HTTP μžμ› API 같은 κ°€λ²Όμš΄ μˆ˜λ‹¨μ„ μ‚¬μš©ν•˜μ—¬ 톡신

  • μ„œλΉ„μŠ€λŠ” Biz κΈ°λŠ₯ λ‹¨μœ„λ‘œ ꡬ성

    • 쀑앙 집쀑적인 관리 μ΅œμ†Œν™”

  • 각 μ„œλΉ„μŠ€λŠ” μ„œλ‘œ λ‹€λ₯Έ μ–Έμ–΄, 데이터, μ €μž₯ 기술 μ‚¬μš©

  • μ°Έκ³ . SOA(Service-Oriented Architecture)λŠ” μ €μž₯μ†Œλ₯Ό κ³΅μœ ν•˜λŠ” ν˜•νƒœ

μ•„ν‚€ν…μ²˜ μ •μ˜

Outer Architecture μ •μ˜

Cloud Infra μ •μ˜

  • IaaS(Infrastructure as a Service): 인터넷을 톡해 ν™•μž₯성이 λ›°μ–΄λ‚œ μ»΄ν“¨νŒ… λ¦¬μ†ŒμŠ€λ₯Ό μ„œλΉ„μŠ€λ‘œμ„œ μ œκ³΅ν•˜λŠ” μ£Όλ¬Έν˜• κ°€μš©μ„± μ„œλΉ„μŠ€

    • ex. AWS EC2, AWS S3

    μ›ν•˜λŠ” μ§‘μ˜ λͺ¨μŠ΅κ³Ό λ°© 개수λ₯Ό μ•Œλ €μ£Όλ©΄ λ„κΈ‰μ—…μžλŠ” μ§€μ‹œμ— 따라 집을 μ§“μŠ΅λ‹ˆλ‹€. 
    IaaS도 λ§ˆμ°¬κ°€μ§€λ‘œ ν•˜λ“œμ›¨μ–΄λ₯Ό λŒ€μ—¬ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μ‹€ν–‰ν•˜μ§€λ§Œ OS, λŸ°νƒ€μž„, ν™•μž₯ 및 λͺ¨λ“  데이터λ₯Ό 관리할 μ±…μž„μ€ λ³ΈμΈμ—κ²Œ μžˆμŠ΅λ‹ˆλ‹€.
  • PaaS(Platform as a Service): ν΄λΌμš°λ“œ μ»΄ν“¨νŒ… μ„œλΉ„μŠ€ λͺ¨λΈλ‘œμ„œ 앱을 개발, 배포, μ‹€ν–‰, 관리할 수 μžˆλŠ” μœ μ—°ν•˜κ³  ν™•μž₯ κ°€λŠ₯ν•œ ν΄λΌμš°λ“œ ν”Œλž«νΌμ„ 제곡

    • ex. AWS Lambda

    κ±°μ‹€ 가ꡬλ₯Ό κ³ λ₯΄λŠ” 일이 번거둭게 λŠκ»΄μ§„λ‹€λ©΄ 가ꡬ가 λΉ„μΉ˜λœ 집을 λŒ€μ—¬ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 
    PaaSλ₯Ό μ‚¬μš©ν•˜λ©΄ 자체 μ½”λ“œλ₯Ό 가져와 배포할 수 μžˆμ§€λ§Œ μ„œλ²„ 관리 및 수직 ν™•μž₯은 ν΄λΌμš°λ“œ μ œκ³΅μ—…μ²΄κ°€ λ§‘μŠ΅λ‹ˆλ‹€
  • CaaS(Containers as a Service): μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•˜μ—¬ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•˜κ³  λ°°ν¬ν•˜λŠ” 데 ν•„μš”ν•œ λͺ¨λ“  ν•˜λ“œμ›¨μ–΄ 및 μ†Œν”„νŠΈμ›¨μ–΄ λ¦¬μ†ŒμŠ€λ₯Ό μ œκ³΅ν•˜κ³  관리

    • ex. AWS ECS, EKS

    집을 ꡬ맀할 경우 λ’€λ”°λ₯΄λŠ” μœ μ§€κ΄€λ¦¬κ°€ λΆ€λ‹΄μŠ€λŸ¬μš΄ 경우 λŒ€μ—¬λ₯Ό 선택할 수 μžˆμŠ΅λ‹ˆλ‹€. 
    κΈ°λ³Έ μ„€λΉ„λŠ” ν¬ν•¨λ˜μ–΄ 있고 가ꡬλ₯Ό 직접 듀여놓고 곡간을 κΎΈλ°‰λ‹ˆλ‹€. 
    μ»¨ν…Œμ΄λ„ˆλ₯Ό μ‚¬μš©ν•˜λ©΄ μ»¨ν…Œμ΄λ„ˆν™”λœ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ„μž…ν•  수 μžˆμœΌλ―€λ‘œ κΈ°λ³Έ μš΄μ˜μ²΄μ œμ— λŒ€ν•΄ κ±±μ •ν•  ν•„μš” 없이 규λͺ¨μ™€ λŸ°νƒ€μž„μ„ μ œμ–΄ν•  수 μžˆμŠ΅λ‹ˆλ‹€

Platform κ΅¬μ„±μš”μ†Œ , MSA νŒ¨ν„΄

  • λΌμš°νŒ…, λ‘œλ“œ λ°ΈλŸ°μ‹±, 인증/인가, λ‘œκΉ…, νŠΈλ ˆμ΄μ‹±, λͺ¨λ‹ˆν„°λ§

DevOps Infra μ •μ˜

  • ν˜•μƒκ΄€λ¦¬, λΉŒλ“œ, 배포(CI/CD)

.

Inner Architecture μ •μ˜

Front End

  • 기술 stack μ •μ˜

  • λ‚΄λΆ€ ꡬ쑰 μ •μ˜

Back End

  • 기술 stack, ν”„λ ˆμž„μ›Œν¬

  • λ‚΄λΆ€ ꡬ쑰 μ •μ˜

톡신

  • μ„œλΉ„μŠ€ κ°„

  • λ ˆκ±°μ‹œ 연계

.

섀계와 κ΅¬ν˜„

(1) DDD 섀계λ₯Ό ν†΅ν•œ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€ 식별
β€’ 도메인: 업무 μ˜μ—­, 제곡 μ„œλΉ„μŠ€
β€’ ꡬ성원 μ—­λŸ‰, 운영 쑰직 ꡬ쑰
β€’ μ„œλΉ„μŠ€ λ³€κ²½/배포 λΉˆλ„
β€’ μ‚¬μš©λŸ‰: νŠΈλžœμž­μ…˜ λΉˆλ„
β€’ λ°μ΄ν„°λ² μ΄μŠ€ 주제 μ˜μ—­, μ˜€λ„ˆμ‰½

(2) λ°±μ—”λ“œ 섀계
β€’ 도메인 λͺ¨λΈ 섀계
β€’ API 섀계
β€’ 데이터 λͺ¨λΈ 섀계

(3) ν”„λ‘ νŠΈμ—”λ“œ 섀계
β€’ UI 흐름
β€’ UI λ ˆμ΄μ•„μ›ƒ μ •μ˜

(4) ν…ŒμŠ€νŠΈ
β€’ λ‹¨μœ„
β€’ API
β€’ EtoE

(5) 배포
β€’ CI/CD
  • μ‹œμŠ€ν…œ λ³΅μž‘μ„±μœΌλ‘œ 둜컬 λ³΅μž‘μ„±κ³Ό κΈ€λ‘œλ²Œ λ³΅μž‘μ„±μ΄ μžˆλŠ”λ°, λ„ˆλ¬΄ λ§Žμ§€λ„ 적지도 μ•ŠλŠ” μ μ ˆν•œ μˆ˜μ€€μœΌλ‘œ 뢄리가 ν•„μš”ν•˜λ‹€.

    • 둜컬 λ³΅μž‘μ„±: 각각의 κ°œλ³„ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€μ˜ λ³΅μž‘μ„±

    • κΈ€λ‘œλ²Œ λ³΅μž‘μ„±: 전체 μ‹œμŠ€ν…œμ˜ λ³΅μž‘μ„±, μ„œλΉ„μŠ€ κ°„μ˜ μƒν˜Έμž‘μš©κ³Ό μ˜μ‘΄μ„±

섀계

REST API

REST ꡬ성

  • REST(Representational State Transfer): μžμ›μ˜ 정보λ₯Ό μ£Όκ³  λ°›λŠ” ꡬ쑰

    • HTTP ν”„λ‘œν† μ½œκ³Ό JSON 포맷을 μ‚¬μš©ν•œ ꡬ쑰

  • μžμ›(Resource) : URI둜 ν‘œν˜„ (http://service/apis)

  • ν–‰μœ„(Verb): HTTP Method (POST, GET, PUT, DELETE)

  • ν‘œν˜„(Representations): HTTP POST, http://service/apis

    • {"apis":{"name":"sample"}}

μžμ›

  • κ°„κ²°ν•˜κ³  직관적인 κΈ°μ€€ URL μœ μ§€

  • μžμ›(Resource) λ³„λ‘œ 두 κ°€μ§€ ν˜•μ‹μ˜ κΈ°μ€€ URL μ‚¬μš©

    • GET /dogs (λͺ©λ‘ 쑰회)

    • GET /dogs/1 (1번 개체 쑰회)

    • POST /dogs (개체 생성)

    • PUT /dogs/1 (1번 개체 μˆ˜μ •)

    • DELETE /dogs/1 (1번 개체 μ‚­μ œ)

  • 동사 λ³΄λ‹€λŠ” 볡수 λͺ…사 μ‚¬μš©

    • ꢌμž₯ 방법: GET /dogs, POST /dogs/{puppy}/owner/{terry}

    • λΉ„κΆŒμž₯ν•˜λŠ” 방법: /getDogs, /setDogs

ν–‰μœ„

  • POST: λ¦¬μ†ŒμŠ€ 생성

  • GET: λ¦¬μ†ŒμŠ€ 쑰회

  • PUT: λ¦¬μ†ŒμŠ€ μˆ˜μ •

  • DELETE: λ¦¬μ†ŒμŠ€ μ‚­μ œ

HTTP μƒνƒœ μ½”λ“œ

  • 200-level: 성곡

  • 400-level: 잘λͺ»λœ μš”μ²­

  • 500-level: μ„œλ²„ μ—λŸ¬

...

REST API λ””μžμΈ κ°€μ΄λ“œ

  • REST API μ„€κ³„λŠ” μ•„ν‚€ν…μ²˜ μŠ€νƒ€μΌμ΄μ§€ ν‘œμ€€μ€ μ•„λ‹ˆλ―€λ‘œ μœ μ—°ν•˜κ²Œ 적용

  • API λͺ©ν‘œλŠ” 개발자의 생산성과 성곡을 κ·ΉλŒ€ν™” (μ‹€μš©μ£Όμ˜)

λ©±λ“±μ„±(Idempotent)

  • 반볡적으둜 ν˜ΈμΆœν•˜λ”λΌλ„ μƒνƒœκ°€ 계속 μœ μ§€λ˜κ³ , μƒνƒœμ˜ λ³€ν™”κ°€ μ—†λŠ” 것

  • 생성 μš”μ²­μ˜ POSTλŠ” 멱등성을 λ”°λ₯΄μ§€ μ•ŠμŒ

  • GET, DELETEλŠ” 멱등성을 λ”°λ₯΄κ²Œ 섀계 κ°€λŠ₯

  • Vesioning

    • /v1/products

    • /v2/products

EventStorming

UML Tool: https://lucid.co/

EventStorming Tool: https://miro.com/

이벀트 μŠ€ν† λ° μ§„ν–‰ μˆœμ„œ

  • μš”κ΅¬μ‚¬ν•­ 뢄석

  • 도메인 이벀트, ν•«μŠ€νŒŸ λ„μΆœ

  • μ»€λ§¨λ“œ 및 μ™ΈλΆ€μ‹œμŠ€ν…œ λ„μΆœ

  • μ–΄κ·Έλ¦¬κ±°νŠΈ λ„μΆœ

  • λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈ 식별

  • μ»¨ν…μŠ€νŠΈ λ§€ν•‘ μ •μ˜

업무 흐름 μ˜ˆμ‹œ

  • 사내 λ„μ„œ λŒ€μ—¬ μ‹œμŠ€ν…œ

이벀트 μŠ€ν† λ° κ²°κ³Ό μ˜ˆμ‹œ

  • λ…Έλž€μ„Ή: μ–΄κ·Έλ¦¬κ±°νŠΈ

  • νŒŒλž€μƒ‰: μ»€λ§¨λ“œ

  • 주황색: 도메인 이벀트

μ»¨ν…μŠ€νŠΈ λ§€ν•‘ κ²°κ³Ό μ˜ˆμ‹œ

도메인 λͺ¨λΈλ§μ„ μœ„ν•œ 이벀트 μŠ€ν† λ° κ²°κ³Ό μ˜ˆμ‹œ

  • 이벀트 μŠ€ν† λ°μ„ 톡해 λ„μΆœλœ

    • μ–΄κ·Έλ¦¬κ±°νŠΈκ°€ 도메인 λͺ¨λΈ μš”μ†Œ

    • μ»€λ§¨λ“œκ°€ 컨트둀러 μ—­ν• 

    • 도메인 μ΄λ²€νŠΈλŠ” 도메인 λͺ¨λΈμ— 포함

Domain Modeling

λŒ€μ—¬ 도메인 λͺ¨λΈ μ˜ˆμ‹œ

νšŒμ› 도메인 λͺ¨λΈ μ˜ˆμ‹œ

λ„μ„œ 도메인 λͺ¨λΈ μ˜ˆμ‹œ

BEST λ„μ„œ 도메인 λͺ¨λΈ μ˜ˆμ‹œ

Heuristics

κ²½ν—˜μ— κΈ°λ°˜ν•œ κ·œμΉ™

λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈ

  • 크기둜 경계λ₯Ό κ΅¬λΆ„ν•˜μ§€ μ•ŠλŠ”λ‹€.

  • λ°”μš΄λ””λ“œ μ»¨ν…μŠ€νŠΈλ₯Ό 식별할 λ•ŒλŠ” 넓은 κ²½κ³„λ‘œ μ‹œμž‘

  • λ‚˜μ€‘μ— 도메인 지식이 μŒ“μ΄κ²Œ 되면 μ’€ 더 μž‘μ€ κ²½κ³„λ‘œ 뢄리

λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 κ΅¬ν˜„ νŒ¨ν„΄κ³Ό μ•„ν‚€ν…μ²˜ νŒ¨ν„΄ κ²°μ •

  • κ°„λ‹¨ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(지원, 일반): Transaction Script, Active Record

    • λ‹¨μˆœν•œ 자료 ꡬ쑰: Transaction Script

    • λ³΅μž‘ν•œ 자료ꡬ쑰: Active Record

  • λ³΅μž‘ν•œ λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(핡심): Domain Model

    • κΈˆμ „ λ˜λŠ” ν†΅ν™”μ˜ νŠΈλžœμž­μ…˜ 좔적, μΌκ΄€λœ 감사 둜그, λ™μž‘μ— λ”°λ₯Έ 심측적 뢄석 μš”κ΅¬ -> Event Sourcing

Book review: Learning Domain-Driven Design by Vlad Khononov

ν…ŒμŠ€νŠΈ μ „λž΅ κ²°μ •

Last updated