관리 메뉴

Tech Log πŸ› οΈ

도메인 주도 개발 μ‹œμž‘ν•˜κΈ° - μ•„ν‚€ν…μ²˜ κ°œμš” λ³Έλ¬Έ

개발 μ„œμ /DDD μ‹œμž‘ν•˜κΈ°

도메인 주도 개발 μ‹œμž‘ν•˜κΈ° - μ•„ν‚€ν…μ²˜ κ°œμš”

sehaan 2023. 10. 18. 13:44

λ„€ 개의 μ˜μ—­

ν‘œν˜„ μ˜μ—­

HTTP μš”μ²­μ„ ν•„μš”λ‘œ ν•˜λŠ” ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•΄μ„œ μ‘μš© μ˜μ—­μ— μ „λ‹¬ν•˜κ³  λ‹€μ‹œ 응닡을 HTTP μ‘λ‹΅μœΌλ‘œ λ³€ν™˜ν•˜μ—¬ 전솑

ex) mvc ν”„λ ˆμž„μ›Œν¬

 

μ‘μš© μ˜μ—­(μ„œλΉ„μŠ€ 계측)

도메인 μ˜μ—­μ˜ λͺ¨λΈμ„ μ‚¬μš©ν•΄μ„œ μ‚¬μš©μžμ—κ²Œ μ œκ³΅ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„ν•œλ‹€.

λ‘œμ§μ„ 직접 μˆ˜ν–‰ν•˜κΈ° 보단 도메인 λͺ¨λΈμ— 둜직 μˆ˜ν–‰μ„ μœ„νž˜

 

도메인 μ˜μ—­

도메인 λͺ¨λΈμ„ κ΅¬ν˜„ν•˜κ³  핡심 λ‘œμ§μ„ κ΅¬ν˜„

 

public cancelOrder(String orderId) {
	Order order = findOrderById(orderId); // 도메인 λͺ¨λΈμ— μœ„μž„
    ...
}

 

인프라 슀트럭쳐 μ˜μ—­

논리적 κ°œλ… λ³΄λ‹€λŠ” κ΅¬ν˜„ κΈ°μˆ μ„ 닀룬닀.

ex) DB ,SMTP , μΉ΄ν”„μΉ΄

 

계측 ꡬ쑰 μ•„ν‚€ν…μ²˜

μ•„ν‚€ν…μ²˜λŠ” 보톡

ν‘œν˜„ -> μ‘μš© -> 도메인 -> μΈν”„λΌμŠ€νŠΈλŸ­μ³ 둜 μ΄λ£¨μ–΄μ Έμžˆλ‹€.

 

μƒμœ„ 계측은 ν•˜μœ„ 계측에 μ˜μ‘΄ν•  수 μžˆμ§€λ§Œ κ·Έ λ°˜λŒ€λŠ” μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.

κΌ­ λ°”λ‘œ μ•„λž˜ κ³„μΈ΅μ—λ§Œ μ˜μ‘΄ν•˜μ§€ μ•Šκ³  μœ μ—°μ μœΌλ‘œ μ˜μ‘΄μ„±μ„ 가져가기도 ν•œλ‹€.

ex) μ‘μš© -> 인프라

 

ν•˜μ§€λ§Œ 이 경우 두 가지 λ¬Έμ œκ°€ 생긴닀

1. κ΅¬ν˜„ 섀정을 λͺ¨λ‘ λλ‚΄μ•Όν•˜κΈ° λ•Œλ¬Έμ— ν…ŒμŠ€νŠΈκ°€ 어렀움 

2. κ΅¬ν˜„ 방식을 λ³€κ²½ν•˜κΈ° 어렀움

 

λ”°λΌμ„œ DIPλ₯Ό μ μš©ν•˜λ©΄ μœ„μ˜ 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

 

DIP

κ³ μˆ˜μ€€ λͺ¨λ“ˆ

- 의미 μžˆλŠ” 단일 κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” λͺ¨λ“ˆ

