관리 메뉴

Tech Log πŸ› οΈ

도메인 주도 개발 μ‹œμž‘ν•˜κΈ° - ν‘œν˜„ μ˜μ—­κ³Ό μ‘μš© μ˜μ—­ λ³Έλ¬Έ

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

도메인 주도 개발 μ‹œμž‘ν•˜κΈ° - ν‘œν˜„ μ˜μ—­κ³Ό μ‘μš© μ˜μ—­

sehaan 2023. 10. 30. 01:18

 

 

ν‘œν˜„ μ˜μ—­κ³Ό μ‘μš© μ˜μ—­

μ‘μš© μ˜μ—­κ³Ό ν‘œν˜„ μ˜μ—­μ€ μ‚¬μš©μžμ™€ 도메인을 μ—°κ²°ν•΄μ£ΌλŠ” 맀개체 역할이닀.

 

ν‘œν˜„ μ˜μ—­μ€ μ‚¬μš©μžμ˜ μš”μ²­μ„ ν•΄μ„ν•˜κ³  κ·Έ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” μ‘μš© μ„œλΉ„μŠ€λ₯Ό μ‹€ν–‰ν•œλ‹€.

μ‘μš© μ˜μ—­μ€ μ‹€μ œ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

 

두 μ˜μ—­μ€ μ„œλ‘œ μš”κ΅¬ν•˜λŠ” νŒŒλΌλ―Έν„°μ™€ ν˜•μ‹μ΄ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ— μš”μ²­μ„ λ³€ν™˜ν•΄μ•Όν•œλ‹€.

μ‚¬μš©μžκ°€ μƒν˜Έμž‘μš©μ€ ν‘œν˜„ μ˜μ—­μ΄ μ²˜λ¦¬ν•˜κΈ° λ•Œλ¬Έμ—, μ‘μš© μ„œλΉ„μŠ€λŠ” ν‘œν˜„ μ˜μ—­μ— μ˜μ‘΄ν•˜μ§€ μ•Šμ•„μ•Όν•œλ‹€.

 

μ‘μš© μ„œλΉ„μŠ€μ˜ μ—­ν• 

μ‚¬μš©μžμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ λ¦¬ν¬μ§€ν„°λ¦¬μ—μ„œ 도메인 객체λ₯Ό 가져와 μ‚¬μš©ν•œλ‹€.

 

public Result func(Req req){
	// λ¦¬ν¬μ§€ν„°λ¦¬μ—μ„œ μ• κ·Έλ¦¬κ±°νŠΈλ₯Ό ꡬ함
	Agg agg = AggRepository.finById(req.getId());
    
    // μ• κ·Έκ±°νŠΈμ˜ 도메인 κΈ°λŠ₯ μ‹€ν–‰
    add.doFunc(req.getValue());
    
    // κ²°κ³Ό 리턴
    return createSuccessResult(agg)

}

 

 

도메인 λ‘œμ§μ„ 도메인 μ˜μ—­κ³Ό μ‘μš© μ„œλΉ„μŠ€μ— λΆ„μ‚°ν•΄μ„œ κ΅¬ν˜„ν•˜λ©΄ μ—¬λŸ¬ λ¬Έμ œκ°€ λ°œμƒν•œλ‹€.

1. μ½”λ“œμ˜ 응집성이 떨어진닀.

2. λ™μΌν•œ 도메인 λ‘œμ§μ„ κ΅¬ν˜„ν•  κ°€λŠ₯성이 높아진닀.

 

μ‘μš© μ„œλΉ„μŠ€λ₯Ό κ΅¬ν˜„ν•  λ•Œ λͺ‡κ°€μ§€ κ³ λ €ν•  사항이 μžˆλ‹€.

1. μ‘μš© μ„œλΉ„μŠ€μ˜ 크기

도메인과 κ΄€λ ¨λœ κΈ°λŠ₯을 ν•œ μ„œλΉ„μŠ€μ— λ„£λŠ”λ‹€λ©΄ ν΄λž˜μŠ€κ°€ 컀지고 κ΄€λ ¨μ—†λŠ” μ½”λ“œκ°€ λ’€μ„žμΌ 수 μžˆλ‹€.

ν•œ μ‘μš© ν΄λž˜μŠ€μ—μ„œ ν•œκ°œ 내지 2~3개의 κΈ°λŠ₯을 κ΅¬ν˜„ν•˜λ©΄μ„œ μ„œλΉ„μŠ€ 클래슀λ₯Ό κ΅¬ν˜„ν•˜μž

 

2. μΈν„°νŽ˜μ΄μŠ€κ°€ ν•„μš”ν•œ 지

κ΅¬ν˜„ ν΄λž˜μŠ€κ°€ μ—¬λŸ¬ κ°œκ°€ μ•„λ‹Œ 경우, μΈν„°νŽ˜μ΄μŠ€λŠ” λΆˆν•„μš”ν•˜λ‹€.

 

