GO · 구조체/인터페이스
도메인 주도 설계 (DDD) 기초
값 객체, 엔티티, 애그리거트 등 DDD 핵심 개념을 Go로 구현합니다.
구조체/인터페이스고급dddvalue-objectentityaggregate
핵심 설명
값 객체, 엔티티, 애그리거트 등 DDD 핵심 개념을 Go로 구현합니다.
Go code
package main
import (
"errors"
"fmt"
)
// 값 객체 (Value Object) — 불변, 동등성으로 비교
type Money struct {
Amount int64
Currency string
}
func (m Money) Add(other Money) (Money, error) {
if m.Currency != other.Currency {
return Money{}, errors.New("통화 불일치")
}
return Money{Amount: m.Amount + other.Amount, Currency: m.Currency}, nil
}
// 엔티티 — ID로 식별
type Product struct {
ID string
Name string
Price Money
}
// 애그리거트 루트
type Cart struct {
ID string
Items []CartItem
}
type CartItem struct {
Product Product
Qty int
}
func (c *Cart) AddItem(p Product, qty int) {
c.Items = append(c.Items, CartItem{Product: p, Qty: qty})
}
func (c *Cart) Total() Money {
total := Money{Currency: "KRW"}
for _, item := range c.Items {
m := Money{Amount: item.Product.Price.Amount * int64(item.Qty), Currency: "KRW"}
total, _ = total.Add(m)
}
return total
}
func main() {
p := Product{ID: "1", Name: "Go 책", Price: Money{35000, "KRW"}}
cart := &Cart{ID: "cart-1"}
cart.AddItem(p, 2)
fmt.Printf("총액: %d %s\n", cart.Total().Amount, cart.Total().Currency)
}학습 팁
값 객체는 구조체 비교(==)로 동등성을 판단합니다. 모든 필드가 comparable이면 자동으로 비교 가능합니다.
주의할 점
애그리거트 내부 엔티티를 외부에서 직접 수정하면 불변식이 깨집니다. 반드시 애그리거트 루트의 메서드를 통해 수정하세요.
자주 묻는 질문
도메인 주도 설계 (DDD) 기초란 무엇인가요?
값 객체, 엔티티, 애그리거트 등 DDD 핵심 개념을 Go로 구현합니다.
도메인 주도 설계 (DDD) 기초 학습 시 주의할 점은 무엇인가요?
애그리거트 내부 엔티티를 외부에서 직접 수정하면 불변식이 깨집니다. 반드시 애그리거트 루트의 메서드를 통해 수정하세요.
Continue Learning
Go 학습을 이어가세요
총 200개의 독립 HTML 학습 문서 중 하나입니다. 각 문서는 고유 URL과 canonical 메타데이터를 가집니다.