- μ—¬λŸ¬κ°€μ§€ ν•˜μœ„ κΈ°λŠ₯이 ν•„μš”ν•˜λ‹€

 

μ €μˆ˜μ€€ λͺ¨λ“ˆ

- κ³ μˆ˜μ€€ λͺ¨λ“ˆμ˜ ν•˜μœ„ κΈ°λŠ₯을 κ΅¬ν˜„ 

ex) JPA , Drools

 

κ³ μˆ˜μ€€ λͺ¨λ“ˆμ΄ μ €μˆ˜μ€€ λͺ¨λ“ˆμ— μ˜μ‘΄ν•˜λ©΄ μ•žμ„œ λ§ν•œ 두가지 λ¬Έμ œκ°€ 생긴닀.

κ·Έλž˜μ„œ DIPλŠ” μ €μˆ˜μ€€ λͺ¨λ“ˆμ΄ κ³ μˆ˜μ€€ λͺ¨λ“ˆμ— μ˜μ‘΄ν•˜λ„λ‘ λ°”κΎΌλ‹€.

μ΄λ•Œ μΆ”μƒν™”ν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•œλ‹€.

 

 

μΈν„°νŽ˜μ΄μŠ€λ₯Ό 톡해 더 이상 κ³ μˆ˜μ€€ λͺ¨λ“ˆμ΄ μ €μˆ˜μ€€ λͺ¨λ“ˆμ— μ˜μ‘΄ν•˜μ§€ μ•ŠλŠ”λ‹€.

이λ₯Ό 의쑴 관계 μ—­μ „(DIP)라고 ν•œλ‹€.

 

DIPλ₯Ό 톡해 두 가지 문제λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

1. 기술 ꡐ체λ₯Ό μ‰½κ²Œ ν•  수 μžˆλ‹€.

// μ‚¬μš©ν•  μ €μˆ˜μ€€ 객체 생성
Rule Discounter ruleDiscounter = new DroolsRuleDiscounter();

// μƒμ„±μž λ°©μ‹μœΌλ‘œ μ£Όμž…
CalculateDiscountService disService = new CalculateDiscountService(ruleDiscounter);

2. ν…ŒμŠ€νŠΈκ°€ μš©μ΄ν•˜λ‹€.

κΈ°μ‘΄μ—λŠ” 기술이 κ΅¬ν˜„λ˜μ–΄μ•Ό ν•  수 μžˆμ—ˆμ§€λ§Œ 이젠 λŒ€μ—­κ°μ²΄(mock)을 μ΄μš©ν•΄μ„œ κ°„νŽΈν•˜κ²Œ μ§„ν–‰ν• μˆ˜ μžˆλ‹€.

μŠ€ν…μ΄λ‚˜ λͺ¨μ˜ 객체와 같은 ν…ŒμŠ€νŠΈ λͺ©μ μ˜ λŒ€μ—­μ„ μ‚¬μš©ν•˜μ—¬ 거의 λͺ¨λ“  상황을 ν…ŒμŠ€νŠΈν•  수 μžˆλ‹€ !

 

* μΈν„°νŽ˜μ΄μŠ€λ₯Ό 섀계할 λ•Œ μ €μˆ˜μ€€ λͺ¨λ“ˆμ—μ„œ μΆ”μΆœν•˜μ§€ μ•Šμ•„μ•Όν•œλ‹€ !!

* ν•˜μœ„ κΈ°λŠ₯을 μΆ”μƒν™”ν•œ μΈν„°νŽ˜μ΄μŠ€λŠ” κ³ μˆ˜μ€€ λͺ¨λ“ˆ κ΄€μ μ—μ„œ λ„μΆœν•œλ‹€ !!

 

도메인 μ˜μ—­μ˜ μ£Όμš” κ΅¬μ„±μš”μ†Œ

μ—”ν‹°ν‹°

- 고유의 μ‹λ³„μžλ₯Ό 가지고 λ„λ©”μΈμ˜ κ³ μœ ν•œ κ°œλ…μ„ ν‘œν˜„ν•œλ‹€.

 

