관리 메뉴

Tech Log πŸ› οΈ

도메인 주도 개발 μ‹œμž‘ν•˜κΈ° - 도메인 λͺ¨λΈ μ‹œμž‘ν•˜κΈ° λ³Έλ¬Έ

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

도메인 주도 개발 μ‹œμž‘ν•˜κΈ° - 도메인 λͺ¨λΈ μ‹œμž‘ν•˜κΈ°

sehaan 2023. 10. 15. 20:16

 

μš”κ΅¬ 사항

μš”κ΅¬μ‚¬ν•­μ„ μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•˜μ§€ λͺ»ν•˜λ©΄ μ—‰λš±ν•œ κΈ°λŠ₯을 λ§Œλ“€κ²Œ λœλ‹€.

(Garbage in , Garbage out)

-> 코딩에 μ•žμ„œ μš”κ΅¬μ‚¬ν•­μ„ μ˜¬λ°”λ₯΄κ²Œ μ΄ν•΄ν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€ !

 

도메인 λͺ¨λΈ

νŠΉμ • 도메인을 κ°œλ…μ μœΌλ‘œ ν‘œν˜„ν•œ 것을 도메인 λͺ¨λΈμ΄λΌκ³  ν•œλ‹€.

도메인 λͺ¨λΈμ„ μ‚¬μš©ν•˜λ©΄ μ—¬λŸ¬ κ΄€κ³„μžλ“€μ΄ λ™μΌν•œ λͺ¨μŠ΅μœΌλ‘œ 이해할 수 있으며, μ—¬λŸ¬κ°€μ§€ μ’…λ₯˜λ‘œ λͺ¨λΈλ§ ν•  수 μžˆλ‹€.

ex) 객체 , μƒνƒœ λ‹€μ΄μ–΄κ·Έλž¨, κ·Έλž˜ν”„

 

도메인 λͺ¨λΈ νŒ¨ν„΄

도메인 계측은 λ„λ©”μΈμ˜ 핡심 κ·œμΉ™μ„ κ΅¬ν˜„ν•œλ‹€.

μ•„λž˜μ˜ μ½”λ“œλŠ” μ£Όλ¬Έ μƒνƒœμ— 따라 배솑지λ₯Ό λ³€κ²½ν•  수 μžˆλŠ” 가에 λŒ€ν•œ μ½”λ“œλ₯Ό 도메인 λͺ¨λΈ νŒ¨ν„΄μœΌλ‘œ κ΅¬ν˜„

public class Order {
	private OrderState state;
    private ShippingInfo info;
    
    public void changeShippingInfo(ShippingInfo info) {
    	if(!state.isShippingChangeable()) {
        	// μ˜ˆμ™Έμ²˜λ¦¬
        }
        ...
    }
    ...
}

public enum OrderState {
	PAYMENT_WAITING {
    	public boolean isShippingChangeable() {
        	return true;
        }
    }
    ...
}

ν˜Ήμ€ μ΄λ ‡κ²Œλ„ κ΅¬ν˜„ν•  수 μžˆλ‹€.

public class Order {
	private OrderState state;
    private ShippingInfo info;
    
    public void changeShippingInfo(ShippingInfo info) {
    	if(!state.isShippingChangeable()) {
        	// μ˜ˆμ™Έμ²˜λ¦¬
        }
        ...
    }
    
	private boolean isShippingChangeable() {
    	return state == OrderState.PAYMENT_WAITING || ...
    }
    ...
}

public enum OrderState {
	PAYMENT_WAITING
    ...
    ;
    
}

μ€‘μš”ν•œ 점은 Order , OrderState 같은 μ£Όλ¬Έ 도메인 λͺ¨λΈμ— κ΅¬ν˜„ ν–ˆλ‹€λŠ” 점이닀.

μ΄λ ‡κ²Œ ν•¨μœΌλ‘œμ¨ μš”κ΅¬μ‚¬ν•­μ΄ λ³€κ²½λ˜λ”λΌλ„ λ‹€λ₯Έ μ½”λ“œμ— 영ν–₯을 덜 쀄 수 μžˆλ‹€.

 

도메인 λͺ¨λΈ λ„μΆœ

κ΅¬ν˜„μ„ μ‹œμž‘ν•˜λ €λ©΄ 도메인에 λŒ€ν•œ 초기 λͺ¨λΈμ΄ ν•„μš”ν•˜λ‹€.

 

λͺ‡κ°€μ§€ μš”κ΅¬μ‚¬ν•­μœΌλ‘œ λΆ€ν„° κ΅¬ν˜„ν•΄μ•Όν•  κΈ°λŠ₯κ³Ό 데이터λ₯Ό μ•Œ 수 μžˆλ‹€.

ex)

μ΅œμ†Œ ν•œ μ’…λ₯˜ μ΄μƒμ˜ μƒν’ˆ μ£Όλ¬Έ -> 둜직 κ΅¬ν˜„ ν•„μš”

ν•œ μƒν’ˆμ„ ν•œ 개 이상 μ£Όλ¬Έν•  수 μžˆλ‹€. -> ꡬ맀 μƒν’ˆ μ •λ³΄λŠ” μƒν’ˆ 개수λ₯Ό ν¬ν•¨ν•œλ‹€

 

μ—”ν‹°ν‹°

μ—”ν‹°ν‹°μ˜ κ°€μž₯ 큰 νŠΉμ§•μ€ μ‹λ³„μžλ₯Ό κ°€μ§€λŠ” 것이닀.

