π‘ MSAμ DDD μ리μ¦μμλ λ€μκ³Ό κ°μ μμΌλ‘ ν¬μ€ν μ΄ μ§νλ©λλ€.
(1) μ λ΄κ° MSAμ DDD μ κ΄μ¬μ κ°κ² λμμκΉ?
(2) DDDλ₯Ό νμ©ν MSA
(3) DDDμ μ΄λ€ λ¬Έμ κ°? feat. CQRS
(4) λͺ¨λ리μμ MSAμ μ‘°ν©
MSAμ DDD μ λν΄ νμ΅νκ³ ν¬μ€ν νκΈ° μ , νλ‘μ νΈ κ²½νμ νλ©΄μ λλλ°λ₯Ό μ 리νλ λΉμ€μ΄ ν° νλ‘€λ‘κ·Έμ κ°μ κΈμ΄λ€. MSAμ DDDμ λν΄μ μ½κ³ μΆλ€λ©΄, λ°λ‘ λ€μ ν¬μ€ν μ μ°Έκ³ νκΈΈ λ°λλ€.
νλ‘κ·Έλλ¨Έμ€ λ°±μλ λ°λΈμ½μ€ 1κΈ° κ΅μ‘κ³Όμ μ μ§ννλ©΄μ βSky Scannerβμ API μλ²λ₯Ό ν΄λ‘ μ½λ©νλ CarrierRoute νλ‘μ νΈμ λλ€ μ΄λ²€νΈ κ΄λ¦¬ μλΉμ€μΈ Everevent νλ‘μ νΈλ₯Ό κ²½ννμλ€.
λ νλ‘μ νΈλ₯Ό μ§ννλ©΄μ MSAμ DDDμ λ΄κ° κ΄μ¬μ κ°κ²λ λ¬Έμ λ€μ λ§λ₯λ¨λ Έλλ° MSAμ DDDμ λν 곡λΆλ₯Ό νκΈ° μ μ κ·Έ κ³κΈ°μ λν΄μ λ¨Όμ μ 리ν΄λ³΄λ©΄ μ’μ κ² κ°μ μ΄λ² ν¬μ€ν μ μ€λΉνκ² λμλ€.
CarrierRoute νλ‘μ νΈ λ§ν¬
CarrierRoute νλ‘μ νΈμμ 3λͺ μ νμμ΄ 3κ°μ§ λλ©μΈμ κ°μ λΆλ΄νμ¬ κ°λ°νμλ€.
λλ μ¬κΈ°μ νκ³΅νΈ λλ©μΈμ 맑μ λ€μκ³Ό κ°μ API ꡬνμ 맑μλ€.
API | Http Method | URI |
---|---|---|
νκ³΅κΆ μ 체 μ‘°ν | GET | /api/v1/flights/ |
νκ³΅νΈ μ 체 μ‘°ν | GET | /api/v1/flights/ |
νκ³΅νΈ λ¨μΌ μ‘°ν | GET | /api/v1/flights/{flightId} |
νκ³΅νΈ μμ½ | POST | /api/v1/bookings/flights |
νκ³΅νΈ μμ½ μ‘°ν | GET | /api/v1/bookings/flights |
νκ³΅νΈ μμ½ μμΈμ‘°ν | GET | /api/v1/bookings/flights/{bookingId} |
νκ³΅νΈ μμ½ μ·¨μ | DELETE | /api/v1/bookings/flights/{bookingId} |
ν΄λΉ νλ‘μ νΈλ μ μμΌ νλ‘μΈμ€ μ€ νλμΈ μ€ν¬λΌ λ°©μμΌλ‘ κ°λ°μ΄ μ§νλλ€.
μ°λ¦¬νμ 2μ£Ό νλ‘μ νΈλ₯Ό 3λ²μ μ€νλ¦°νΈλ‘ λλμ΄ μΌμ μ κ³ννμκ³ , 짧μ μΌμ μ΄μ§λ§ λ°λ³΅μ μΈ μ£ΌκΈ°λ₯Ό κ°μΌλ©° μ§μμ μΈ κ°μ μ΄ κ°λ₯ν μ μμΌ νλ‘μΈμ€μ κΈ°λλ₯Ό κ°κ³ νλ‘μ νΈμ μνλ€.
첫 λ²μ§Έ μ€νλ¦°νΈ λ,
λ₯Ό νκ³ λ λ²μ§Έ μ€νλ¦°νΈ λ, ERD μ€κ³λ₯Ό μ§ννκ³ λ°λ‘ μ½λ κ°λ°μ λ€μ΄κ°λ€.
νμ§λ§ κ°μ λΆλ΄ν μ½λκ°λ°μ λ€μ΄κ°μ λ, λλ μꡬμ¬νκ³Ό APIμ λ§κ² ERDκ° μ λΆλ¦¬λμ΄ μμ§ μλ λ¬Έμ μ λ€μ λ°κ²¬νμλ€.
κ²°κ΅ λ€λ₯Έ νμλ€μ΄ μ½λ κ°λ°μ μ§μμ μΌλ‘ μ΄λ£¨μ΄λκ° λ, λλ ERD μ¬μμ μμ μ νλ©°, μ΄λ €μ΄ λΆλΆμ΄ μμ λ κ²λνμ΄μ μ μνμ¬ νμκ³Ό λ©ν λκ» μ§λ¬Έμ λμ§λ©° ERDλ₯Ό μ¬μ€κ³νμλ€.
ERDλ₯Ό μ¬μ€κ³νλ©΄μ κΉ¨λ¬μ μ
μ λ€μκ³Ό κ°μλ€.
CarrierRoute νλ‘μ νΈ κΈ°κ° λ, λ©ν λκ³Ό βλλ©μΈμ μ λΆλ¦¬νκ³ μ€κ³νλ λ°©λ²'μ λν΄μ μ΄μΌκΈ°λ₯Ό λ§μ΄ λλ΄λ€. λ©ν λμ μμ μ νμ¬μμ μ μ© μ€μΈ DDDμ μ΄λ²€νΈ μ€ν λ° λ°©μμ λν΄μ μ΄μΌκΈ°ν΄μ£Όμ ¨λλ°, λλ©μΈμ μ λλ‘ λΆλ¦¬νμ§ λͺ»ν μ± κ°λ°μ νλν°λΌ λμ± λ΄μ©μ΄ μλΏμμλ€.
Everevent νλ‘μ νΈμμλ CarrierRoute νλ‘μ νΈμ λ§μ°¬κ°μ§λ‘ 3λͺ μ νμμ΄μ μ§ννμλ€.
νμ°½μμ λΆν° νλ‘μ νΈλ€μ ν΄μ€λ©΄μ λκ»΄μλκ±΄λ° λ§€λ² νλ‘μ νΈλ₯Ό μ§ννλ©΄ λ€μ νλ‘μ νΈ λ βμ‘°κΈμ μ±μ₯βμ λͺΈμ 체κ°νλ€λ κ²μ΄λ€. (π€)
CarrierRoute νλ‘μ νΈλ₯Ό λ§μΉκ³ λ°λ‘ νλ¬ λ€, Everevent νλ‘μ νΈλ₯Ό νλ©΄μ λκΌλ βμ‘°κΈμ μ±μ₯βμ 미리 λ§νμλ©΄ λ€μκ³Ό κ°λ€. (λλ©μΈ λΆλ¦¬ λ° μ€κ³ κ΄μ μμλ§)
λ©€λ²
, μ΄λ²€νΈ
, κ°κ²
, 리뷰
, μ¦κ²¨μ°ΎκΈ°
, μ’μμ
λ‘ λΆλ¦¬νμμΌλ©° λ°μ΄ν°κ° μ μ₯λκ³ μ‘°νλλ κ²μ κ³ λ €νμ¬ ERDμ ν¨κ» APIλ₯Ό μ€κ³νλ, Restful API μ€κ³ λΏλ§ μλλΌ, κ°λ° λν μ½κ² ν μ μμλ€. μ΄μ νλ‘μ νΈμ λΉν΄ μλμ μΌλ‘ μꡬμ¬νμ΄ κ°λ¨ν΄μ λΆλ¦¬νκΈ° μ¬μ μ μ μμ§λ§, κ°μμ μΌλ‘ βμΈλΆνλ λλ©μΈβμ λ³Ό μ μμ΄μ λ§μ‘±μ€λ¬μ λ€.
Everevent Project ERD
μ΄μ νλ‘μ νΈμμ μλͺ»νλ μ μ κ³ μΉκΈ° μν΄μ μ΄λ»κ² ν΄μΌν μ§ κ³ λ―Όμ΄ λ§μλ€. μ΄μ΄ μ’κ²λ(?!) μ΄μ λ°©μμ νμμ λ²μ΄λμ§ λͺ»ν λ°©λ²μΌλ‘ μν μ λλλ €λ€κ° μ΄κ±Έ κ²λνμ΄μμ μ§μΌλ³Έ λ©ν λμ νΌλλ°±μ μ μ μ΄ λ²μ©νλ κΈ°μ΅μ΄ μλ€.
βμ΅λν μμ λ¨μλ‘ μ΄μλ₯Ό νκ³ μ°μ μμ λ³λ‘ μ λ ¬ν λ€, λ€ λλΈ μ¬λμ΄ λ€μ μ΄μλ₯Ό ν΄κ²°νλ λ°©μμΌλ‘ ν΄λ³΄μΈμ!β - λ©ν λ Says
κ·Έλμ λ€μκ³Ό κ°μ κ·μΉμ ν΅ν΄ μν μ λΆλ΄νμκ³ μ΄μ μ λλΌμ§ λͺ»νλ μ¬λ¬ μ₯μ λ€μ λ°κ²¬ν μ μμλ€.
λ΄ μκ°μ΄ βμλ²? κ°λ°λ§ μνλ©΄ λμ§β μμ βκ°λ° μνλ €λ©΄ λλ©μΈ μ€κ³μ λν κΉμ΄κ° νμνλ€.β λ λμκ°, κΈ°λ₯λ³ μλΉμ€λ₯Ό λ 립μ μΈ λͺ¨λλ‘ μ ν리μΌμ΄μ μ κ΄λ¦¬νλ βMSA 곡λΆν΄λ³΄μ!β λ‘ λ°λκ² λ μμ€ν κ²½νμΈ λ νλ‘μ νΈμλ€.
κ° λΆλΆ λΆλΆ λ§λ€ λλμ μ μ¦ν₯μ μΌλ‘ μ λλΌ μ₯ν©νμ§λ§,
λ νλ‘μ νΈλ₯Ό ν΅ν΄
μ μκ² λλ κ² κ°λ€.
κ·Έλμ λ€μ ν¬μ€ν
λΆν°λ DDD(λλ©μΈ μ£Όλ κ°λ°)κ³Ό MSA(λ§μ΄ν¬λ‘ μλΉμ€ μν€ν
μ²)μ λν΄μ 곡λΆνκ³ μ νλ€.
νμ΄ν
! π€π»
μ μ½κ³ κ°λλ€ :)