λ°Έλ₯˜

- κ°œλ…μ μœΌλ‘œ ν•˜λ‚˜μΈ 값을 ν‘œν˜„

ex) μ£Όμ†Œ , κΈˆμ•‘

 

μ• κ·Έλ¦¬κ±°νŠΈ

- μ—°κ΄€λœ 엔티티와 λ°Έλ₯˜ 객체λ₯Ό κ°œλ…μ μœΌλ‘œ 묢은 것

 

리포지터리

- 도메인 λͺ¨λΈμ˜ μ˜μ†μ„±μ„ μ²˜λ¦¬ν•œλ‹€.

 

도메인 μ„œλΉ„μŠ€

- νŠΉμ • 엔티티에 μ†ν•˜μ§€ μ•Šμ€ 도메인 둜직

- 도메인 둜직이 μ—¬λŸ¬ 엔티티와 λ°Έλ₯˜λ₯Ό ν•„μš”λ‘œ ν•˜λ©΄ 도메인 μ„œλΉ„μŠ€μ—μ„œ λ‘œμ§μ„ κ΅¬ν˜„ν•œλ‹€.

 

도메인 μ—”ν‹°ν‹° VS DB μ—”ν‹°ν‹°

 

도메인 μ—”ν‹°ν‹°

- 데이터와 ν•¨κ»˜ 도메인 κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

- 도메인 κ΄€μ μ—μ„œ κΈ°λŠ₯을 κ΅¬ν˜„ν•˜κ³  μΊ‘μŠν™”ν•΄μ„œ 데이터가 μž„μ˜λ‘œ λ³€κ²½λ˜λŠ” 것을 λ§‰λŠ”λ‹€.

- κ°œλ…μ μœΌλ‘œ ν•˜λ‚˜μΈ 경우 밸루 νƒ€μž…μ„ μ΄μš©ν•΄μ„œ ν‘œν˜„ν•  수 μžˆλ‹€.

 

μ• κ·Έλ¦¬κ±°νŠΈ

- κ°œλ³„ 객체뿐만 μ•„λ‹ˆλΌ μƒμœ„ μˆ˜μ€€μ—μ„œ λͺ¨λΈμ„ λ³Ό 수 μžˆμ–΄μ•Ό 전체 λͺ¨λΈμ˜ 관계와 κ°œλ³„ λͺ¨λΈμ„ μ΄ν•΄ν•˜λŠ” 데

도움이 λœλ‹€.

- κ΄€λ ¨ 객체λ₯Ό  ν•˜λ‚˜λ‘œ 묢은 ꡰ집

- 객체 ꡰ집 λ‹¨μœ„λ‘œ λͺ¨λΈμ„ 바라본닀.

- 루트 μ—”ν‹°ν‹°λŠ” μ—κ·Έλ¦¬κ±°νŠΈμ— 속해 μžˆλŠ” 엔티티와 λ°Έλ₯˜ 객체λ₯Ό μ΄μš©ν•΄μ„œ κ΅¬ν˜„ν•΄μ•Όν•  κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

- 루트 μ—”ν‹°ν‹°λ₯Ό 톡해 λ‹€λ₯Έ μ—”ν‹°ν‹°λ‚˜ λ°Έλ₯˜ 객체에 μ ‘κ·Όν•œλ‹€.-> μΊ‘μŠν™”

 

리포지터리

- μ• κ·Έλ¦¬κ±°νŠΈ λ‹¨μœ„λ‘œ 객체λ₯Ό μ €μž₯ν•˜κ³  μ‘°νšŒν•˜λŠ” κΈ°λŠ₯을 μ •μ˜ν•œλ‹€.

- 도메인 λͺ¨λΈμ„ μ‚¬μš©ν•΄μ•Ό ν•˜λŠ” μ½”λ“œλŠ” 리포지터리λ₯Ό 톡해 도메인 객체λ₯Ό κ΅¬ν•œ 뒀에 도메인 객체의 κΈ°λŠ₯을 μ‚¬μš©