PHpullh
학습 라이브러리/Go/도메인 주도 설계 (DDD) 기초

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 메타데이터를 가집니다.