์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- react native ๋ด๋ถ ๊ตฌ์กฐ
- TS
- Aggregate
- ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ
- ์ ๋ณด์ฒ๋ฆฌ๊ธฐ์ฌ
- ๋น๋๊ธฐ
- nextjs์ฌ์ฉ์ด์
- ์ ์ฒ๊ธฐ ์๊ฒฉ
- ์ดํํฐ๋ธ ํ์ ์คํฌ๋ฆฝํธ
- rn
- react native bridge
- std::char_traits<unsigned char>
- js
- ์๋๊ฐ์
- in app purchase
- typeScript
- nextjs ๋ผ์ฐํ
- IAP
- nextjs route code
- react natvie
- nextJS
- rniap
- DDD
- BOUNDED CONTEXT
- ๋น๋ฉ ๋ธ๋ก
- ํ์ ์คํฌ๋ฆฝํธ
- HTML
- ๋ถ๋ณ์
- ์ด๋ฒคํธ ์์คํ
- ์ ์ฒ๊ธฐ ์ค๋น๋ฌผ
- Today
- Total
nika-blog
๐ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(DDD) ๊ทธ ํ - ํ์ฌ์ DDD๋ ์ด๋ป๊ฒ ๋ฐ์ ํ๋๊ฐ? ๋ณธ๋ฌธ
๐ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(DDD) ๊ทธ ํ - ํ์ฌ์ DDD๋ ์ด๋ป๊ฒ ๋ฐ์ ํ๋๊ฐ?
nika0 2025. 2. 23. 14:22๐ ๊ณผ๊ฑฐ์ DDD vs ํ์ฌ์ DDD
๊ณผ๊ฑฐ์ **๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ(DDD)**๋ ์ถ์์ ์ธ ๊ฐ๋
๊ณผ ์ฒ ํ์ ์ธ ์ ๊ทผ์ด ๋ง์์ง๋ง, ํ์ฌ์ DDD๋ ๋ณด๋ค ๊ตฌ์ฒด์ ์ด๊ณ ์ค์ฉ์ ์ธ ํํ๋ก ๋ฐ์ ํ์ต๋๋ค.
ํนํ, ๋๋ฉ์ธ์ ๋ฒ์๋ฅผ ๊ตฌ์ฒดํํ๊ณ ์๋ฃจ์
๊น์ง ํฌํจํ๋ ํํ๋ก ๋ณํํ์ต๋๋ค.
๐ ํ์ฌ์ DDD๋ ํฌ๊ฒ ๋ ๊ฐ์ง ํจํด์ผ๋ก ๋๋ฉ๋๋ค.
1๏ธโฃ ์ ๋ต์ ํจํด (Strategic Patterns) → ๋น์ฆ๋์ค ๋ฌธ์ ๊ณต๊ฐ(Problem Space)์์ ๋๋ฉ์ธ์ ๋ถ๋ฆฌํ๋ ๊ณผ์
2๏ธโฃ ์ ์ ์ ํจํด (Tactical Patterns) → ์๋ฃจ์
๊ณต๊ฐ(Solution Space)์์ ๋๋ฉ์ธ์ ์ฝ๋๋ก ๊ตฌ์ฒดํํ๋ ๋ฐฉ๋ฒ
๐ก ์ฆ, ๋ฌธ์ ๋ฅผ ์ด์์ ์ผ๋ก ๋๋๊ณ (๋์คํธ๋ ์ด์ ), ์ค์ ๊ตฌํ์์ ๋ฐ์ด๋๋ ์ปจํ ์คํธ๋ฅผ ์ด๋ป๊ฒ ์ ์ฉํ ๊ฒ์ธ์ง ๊ณ ๋ฏผํ๋ ๊ณผ์ ์ด ํฌํจ๋จ.
๐น ๋ฐ์ด๋๋ ์ปจํ ์คํธ์ ๋์คํธ๋ ์ด์
๐ ๋ฐ์ด๋๋ ์ปจํ ์คํธ (Bounded Context)
- ์๋ฃจ์ ๊ณต๊ฐ(Solution Space)์์ ๋๋ฉ์ธ ๋ชจ๋ธ์ ํ์ค์ ์ผ๋ก ๋๋๋ ๋ฐฉ๋ฒ
- ํ๋์ ๋๋ฉ์ธ ๋ชจ๋ธ์ด ๋ชจ๋ ์ํฉ์ ์ ํฉํ์ง ์๊ธฐ ๋๋ฌธ์, ํ๋ณ๋ก ๋ฐ์ด๋๋ ์ปจํ ์คํธ๋ฅผ ๋๋์ด ์ด์
๐ ๋์คํธ๋ ์ด์ (Distillation)
- ๋ฌธ์ ๊ณต๊ฐ(Problem Space)์์ ํต์ฌ ๋๋ฉ์ธ๊ณผ ํ์ ๋๋ฉ์ธ์ ๊ตฌ๋ถํ๋ ๊ณผ์
- ๋น์ฆ๋์ค์ ์ผ๋ก ํต์ฌ์ ์ธ ๋๋ฉ์ธ(์ฝ์ด ๋๋ฉ์ธ)๊ณผ ์ง์ ๋๋ฉ์ธ์ ๋ถ๋ฆฌ
๐ก ์ด ๋ ๊ฐ๋ ์ ํ์ฉํ๋ฉด, ๋ถํ์ํ ๋๋ฉ์ธ ๋ณต์ก๋๋ฅผ ์ค์ด๊ณ ์ค์ํ ๋ถ๋ถ์ ์ง์คํ ์ ์์.
๐จ ๋๋ฉ์ธ ์ฃผ๋ ์ค๊ณ ๊ตฌํ - ๋ฐ ๋ฒ๋ ผ(Vaughn Vernon)์ ์ ๋ฆฌ
๐ ๋ฐ ๋ฒ๋ ผ์ "Implementing Domain-Driven Design"์์ ํ์ฌ์ DDD ์ฒด๊ณ ์ ๋ฆฝ
- ์ ์ ์ ํจํด๊ณผ ์ ๋ต์ ํจํด ๊ฐ๋ ์ ํ๋ฆฝ
- ๋ฌธ์ ๊ณต๊ฐ(Problem Space)๊ณผ ์๋ฃจ์ ๊ณต๊ฐ(Solution Space) ๊ฐ๋ ์ ๋์
- ์ํคํ ์ฒ์ ๊ตฌํ์ ๋ํ ๊ฐ์ด๋ ์ ๊ณต
๐ DDD์ ์ํคํ ์ฒ - ํธ๋์ญ์ ๊ด๋ฆฌ ๋ฐ ๋๋ฉ์ธ ์ด๋ฒคํธ
๐ ํธ๋์ญ์ ๋น ํ๋์ ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ
- ํ๋์ ํธ๋์ญ์ ์ด ์ฌ๋ฌ ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ์์ ํ์ง ์๋๋ก ์ ํ
- ์์ :
- Order(OrderLineItem)๊ณผ Customer๊ฐ ๋ณ๋์ ํธ๋์ญ์ ์ ๊ฐ์ง
- ์ฃผ๋ฌธ ์(Order Count)๋ ๊ณ ๊ฐ(Customer) ์ํฐํฐ์ ์ง์ ์ฐ๊ฒฐ๋์ง ์์
๐ ๋๋ฉ์ธ ์ด๋ฒคํธ (Domain Event) - Eric Evans
- ๋๋ฉ์ธ ๋ชจ๋ธ์์ ๋ฐ์ํ ์ค์ํ ์ฌ๊ฑด์ ๊ธฐ๋กํ๋ ๊ฐ๋
- DB ์ํ ๋ณ๊ฒฝ์ ์ง์ ๊ฐ์งํ๋ ๊ฒ์ด ์๋๋ผ, ์ด๋ฒคํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ค๋ฅธ ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ์ ๋๊ธฐํ
- ์ฃผ๋ฌธ ์์ฑ(Order Created), ๊ฒฐ์ ์๋ฃ(Payment Processed) ๋ฑ์ ์ด๋ฒคํธ ํ์ฉ
๐ ์ด๋ฒคํธ ์์ฑ (Event Sourcing)
๐ ๋ฐ์ดํฐ๋ฒ ์ด์ค(DB)์ ์ต์ข ์ํ๋ง ์ ์ฅํ๋ ๊ฒ์ด ์๋๋ผ, ๋ณ๊ฒฝ ์ด๋ ฅ์ ๋ชจ๋ ๊ธฐ๋กํ๋ ๋ฐฉ์
๐ก ์ผ๋ฐ์ ์ธ DB๋ ๋ค์๊ณผ ๊ฐ์ด ์ ์ฅ๋จ.
๐ ํ์ง๋ง, ๋ณํ ๊ณผ์ ์ ์ถ์ ํ๋ ค๋ฉด?
- ์ด๋ฒคํธ ์์ฑ์ ํ์ฉํ์ฌ ๋ชจ๋ ๋ณ๊ฒฝ ์ด๋ ฅ์ ์ ์ฅ
- DB๊ฐ ์๋๋ผ **์ด๋ฒคํธ ์คํ ์ด(Event Store)**์ ์ ์ฅ
- ์ด๋ฒคํธ ๋ก๊ทธ๋ฅผ ์ฌ์ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ด๋ ๋์ผํ ์ํ๋ฅผ ๋ณต๊ตฌํ ์ ์์
- ์ค๋ฌด์์๋ ์ฑ๋ฅ ์ด์๋ก ์์ ํ ์ด๋ฒคํธ ์์ฑ๋ง์ ์ฌ์ฉํ๋ ๊ฒ์ ์ด๋ ค์
โ ์ด๋ฒคํธ ์์ฑ์ด ๋ฑ์ฅํ ์ด์ ?
- ๋๋ฉ์ธ ์ด๋ฒคํธ์ ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ๋ฅผ ๋ณด๋ค ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ธฐ ์ํด
- ๋น์ฆ๋์ค ํ๋ฆ์ ์ถ์ ํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ๋ช ํํ๊ฒ ์ดํดํ ์ ์๋๋ก ์ง์
โ CQRS - ๋ณต์ก์ฑ ํด๊ฒฐ์ ์ํ ๋๋ฉ์ธ ๋ชจ๋ธ ๋ถ๋ฆฌ
๐ก ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ๊ฐ ์ฑ ์์ด ๊ณผ๋ํด์ง๋ฉด?
- ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ๋ ์์ (Write) ๋ฒ์๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ๋ ์ด์ง, ์กฐํ(Read) ๊ธฐ๋ฅ๊น์ง ํฌํจํ๋ ๊ฒ์ ์ ์ ํ์ง ์์
- UI์์ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ๋ ์กฐํ(์ฟผ๋ฆฌ)๊น์ง ์ ๊ทธ๋ฆฌ๊ฒ์ดํธ๊ฐ ๋ด๋นํ๋ฉด ๋ถํ์ํ ๋ณต์ก์ฑ์ด ์ฆ๊ฐ
๐ CQRS(Command Query Responsibility Segregation)๋?
- ์กฐํ ๋ชจ๋ธ(Query Model)๊ณผ ๋ณ๊ฒฝ ๋ชจ๋ธ(Command Model)์ ๋ถ๋ฆฌํ๋ ๋ฐฉ์
- ์ผ๋ฐ์ ์ผ๋ก ์ฝ๊ธฐ(Read)๋ ์ต์ ํ๋ ์ฟผ๋ฆฌ ๋ฐฉ์์ผ๋ก ๋น ๋ฅด๊ฒ ์ ๊ณต
- ์ฐ๊ธฐ(Write)๋ ๋๋ฉ์ธ ๋ชจ๋ธ์ ํตํด ์ฒ ์ ํ๊ฒ ๊ฒ์ฆ
๐ CQRS ํ์ฉ ์์
- ์ํ ๋ฐ์ดํฐ๊ฐ ๋ฐฉ๋ํ ๊ฒฝ์ฐ, ์ง์ JOINํด์ ์กฐํํ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ๋ฐ์
- ํด๊ฒฐ ๋ฐฉ๋ฒ:
- ๋ฐ์ดํฐ๋ฅผ ๋ณ๋๋ก ๋ถ๋ฆฌํ๊ณ Kafka ๋ฑ์ ๋ฉ์์ง ํ๋ฅผ ํ์ฉํ์ฌ ์ ์ก
- ๋น ๋ฅธ ์กฐํ๋ฅผ ์ํด ๋ณ๋์ ์บ์(Cache) ๋๋ ๊ฒ์ ์ธ๋ฑ์ค ํ์ฉ
โ ๊ฒฐ๊ณผ์ ์ผ๋ก, CQRS๋ฅผ ํ์ฉํ๋ฉด ๋ณต์กํ ๋๋ฉ์ธ ๋ชจ๋ธ์์๋ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์.
๐ DDD์ MSA (Microservices Architecture)์ ์ฐ๊ฒฐ
๐ก DDD๋ MSA(๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ)์ ํจ๊ป ์ฑ์ฅํ๋ค!
- 2012๋ ์ดํ MSA๊ฐ ์ ํํ๋ฉด์, ์์ ์๋น์ค๋ค์ ๊ฒฐํฉ์ด ํ๋์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ตฌ์ฑํ๋ ๋ฐฉ์์ผ๋ก ๋ณํ
- ๋ฐ์ด๋๋ ์ปจํ ์คํธ ๊ฐ๋ ์ด MSA์์ ํต์ฌ ๊ฐ๋ ์ผ๋ก ํ์ฉ๋จ
- ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ํ๋์ ๋ฐ์ด๋๋ ์ปจํ ์คํธ๋ก ๋์ํ๋ฉฐ, ์๋น์ค ๊ฐ์ ๊ด๊ณ๋ฅผ ๋ช ํํ ์ ์
โ DDD๋ MSA์ ํจ๊ป ์์คํ ์ ๋ถ๋ฆฌํ๋ ๋ฐฉ๋ฒ๋ก ์ผ๋ก ์๋ฆฌ ์ก์!
๐ ํต์ฌ๊ณ ๋ ์ํคํ ์ฒ(Hexagonal Architecture)์ ์ฌ์กฐ๋ช
๐ 2005๋ ๋ฑ์ฅํ "Hexagonal Architecture"
- ํต์ฌ ๊ฐ๋ : UI๋ DB์ ์์กดํ์ง ์๋ ๋ ๋ฆฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ค๊ณ
- ์๋ํ๋ ํ ์คํธ๊ฐ ์ฉ์ดํ๊ณ , ๋ณ๊ฒฝ์ด ์ ์ฐํจ
- ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ "ํต์ฌ(Core)"์ผ๋ก ๋๊ณ ,
์ ์ถ๋ ฅ(Ports)๊ณผ ์ธ๋ถ ์์คํ (Adapters)์ ๋ณ๋๋ก ๋ถ๋ฆฌ
๐ก ํ์ง๋ง DDD๋ฅผ ํ๋ค๊ณ ๋ฌด์กฐ๊ฑด Hexagonal Architecture๋ฅผ ์ฌ์ฉํ ํ์๋ ์์!
- ๋์ ๋ ๋ฆฝ์ ์ธ ๊ฐ๋ ์ด๋ฉฐ,
- ํ๋ก์ ํธ์ ํน์ฑ๊ณผ ์๊ตฌ์ฌํญ์ ๋ฐ๋ผ ์ ์ ํ ์ํคํ ์ฒ๋ฅผ ์ ํํด์ผ ํจ.
๐ ๊ฒฐ๋ก : ํ์ฌ์ DDD๋?
โ
๊ณผ๊ฑฐ์ ์ด๋ก ์ ๊ฐ๋
์์ ๋ฒ์ด๋, ์ค์ฉ์ ์ธ ์ค๊ณ ๋ฐ ๊ตฌํ ๋ฐฉ๋ฒ๋ก ์ผ๋ก ๋ฐ์
โ
๋ฐ์ด๋๋ ์ปจํ
์คํธ์ ๋์คํธ๋ ์ด์
์ ํ์ฉํ์ฌ ๋๋ฉ์ธ ๋ชจ๋ธ์ ๋ช
ํํ๊ฒ ๋ถ๋ฆฌ
โ
๋๋ฉ์ธ ์ด๋ฒคํธ์ ์ด๋ฒคํธ ์์ฑ์ ํตํด ๋ฐ์ดํฐ ๋ณ๊ฒฝ์ ์ถ์ ํ๊ณ , ์์ ์ฑ์ ๋ณด์ฅ
โ
CQRS๋ฅผ ํ์ฉํ์ฌ ๋ณต์ก์ฑ์ ํด๊ฒฐํ๊ณ , ์ฑ๋ฅ์ ์ต์ ํ
โ
MSA ๋ฐ ๋ค์ํ ์ํคํ
์ฒ ํจํด๊ณผ ํจ๊ป ์ฌ์ฉ๋๋ฉฐ, ๋์ฑ ์ค์ฉ์ ์ธ ๊ฐ๋
์ผ๋ก ์๋ฆฌ ์ก์
๐ก ๊ณผ๊ฑฐ์๋ "์ด๋ก ์ ์ธ ์ฒ ํ"์ ๊ฐ๊น์ ๋ DDD๊ฐ, ์ด์ ๋ ํ์ค์ ์ผ๋ก ์ ์ฉํ ์ ์๋ ์ค๋ฌด ์ง์นจ์ผ๋ก ๋ณํํ๊ณ ์์ต๋๋ค! ๐