Golang+docker+postgresなWebAPI あれこれ Part1
はじめに
Golangって何?グーラン?
開発元がGoogleなプログラミング言語=Go(ogle)言語(language)=Golangです。C言語並の高速動作、メモリセーフ、タイプセーフな言語であり人気言語の一つです。
ただ、Python等でオブジェクト指向のコーディングに慣れている方には驚きでしょうがクラスという概念がありません。
Goコマンドを通す
まずは開発環境を整えます。
brew install go
お決まりですが、正常にインストールされたかはversionで確認しましょう。
go version
> go version go1.17.6 darwin/arm64
プロジェクト作成
次にモジュールモードでプロジェクトを作ります。なぜモジュールモードかというと、ただの気分です。 以下のコマンドを叩きます。
go mod init go-server
モジュール名を「go-server」としました。今回は公開しないおもちゃですので、「example.com/go-server」のように記述しません。
これでrootにgo.modが出現したと思います。
エントリポイントの作成と動作確認
エントリポイントとなるmain.goを次のように配置します。
.
├── cmd
│ └── main.go
├── go.mod
なせcmdの下に入れたかというと、Goでのプロジェクト構成のテンプレートに沿っているだけです。構成は以下をご覧下さい。
https://github.com/golang-standards/project-layout/blob/master/README_ja.md
main.goは適当に以下のように書いておきます。
package main
import (
"net/http"
"fmt"
)
func main() {
http.HandleFunc("/a", handler)
http.ListenAndServe(":8181", nil)
}
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "hoge")
}
そして以下のコマンドでサーバーが起動し、リクエストを投げてみます。
go run cmd/main.go
curl localhost:8181/a
> hoge
開発環境のコンテナ化
サーバーがListenしていることが確認できたので、そろそろコンテナ化してやりましょう。
以下のようにDockerfileとdocker-composeを記述し、配置します。DBはpostgresを使います。postgresを選択する理由は こちらをどうぞ。(https://note.com/miso_hijiki/n/nd52629a6e977)
# プロジェクトの構成
.
├── build
│ └── Dockerfile
├── cmd
│ └── main.go
├── docker-compose.yml
├── go.mod
├── go.sum
Dockerfile
FROM golang:1.15.2-alpine
RUN apk update && apk add git
RUN mkdir /go/src/app
WORKDIR /go/src/app
ADD . /go/src/app
EXPOSE 8181
docker-compose.yml
version: "3"
services:
database:
image: postgres:14.2-alpine
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
PGPASSWORD: postgres
POSTGRES_DB: database
TZ: "Asia/Tokyo"
ports:
- 5432:5432
go-server:
build: ./build
tty: true
volumes:
- .:/go/src/app
ports:
- "8181:8181"
working_dir: /go/src/app
command: "go run cmd/main.go"
そしてビルドし、コンテナを立ち上げたのちにcurlで動作確認します。
docker-compose build
docker-compose up -d
curl localhost:8181/a
> hoge
これで開発環境は大体揃いました。
gormを使ってDB接続
今回はGoコンテナを作るところまでにして、API作成に向けてDBの読み書きをこれからやっていきます。
GolangでDBに接続する場合、(探せばいくらでもありますが)大きく二通りぐらいかなと思っています。それは「ORMを使う」か、「ORMを使わないか」です。
GoのORMといえば「gorm」が挙げられます。普段はSQLAlchemyを使っている自分としてやっぱりマッパーを使える環境にしたいので前者を選択しました。
次回はgormを使ってpostgresコンテナーにPOSTできるエンドポイントを作成する所までまとめます。