オブジェクト指向の概念は取り入れているものの、オブジェクト指向に限定されるアーキテクチャではない。
システムを以下のような層に分けて、依存関係を明確にし、変更に強いシステムを設計する方法
-
中心(エンティティ層) ビジネスルールを明確にし、アプリケーションに依存しない
-
ユースケース層 アプリケーション固有のビジネスロジックを定義
-
インターフェースアダプタ層 外部システム(データベース、API)ブリッジ
-
フレームワーク層 フレームワーク、外部ライブラリを使った具体的な実装
依存逆転の原則(DIP:Dependency Inversion Principle)を実現することが目的
- カプセル化
- 継承
- ポリモーフィズム:同じインターフェースを持つ異なる実装を切り替える仕組み
go mod = Go Modules の省略であり、依存関係管理システムのこと
go mod init
- モジュール名
- Golang のバージョン
- 依存関係
go mod tidy
web
、app
2 つのコンテナを起動:docker up -d
※コンテナは裏側で動いてるため、ターミナルでは動いて見えない
※-d
がなくても dockerDesktop を開いていれば、立ち上がるが、ターミナルを一つ使うことになる。
コンテナ一覧:docker ps
type UserResponse struct {
ID uint `json:"id" gorm:"primaryKey"`
Email string `json: "email" gorm:"unique"`
// 文字列がズレる。インデントチェックした方が良いかも
}
GO_ENV
の値がdev
だったら load 関数が走り、ローカルで持ってる.env
を見に行ってる。
func NewDB() *gorm.DB {
// ここにDBの初期化処理を書く
// 環境変数を読み込むための処理
if os.Getenv("GO_ENV") == "dev" {
err := godotenv.Load() // .envファイルを読み込む
if err != nil {
log.Fatal(err)
}
}
}
docker も立ち上げてないと動かないからね。
go run migrate/migrate.go
したら、
pgAdmin で生成したテーブルを確認できる。
下の:=
とvar
の変数宣言はイコール
:= === var hoge string = fuga
func (レシーバー名 レシーバー型) メソッド名(引数) 戻り値型 {
// メソッドの処理
}
func (uu *userUsecase)
- docker-compose 立ち上げ
- go run migrate: 'GO_ENV=dev go run migrate/migrate.go'
- echo run 'GO_ENV=dev go run main.go'
println()
がログ出力
echo-jwt ライブラリがプロジェクトに複数入ってしまっていて、 API がどのライブラリを参照すれば良いか迷子になってしまっていた。
v5 を消して、mod
してたけど、復活しちゃってたが、動画と同じ v4.1.0 に変更したところ、req 通った。
chat gpt なかったら絶対わかんなかった。と思う
func (tr *taskRepository) DeleteTask(userId uint, taskId uint) error {
//! この書き方は、決まってる Delete(&構造体名{}) Delete(&model.Task{})
result := tr.db.Where("id=? AND user_id=?", taskId, userId {/* ← ormのtaskIdとuserIdの順番間違えてた。入れ替えたら治った*/}).Delete(&model.Task{})
if result.RowsAffected < 1 {
return fmt.Errorf("object does not exist")
}
return nil
}