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できるエンドポイントを作成する所までまとめます。