point-app-backend
ハッカソン2022で作成するポイントアプリのバックエンドプロジェクト
開発手順
# 環境手順
$ git clone https://github.com/hack-31/point-app-backend.git
$ cd ./point-app-backend
# JWTに必要なキー生成
$ make create-key
# ビルド、コンテナ起動
$ make build-up
# コンテナの中に入る
$ make in
# マイグレーション適用
$ make migrate
$ make seed
# コンテナを抜ける
$ exit
# サーバーログ
$ make log
# 2回目位以降
$ make up
$ make log
詳しくは、makeコマンドを実行
サーバー起動したら、ホスト側で以下のURLでアクセス可能
ソースコードを書く際、vscodeを利用しているユーザは、Dev containerを利用して開発することを推奨する。
コンテナ内のファイルを直接修正でき、Goの拡張機能により型補完や保存時フォーマットが使えるようになる。
dev containerでの開発方法
- vscodeにDev containerを導入
- cmd+shift+pを押し、
>open folder in container
を押し、このプロジェクトを選択
- 右下の通知に表示されるGo拡張機能に必要なモジュールをインストールボタンを押し、インストールする
- vscode内のターミナルで
$ air
でサーバー起動
今回、ホットリロードを利用しているため、保存のたびにサーバーを再起動する必要はない。
フォーマッター、リンター
コンテナ内で以下のコマンドを実行
# フォーマッター
$ make format
# リンター(フォーマッターを事前)
$ make lint
テスト
テストを実行するのみであれば以下のコマンドで行う
$ maek test
より詳細なテストのカバレッジを表示したい場合は以下のコマンドを実行
# ブラウザで表示(ホスト側)
$ make wc
DB
開発用データベース情報
項目 |
値 |
データベース種類 |
MySQL |
サーバ |
db |
ユーザ名 |
admin |
パスワード |
password |
データベース |
point_app |
マイグレーション
$ make dry-migrate
でDDLを確認して、$ make migrate
でマイグレーションする流れとなる
# マイグレーションする際に発光されるDDLを確認(実行はされない)
$ make dry-migrate
# マイグレーション適用
$ maae migrate
初期データ挿入
./_tool/mysql/seed.sql
に初期データを挿入するコマンドを記述
AWS cloud9のpoint-app-devで以下のコマンドで挿入
$ make seed
DIツール
DIを行う際には、google/wireというDIツールを使用します。新しいルーティングを追加したり、既存のルーティングのIFが変更された場合は、それに合わせて更新する必要があります。以下のコマンドで更新できます。
# api
$ make wire
# batch
$ make wire-b
router/wire.go
は定義元のファイルであり、router/wire_gen.go
は生成されたファイルです。実際の利用では、router/wire_gen.go
が使用されます。
各ディレクトリの説明
詳しい説明は、各ディレクトリのREADME.mdに些細されているものもあります。
/auth
- JWT認証におけるトークン作成や検証を行う処理が書かれたパッケージ
/router
/docs
- ドキュメントが配置
- swaggerなどを修正する際は
/docs/openapi.yml
で行う
/cmd
- コマンド
- main関数があるエントリーファイルの置き場
/handler
- ハンドラー層
- クライアントのデータをバリデーション
- クライアントにデータを返す
/service
- サービス層
- ドメイン層、リポジトリ層を利用してユースケースを実現する
/domain
- ドメイン層
- サービス間(ユースケース間)をまたがるロジックを記述
/repository
- リポジトリ層
- DBやキャッシュサーバーにアクセスする
/myerror
/_tools
- 各ツールを利用するためのディレクトリ
/_tools/mysql/schema.sql
にテーブル作成のためのDDL定義
/config
/constant
/utils
バッチ
# バッチアプリの作成
$ make batch
success! try batch command!
# batchの実行
$ batch
NAME:
batch - point app batch processing
USAGE:
batch [global options] command [command options]
COMMANDS:
reset_sendable_point, rsp Reset sendable point
help, h Shows a list of commands or help for one command
モック
以下の方法で実行。
$ make mock
各インターフェース定義書があるディレクトリに/_mock
があり、mock_*.go
というファイルが作成される。
そのファイルがモックファイルになる。
以下の方法は古いため、mockgenを利用した方法に書き換える。
以下のコマンドでモックを作成する
$ make moq
各層でモックを作成する。
モックを追加する際は、./Makefile
のgo moq
に記載されたmoq
コマンドのオプションにIF名を追加する
$ moq -out ./handler/moq_test.go ./handler RegisterUserService [ここにIF名を追加する]
今後モックファイルを追加する際は*_moq_test.go
と命名にすること
デプロイ
GitHub Action, Codepipelineによる自動デプロイになります。mainブランチにマージされると自動でデプロイされます。
GitHub Actionでは、Docker Imageを作成、ECRに登録を行い、Codepipelineでは、ECRからImageを取得し、ECSにデプロイします。
手動デプロイ方法
AWS cloud9のpoint-app-devにて以下のコマンド実行
$ pwd
/home/ec2-user/environment/point-app-backend
# 値の設定
$ AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text)
$ IMAGE_TAG=$(git rev-parse HEAD)
$ ECR_REGISTRY=${AWS_ACCOUNT_ID}.dkr.ecr.ap-northeast-1.amazonaws.com
# ビルド
$ docker image build \
-t ${ECR_REGISTRY}/point-app-backend:latest \
-t ${ECR_REGISTRY}/point-app-backend:${IMAGE_TAG} \
--target deploy ./ --no-cache
# ECRログイン
$ aws ecr --region ap-northeast-1 get-login-password | docker login --username AWS --password-stdin ${ECR_REGISTRY}/point-app-backend
# ECR push
$ docker image push -a ${ECR_REGISTRY}/point-app-backend
makeコマンドを利用する場合は、以下の2つでデプロイ可能
$ make build
$ make push
ECRにデプロイされると、latestタグの更新がトリガーとなり、codepipelineによってECSにデプロイが走ります。