🔰

GoでWebAPI(CRUD)を作ってみたメモ

に公開

はじめに

すごい昔から作ってるものを供養したい。2年前くらいから少しづつ少しづつ作ってきたおもちゃです。野良Gopherの戯言ですので温かい目で見てください。

対象読者

  • 初心者Gopherを見たい方
  • 初心者Gopherになりたい方で何をしたら良いのかわからない方

リポジトリ

https://github.com/You-saku/go-web-tutorial

なぜgoを触ってるのか?

  • 実務で触れない言語を触りたかったから
  • あえて他言語を選ぶことで自分の応用力を測りたかったから

昔は生成AIなんてなかったので探り探りで作っていました。めちゃくちゃ難しかったですが、楽しかったです。今は生成AIがあるので昔ほど手こずらなくなりました。しかしその反面できちんと一次情報を押さえておく必要が出てきました。公式Docはいつだって重要です。

今どこまで作れてるのか

  • Docker環境で動く(VSCodeでDev Containersもできる)
  • WebAPIを作成(CRUD)
  • Interfaceを利用してMockできる
  • テストコードの土台
├── README.md
├── database
│   ├── migrations
│   │   ├── create-todos-table.sql
│   │   └── create-users-table.sql
│   └── seed
│       └── insert-user.sql
├── docker
│   ├── db
│   │   └── init.sql
│   └── go
│       └── Dockerfile
├── docker-compose.yml
├── openapi
│   └── swagger.yml
└── web
    ├── adapters
    │   └── controllers
    │       ├── UserController.go
    │       └── UsersController.go
    ├── entities
    │   ├── models
    │   │   └── User.go
    │   └── repositories
    │       └── user
    │           ├── IUserRepository.go
    │           ├── MockUserRepository.go
    │           └── UserRepository.go
    ├── go.mod
    ├── go.sum
    ├── infrastructure
    │   └── db.go
    ├── main.go
    └── usecases
        └── UserUsecase.go

ここまで来るのにやったこと

  • Goのチュートリアル
  • ライブラリ(Gin, Echo)を使ってWebサーバーを立ててみる
  • "Hello World." を返す単純なWebAPIをAWS ECSで公開する

Webサーバーを立てたかったのでEchoを利用しました。昔Ginというのを使ってCRUDを構築したこともあります。やはりある程度チュートリアルを終えたら実際に動くものを作るのが良いです。

意識したこと

  • 「ただ動く」だけでなくテストコードを書くことも意識する
  • 自分の知ってることをできるだけGoで実装する
  • 極力標準ライブラリだけを使用する

極力標準ライブラリだけを使用する

これが容易にできるのがGoの良さだなと思います。Goを触り始めた初期はとにかく動くものを作りたくてライブラリやフレームワークを調べて脳死で使ってました。
しかし、標準ライブラリに目を向けると「標準ライブラリである程度はできるんじゃないか?」と思えてきます。せっかくなら自分の手で作っていった方が応用が効くし、自分の本当の理解度も調べられるのではないかと考えました。

まだわからないこと

わからないことはたくさんあります。特にわからない部分を抜粋します。

ライブラリ,フレームワークを使うなら何を使うのか

Goは覇権と言われるフレームワークがない印象です。ライブラリやフレームワークを組み合わせて作っていく感じがします。自分で選んでいくことは楽しいのですが正直「今はどのライブラリを使うのがトレンドなんだろう?」と思います。

流行をどうやってキャッチするのかも含めライブラリ選定について調査したい。

ディレクトリ構成のあるべき姿

https://github.com/golang-standards/project-layout

こういったリポジトリが存在しますが、非公式のものです。OSSのプロジェクト構成も参考にしようと読んでみましたが種類が多く確固たる結論はでませんでした。

今は下記記事の考え方を参考にディレクトリを少しづつ変えていくようにしています。この記事は個人的にオススメです。
https://zenn.dev/foxtail88/articles/824c5e8e0c6d82

「最近はこんなのがあるよ!」というご意見あれば教えてください。

これからやりたいこと

「これは実務でやるよな」というのを試していきたい。

linterとか開発を補助するツールの調査

今はAir,goplsは知ってます。

https://github.com/air-verse/air
https://github.com/golang/tools/tree/master/gopls

他にも開発効率を高める引き出しを増やしたい。

また、以前sqlcを使ったこともあります。自動でコードを生成してくれる系のツールをもっと使いたいと思います。
https://github.com/sqlc-dev/sqlc

もっといろんなライブラリを触ってみたい

Goは本当にいろんなものがあります。標準ライブラリを深掘ることはもちろんもっとGitHubのOSSを読んでいこうと思います。

テストコード実装

DIっぽいものを構築したのでUnitテストを書いてみます。httpテストもできるらしいので書いてみたいです。テストを書くことで自分の設計が改善されることを期待します。

テストに関してはこちらの記事を読んでいます。
https://qiita.com/taizo/items/82930518430f940721a0
https://future-architect.github.io/articles/20250509a

CI構築

テストが書けたら着手します。GitHub Actionsをあまり使ったことがないので使ってみたいという考えもあります。

外部公開してみる

過去にAWS ECSでGoのプロジェクトを公開しました。しかしその時はDB接続はしていませんし、環境子変数もない状態です。これでは実務向けではないのでAWSでなくても良いのでDB接続やテストコードを含んだGoプロジェクトをデプロイし公開したい。

おわりに

実務でGoを触らない人がGoを楽しむ参考になれば幸いです。仕事で触るかどうかは別として今後もGoのコーディングを楽しんでいきます(もし仕事でGoが触れたら嬉しい)。

参考文献

学習に使ったものを一部紹介。DI周りは難しかったです。
Go言語を触って感じたことはまた別でまとめようと思います。

https://go-tour-jp.appspot.com/list
http://go.shibu.jp/effective_go.html
https://qiita.com/yoshinori_hisakawa/items/a944115eb77ed9247794
https://qiita.com/rtok/items/46eadbf7b0b7a1b0eb08

Discussion