μ‹λ³„μžλŠ” μ—”ν‹°ν‹°κ°€ μƒμ„±λ˜κ³  속성을 λ°”κΎΈκ³  μ‚­μ œν•  λ•ŒκΉŒμ§€ λ°”λ€Œμ§€ μ•ŠλŠ”λ‹€.

즉 μ‹λ³„μžκ°€ κ°™μœΌλ©΄ 같은 엔티티이닀.

 

μ‹λ³„μžλŠ” μ‚¬μš©ν•˜λŠ” λ„λ©”μΈμ˜ νŠΉμ§•κ³Ό μ‚¬μš©ν•˜λŠ” κΈ°μˆ μ— 따라 달라지며, DBμ—μ„œ 생성해주기도 ν•œλ‹€.

(이 경우 DB에 μ €μž₯ν•΄μ•Ό μ•Œ 수 있음)

 

밸루(value) νƒ€μž… 

κ°œλ…μ μœΌλ‘œ μ™„μ „ν•œ ν•˜λ‚˜λ₯Ό ν‘œν˜„ν•  λ•Œ 밸루 νƒ€μž…μ„ μ‚¬μš©ν•  수 μžˆλ‹€.

private String receiverName;
private String receiverPhoneNumber;

//λ‹€μŒκ³Ό 같이 ν‘œν˜„ κ°€λŠ₯
private Receiver receiver;

 

무쑰건 두 개 μ΄μƒμ˜ ν•„λ“œλ₯Ό κ°€μ Έμ•Ό ν•˜λŠ” 것은 μ•„λ‹ˆλ‹€.

public class Money {
	private int value;
    
    public Money(int value) {
    	this.value = value;
    }
}

λ‹€μŒκ³Ό 같이 μ •μˆ˜ν˜•μ˜ valueλ₯Ό Money 둜 ν‘œν˜„ν•¨μœΌλ‘œμ¨ 의미λ₯Ό λͺ…ν™•ν•˜κ²Œ ν•  수 μžˆλ‹€.

λ˜ν•œ ν•΄λ‹Ή 클래슀 내에 λ”ν•˜κΈ° , κ³±ν•˜κΈ° 같은 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μΆ”κ°€ν•  수 μžˆλ‹€.

 

밸루 νƒ€μž…μ€ μ•ˆμ „ν•œ μ½”λ“œ μž‘μ„±μ„ μœ„ν•΄ λΆˆλ³€μœΌλ‘œ ν‘œν˜„ν•œλ‹€.

*λΆˆλ³€ : 데이터 λ³€κ²½ κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•ŠμŒ

 

도메인 λͺ¨λΈμ΄ set λ©”μ†Œλ“œλ₯Ό 넣지 μ•ŠλŠ” 이유

 

1. 핡심 κ°œλ…μ΄λ‚˜ μ˜λ„λ₯Ό μ½”λ“œμ—μ„œ μ‚¬λΌμ§€κ²Œ ν•œλ‹€.

// 도메인과 μ˜λ„κ°€ λͺ…확함
public void completePayment();

// ν•„λ“œκ°’λ§Œ λ³€κ²½ν•˜κ³  끝, μ˜λ„κ°€ λͺ…ν™•ν•˜μ§€ μ•ŠμŒ
pubic void setStatus();

 

2. 도메인 객체λ₯Ό 생성할 λ•Œ μ˜¨μ „ν•˜μ§€ μ•ŠλŠ” μƒνƒœκ°€ 될 수 μžˆλ‹€.

Order order = new Order();

// set λ©”μ†Œλ“œλ‘œ 값을 전달
order.setOrderLines(lines);

만일 μœ„μ™€ 같이 set λ©”μ†Œλ“œλ‘œ 값을 μ „λ‹¬ν•œλ‹€λ©΄ λ‚˜μ€‘μ— ν•„λ“œκ°€ null인지 κ²€μ‚¬ν•˜λŠ” μ½”λ“œκ°€ ν•„μš”ν•˜λ‹€.

ν•˜μ§€λ§Œ 생성할 λ•ŒλΆ€ν„° λͺ¨λ“  데이터λ₯Ό λ°›λŠ”λ‹€λ©΄ μƒμ„±ν•˜λŠ” μ‹œμ μ— κ²€μ‚¬ν•˜λ©΄ λ˜λ―€λ‘œ ν•΄λ‹Ή 둜직이 ν•„μš”κ°€ 없어진닀.

 

도메인 μš©μ–΄μ™€ μœ λΉ„μΏΌν„°μŠ€ μ–Έμ–΄

도메인 μš©μ–΄λ₯Ό μ½”λ“œμ— λ°˜μ˜ν•˜μ§€ μ•ŠλŠ”λ‹€λ©΄ ν•΄μ„ν•˜λŠ”λ° 뢀담이 λœλ‹€.

// 도메인 μš©μ–΄κ°€ λ°˜μ˜λ˜μ§€ μ•ŠμŒ
public OrderState {
	STEP1,STEP2,STEP3,STEP4;
}

// 도메인 μš©μ–΄κ°€ λ°˜μ˜λ˜μ„œ μ§κ΄€μ μž„
public OrderState {
	PAYMENT_WAITING,PREPARING,SHIPPED,DELIVERING;
}

도메인 μš©μ–΄μ— μ•Œλ§žμ€ 단어λ₯Ό μ°ΎλŠ” μ‹œκ°„μ„ μ•„κΉŒμ›Œν•˜μ§€ 말자!