μ‘μš© μ„œλΉ„μŠ€μ—μ„œ μ• κ·Έλ¦¬κ±°νŠΈ 자체λ₯Ό λ¦¬ν„΄ν•˜λ©΄ 도메인 λ‘œμ§μ„ μ—¬λŸ¬ κ³³μ—μ„œ μ‹€ν–‰ν•  수 μžˆκ²Œλœλ‹€.

λ”°λΌμ„œ μ‘μš© μ„œλΉ„μŠ€μ—μ„œλŠ” ν•„μš”ν•œ λ°μ΄ν„°λ§Œ λ¦¬ν„΄ν•˜λŠ” 것이 응집도λ₯Ό λ†’μ΄λŠ” 방법이닀.

 

μ‘μš© μ„œλΉ„μŠ€μ˜ κ΅¬ν˜„

 

μ‘μš© μ„œλΉ„μŠ€λŠ” ν‘œν˜„ μ˜μ—­μ— μ˜μ‘΄ν•˜μ§€ μ•Šμ•„μ•Όν•œλ‹€.

κ·Έ μ΄μœ λŠ” 

1. μ‘μš© μ„œλΉ„μŠ€λ§Œ λ‹¨λ…μœΌλ‘œ ν…ŒμŠ€νŠΈν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€.

2. ν‘œν˜„ μ˜μ—­μ˜ μ—­ν• κΉŒμ§€ λŒ€μ‹ ν•˜κ²Œ λœλ‹€.

 

ν‘œν˜„ μ˜μ—­μ˜ μƒνƒœλ₯Ό μ‘μš© μ„œλΉ„μŠ€μ—μ„œ 변경해버리면 λ‘œμ§μ„ μΆ”μ ν•˜κΈ° μ–΄λ €μ›Œμ§„λ‹€. -> μœ μ§€λ³΄μˆ˜ λΉ„μš© 증가

이λ₯Ό μœ„ν•΄μ„œ μ„œλΉ„μŠ€ λ©”μ„œλ“œμ˜ νŒŒλΌλ―Έν„°μ™€ 리턴 νƒ€μž…μ΄ ν‘œν˜„ μ˜μ—­μ˜ κ΅¬ν˜„ κΈ°μˆ μ„ μ‚¬μš©ν•˜μ§€ μ•ŠλŠ” 것이닀.

 

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

1. μ‚¬μš©μžκ°€ μ‹œμŠ€ν…œμ„ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ•Œλ§žμ€ 흐름을 μ œκ³΅ν•œλ‹€.

2. μ‚¬μš©μžμ˜ μš”μ²­μ— 맞게 μ‘μš© μ„œλΉ„μŠ€μ— κΈ°λŠ₯ 싀행을 μš”μ²­ν•œλ‹€.

3. μ‘μš© μ„œλΉ„μŠ€μ˜ μ‹€ν–‰ κ²°κ³Όλ₯Ό μ•Œλ§žμ€ ν˜•μ‹μœΌλ‘œ μ œκ³΅ν•œλ‹€.

4. μ‚¬μš©μž μ„Έμ…˜μ„ κ΄€λ¦¬ν•œλ‹€.

 

κ°’ 검증

μ›μΉ™μ μœΌλ‘œ λͺ¨λ“  검증은 μ‘μš© μ„œλΉ„μŠ€μ—μ„œ μ²˜λ¦¬ν•œλ‹€.

ν•˜μ§€λ§Œ 각각의 μ˜ˆμ™Έλ₯Ό λ”°λ‘œ 던질 경우, μ‚¬μš©μžλŠ” ν•˜λ‚˜μ˜ 이유만 확인할 수 μžˆλ‹€.

λ”°λΌμ„œμ—λŸ¬ μ½”λ“œλ₯Ό λͺ¨μ•„ ν•˜λ‚˜μ˜ μ˜ˆμ™Έλ‘œ 던질 μˆ˜λ„ μžˆλ‹€.

 

ν‘œν˜„ μ˜μ—­μ—μ„œ ν•„μˆ˜ κ°’κ³Ό ν˜•μ‹μ„ κ²€μ‚¬ν•˜λ©΄ μ‘μš©μ„œλΉ„μŠ€μ—μ„œλŠ” 논리적 였λ₯˜λ§Œ κ²€μ‚¬ν•˜λ©΄ λœλ‹€.

 

쑰회 μ „μš© κΈ°λŠ₯κ³Ό μ‘μš© μ„œλΉ„μŠ€

μ‘μš© μ„œλΉ„μŠ€κ°€ μ‚¬μš©μž μš”μ²­ κΈ°λŠ₯을 μ‹€ν–‰ν•˜λŠ” 데 별닀λ₯Έ κΈ°μ—¬λ₯Ό ν•˜μ§€ λͺ»ν•œλ‹€λ©΄ ꡳ이 μ„œλΉ„μŠ€λ₯Ό λ§Œλ“€μ§€ μ•Šμ•„λ„ λœλ‹€.