Clean Architecture Golang App
... 1) make your database ... 2)
go run main.go
-
... define two infrastructure objects: Logger e SQLHandler infrastructure.looger.go ---> interfaces.logger.go infrastructure.sqlHandler.go ---> interfaces.sqlHandler.go
-
... in main.go ... get two infrastructure objects infrastructure.NewLogger() --> (interfaces.Logger) <-- Logger struct infrastructure.NewSQLHandler() --> (interfaces.SQLHandler) <-- SQLHandler struct
-
... use Load function (defined in env.go) to set Logger with environment vars
-
... In router.go, we call infrastructure.Dispatch(logger, sqlHandler) a) to create a controller for each entity in my app domain b) to define routes c) every route receive a controller required to operate d) start app in a given port, see env.go and *.env
UserController --- has a --- usecases.UserInteractor UserController --- has a --- interface.Logger
-
... programming to interface: usecases.UserInteractor - has a - usecases.UserInteractor usecases.UserInteractor ---> ( interface.UserRepository ) <--- usecases.UserRepository (tip) you can change database vendor by rewriting user_repository.go (usecases)
usecases.PostInteractor - has a - usecases.PostInteractor usecases.PostInteractor ---> ( interface.UserRepository ) <--- usecases.PostRepository (tip) you can change database vendor by rewriting post_repository.go (usecases)
A web application boilerplate built with go and clean architecture. Most of this application built by standard libray.
app
├── database
│ ├── postgres-script
│ │ └── scritps.sql
├── domain
│ ├── post.go
│ └── user.go
├── infrastructure
│ ├── env.go
│ ├── logger.go
│ ├── router.go
│ └── sqlhandler.go
├── interfaces
│ ├── logger.go
│ ├── post_repository.go
│ ├── sqlhandler.go
│ └── user_repository.go
├── log
│ ├── access.log
│ └── error.log
├── main.go
└── usecases
├── post_controller.go
├── post_interactor.go
├── post_repository.go
├── user_controller.go
├── user_interactor.go
└── user_repository.go
7 directories, 22 files
Layer | Directory |
---|---|
Frameworks & Drivers | infrastructure |
Interface | interfaces |
Usecases | usecases |
Entities | domain |
ENDPOINT | HTTP Method | Parameters |
---|---|---|
/users | GET | |
/user | GET | ?id=[int] |
/posts | GET | |
/post | POST | |
/post | DELETE | ?id=[int] |
Controller Method | HTTP Method | Description |
---|---|---|
Index | GET | Display a listing of the resource |
Store | POST | Store a newly created resource in storage |
Show | GET | Display the specified resource |
Update | PUT/PATCH | Update the specified resource in storage |
Destroy | DELETE | Remove the specified resource from storage |
Repository Method | Description |
---|---|
FindByXX | Returns the entity identified by the given XX |
FindAll | Returns all entities |
Save | Saves the given entity |
SaveByXX | Saves the given entity identified by the given XX |
DeleteByXX | Deletes the entity identified by the given XX |
Count | Returns the number of entities |
ExistsBy | Indicates whether an entity with the given ID exists |
cf. Spring Data JPA - Reference Documentation
I have no tests because of my laziness, but I will prepare tests in future commits.
- github - manuelkiessling/go-cleanarchitecture
- github - rymccue/golang-standard-lib-rest-api
- github - hirotakan/go-cleanarchitecture-sample
- Recruit Technologies - Go言語とDependency Injection
- Clean ArchitectureでAPI Serverを構築してみる
- github - ponzu-cms/ponzu
- クリーンアーキテクチャの書籍を読んだのでAPIサーバを実装してみた
- Go × Clean Architectureのサンプル実装
- Uncle Bob – Payroll Case Study (A full implementation)