Skip to content

leeduyoung/event-sourcing

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

실행 방법

1. 의존성 설치

go mod tidy

2. 서버 실행

go run cmd/main.go

3. 예제 실행

go run examples/usage_example.go

API 엔드포인트

Commands (Write Model)

  • POST /api/orders - 주문 생성
  • POST /api/orders/:id/items - 주문 아이템 추가
  • DELETE /api/orders/:id/items/:productId - 주문 아이템 제거
  • POST /api/orders/:id/cancel - 주문 취소
  • POST /api/orders/:id/ship - 주문 배송
  • POST /api/orders/:id/deliver - 주문 배송 완료

Queries (Read Model)

  • GET /api/orders/:id - 주문 조회
  • GET /api/customers/:id/orders - 고객별 주문 조회
  • GET /api/orders - 주문 목록 조회

주요 패턴

1. 이벤트 소싱 (Event Sourcing)

  • 모든 상태 변경을 이벤트로 저장
  • 이벤트 히스토리를 통한 상태 복원
  • 완전한 감사 추적 가능

2. CQRS (Command Query Responsibility Segregation)

  • 명령과 쿼리의 분리
  • 독립적인 읽기/쓰기 모델
  • 성능 최적화 가능

3. 도메인 주도 설계 (DDD)

  • 애그리게이트 패턴
  • 값 객체 활용
  • 도메인 이벤트 사용

사용 예제

// 주문 생성
money, _ := valueobjects.NewMoney(25000, "KRW")
item, _ := valueobjects.NewOrderItem("prod-001", "노트북", 1, money)
items := []*valueobjects.OrderItem{item}

cmd := commands.NewCreateOrderCommand("customer-001", items, "서울시 강남구")
orderID, _ := commandHandlers.HandleCreateOrder(cmd)

// 주문 조회
query := queries.NewGetOrderByIDQuery(orderID)
order, _ := queryHandlers.HandleGetOrderByID(query)

핵심 특징

  • 확장 가능한 아키텍처: 마이크로서비스로 쉽게 분리 가능
  • 이벤트 기반: 비동기 처리 및 이벤트 기반 통합
  • 타입 안전성: Go의 강력한 타입 시스템 활용
  • 테스트 용이성: 의존성 주입과 인터페이스 활용
  • 실무 적용: 실제 프로덕션 환경에서 사용 가능한 구조

테스트

go test ./...

확장 방안

  1. 데이터베이스 연동: PostgreSQL, MongoDB 등
  2. 메시지 큐 연동: RabbitMQ, Apache Kafka 등
  3. 캐싱: Redis, Memcached 등
  4. 모니터링: Prometheus, Grafana 등
  5. API 문서: Swagger/OpenAPI 등

About

Event sourcing sample

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages