New Go Microservice Scaffold
Create a new microservice $ARGUMENTS[0] following the Kensan backend conventions.
Prerequisites
Read backend/ARCHITECTURE.md and an existing service (e.g., backend/services/memo/) for reference.
Steps
- •Create directory structure:
backend/services/$0/ ├── cmd/main.go ├── internal/ │ ├── model.go │ ├── handler/handler.go │ ├── service/service.go │ ├── service/interface.go │ ├── service/service_test.go │ └── repository/ │ ├── interface.go │ └── repository.go ├── Dockerfile └── Makefile
- •
cmd/main.go: Use
bootstrap.New("$0")for initialization. Register routes withsvc.RegisterRoutes()andsvc.RegisterPublicRoutes()as needed. - •
internal/model.go: Define domain types and DTOs. All entities must have
ID,UserID,CreatedAt,UpdatedAt. - •
internal/repository/interface.go: Define repository interface following ISP (split by entity if multiple).
- •
internal/repository/repository.go: PostgreSQL implementation using pgx. All queries must include
WHERE user_id = $1. Usepgx.ErrNoRows→errors.NotFound(). - •
internal/service/interface.go: Define service interface (Reader + Writer pattern).
- •
internal/service/service.go: Business logic. Use
shared/errorsfor domain errors. Acceptctx context.ContextanduserID stringas first parameters. - •
internal/service/service_test.go: Table-driven tests with mock repository.
- •
internal/handler/handler.go: HTTP handlers. Use
middleware.GetUserID(r.Context()),middleware.JSON(),middleware.Error(). Follow the error mapping pattern. - •
Dockerfile: Copy from existing service, update binary name.
- •
Makefile: Copy from existing service, update service name.
- •
Database migration: If needed, create
backend/migrations/NNN_create_$0_tables.sqlwithuser_id, UUID PKs, timestamps, and update trigger. - •
docker-compose.yml: Add service entry with appropriate port.
After Scaffold
- •Run
cd backend && make testto verify compilation - •Update
backend/ARCHITECTURE.mdservice list