| name | go-arch-guard-event-pipeline |
| description | Use when scaffolding or maintaining an event-sourcing / CQRS Go project with go-arch-guard. Handles flat-layout EventPipeline preset setup with command, aggregate, event, projection, eventstore, readstore layers. |
| user_invocable | true |
go-arch-guard โ Event-Driven Pipeline
์ด๋ฒคํธ ์์ฑ / CQRS ํ๋ก์ ํธ์ ์ํคํ
์ฒ ๊ฐ๋๋ ์ผ์ ์ ์ฉํ๋ค.
ํ๋ซ ๋ ์ด์์ โ internal/domain/ ์์ด ๋ ์ด์ด๊ฐ internal/ ๋ฐ๋ก ์๋์ ์์น.
Decision Flow
internal/ ์กด์ฌ ์ฌ๋ถ ํ์ธ
architecture_test.go ์กด์ฌ ์ฌ๋ถ ํ์ธ
์ ํ๋ก์ ํธ โ Quick Init ์คํ
๊ธฐ์กด ํ๋ก์ ํธ โ Layout Reference ์ฐธ์กฐํ์ฌ ์์
Quick Init
Step 1: ์ค์บํด๋ฉ
go get github.com/NamhaeSusan/go-arch-guard
mkdir -p internal/command internal/aggregate internal/event \
internal/projection internal/eventstore internal/readstore \
internal/model internal/pkg
Step 2: architecture_test.go ์์ฑ
import "github.com/NamhaeSusan/go-arch-guard/scaffold"
src, err := scaffold.ArchitectureTest(
scaffold.PresetEventPipeline,
scaffold.ArchitectureTestOptions{PackageName: "myapp_test"},
)
if err != nil {
return err
}
๋นํ์ค ํจํค์ง ๋ฃจํธ(packages/, src/)๋ฅผ ์ฐ๋ฉด ArchitectureTestOptions{..., InternalRoot: "packages"}๋ก ๊ฐ์ด ์ง์ ํ๋ค.
Step 3: ๊ฒ์ฆ
go test -run TestArchitecture -v
Step 4: ์๋ด
์ค์บํด๋ฉ ์๋ฃ.
internal/command/์ ์ปค๋งจ๋ ์ถ๊ฐ: command_xxx.go โ XxxCommand.Execute()
internal/aggregate/์ ์ ๊ทธ๋ฆฌ๊ฑฐํธ ์ถ๊ฐ: aggregate_xxx.go โ XxxAggregate.Apply()
Layout Reference
cmd/pipeline/main.go
internal/
โโโ command/ # command_create_order.go โ CreateOrderCommand.Execute()
โโโ aggregate/ # aggregate_order.go โ OrderAggregate.Apply()
โโโ event/ # ์ด๋ฒคํธ ์ ์ (OrderCreated, OrderShipped ๋ฑ)
โโโ projection/ # ์ฝ๊ธฐ ๋ชจ๋ธ ๊ตฌ์ถ
โโโ eventstore/ # ์ด๋ฒคํธ ์คํ ์ด (append-only)
โโโ readstore/ # ์ฝ๊ธฐ ์คํ ์ด (projection์ฉ CRUD)
โโโ model/ # ๊ณต์ ํ์
โโโ pkg/ # ๊ณต์ ์ธํ๋ผ (eventbus ๋ฑ)
๋ ์ด์ด ๋ฐฉํฅ
| from | ํ์ฉ๋ import |
|---|
command | aggregate, eventstore, model |
aggregate | event, model |
event | model |
projection | event, readstore, model |
eventstore | event, model |
readstore | model |
model | ์์ |
model, event๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ ์ด์ด๋ pkg/๋ฅผ import ๊ฐ๋ฅ.
TypePattern
command/
command/ ๋ด command_*.go ํ์ผ์ ๋์ํ๋ ํ์
๊ณผ ๋ฉ์๋๋ฅผ ์ ์ํด์ผ ํ๋ค.
| ํ์ผ๋ช
| ํ์ ํ์
| ํ์ ๋ฉ์๋ |
|---|
command_create_order.go | CreateOrderCommand | Execute |
command_ship_order.go | ShipOrderCommand | Execute |
aggregate/
aggregate/ ๋ด aggregate_*.go ํ์ผ์ ๋์ํ๋ ํ์
๊ณผ ๋ฉ์๋๋ฅผ ์ ์ํด์ผ ํ๋ค.
| ํ์ผ๋ช
| ํ์ ํ์
| ํ์ ๋ฉ์๋ |
|---|
aggregate_order.go | OrderAggregate | Apply |
aggregate_user.go | UserAggregate | Apply |
prefix๊ฐ ์๋ ํ์ผ (์: helper.go, types.go)์ ๊ฒ์ฌ ๋์ ์๋.
์์
package command
import "context"
type CreateOrderCommand struct {
agg *aggregate.OrderAggregate
store eventstore.Store
}
func (c *CreateOrderCommand) Execute(ctx context.Context) error {
evt := c.agg.Apply(ctx)
return c.store.Save(ctx, evt)
}
package aggregate
import "context"
type OrderAggregate struct{}
func (a *OrderAggregate) Apply(ctx context.Context) error {
return nil
}
๋ฐ์ดํฐ ํ๋ฆ
Command โ Aggregate โ Event
โ EventStore โโโโ
โ
Projection โ ReadStore
- Command ์์ โ Aggregate์ ์์ + EventStore์ ์ ์ฅ
- Aggregate๊ฐ ๋น์ฆ๋์ค ๊ท์น ๊ฒ์ฆ โ Event ์์ฑ (์ ์ฅ์ ์์กด ์์)
- Projection์ด Event๋ฅผ ๊ตฌ๋
โ ์ฝ๊ธฐ ๋ชจ๋ธ ๊ตฌ์ถ โ ReadStore์ ์ ์ฅ
Options
ctx := core.NewContext(pkgs, "", "", presets.EventPipeline(), []string{"internal/legacy/..."})
core.Run(ctx, presets.RecommendedEventPipeline(),
core.WithSeverityOverride("dependency.invalid-import-direction", core.Warning))
์ ์ฉ๋๋ ๊ท์น
| ์นดํ
๊ณ ๋ฆฌ | ๊ท์น |
|---|
| ๋ ์ด์ด ๋ฐฉํฅ | dependency.invalid-import-direction, dependency.inner-imports-pkg |
| ๊ตฌ์กฐ | structural.internal-top-level, structural.banned-package-name, structural.legacy-package, structural.middleware-placement |
| ๋ค์ด๋ฐ | naming.no-stutter, naming.no-impl-suffix, naming.snake-case-file, naming.no-layer-suffix, testpolicy.no-handmock |
| ํ์
ํจํด | naming.type-pattern-mismatch, naming.type-pattern-missing-method |
| ์ธํฐํ์ด์ค ํจํด | interfaces.exported-impl, interfaces.constructor-name, interfaces.constructor-returns-interface, interfaces.single-per-package |
| ์ปคํ๋ง | dependency.high-coupling |
๋ฏธ์ ์ฉ: dependency.* (๋๋ฉ์ธ ๊ฒฉ๋ฆฌ) โ ํ๋ซ ๋ ์ด์์์๋ ๋๋ฉ์ธ ๊ฐ๋
์์.