### 職種・役割・担当工程・チーム規模
- 職種: バックエンドエンジニア / CI・CDエンジニア / (フロントエンドエンジニア)
- 役割: メンバー/ (テックリード)
- 担当工程: 設計 / 開発環境整備 / 実装 / 構築 / テスト
- チーム規模: 4〜7人・2チーム
### プロジェクト概要
会社のメインの事業である飲食店向け予約管理システムは、当初外部に委託して作られたことや稼働してから 10 年以上が経過したことなどが原因で、技術スタックもバラバラかつメンテナンス性が低く機能追加が困難となっていた。
そのためシステムのプラットフォームを再構築し、コンテナ化をベースにすることでアプリ・インフラの運用工数の削減とともに、開発生産性の向上を目的として行っている。
### 担当業務
サーバサイドの技術選定とコア実装を行い、チームを横断して展開するテックリードのようなことを行いました。大きく分けて管理者向けとユーザ向け機能があり、管理者向け機能を担当。
### 実績
- 画面設計・REST API設計【2021/10〜2022/01】
- 画面設計を行い、画面項目から必要なDBリソース・REST APIを洗い出し。
- OpenAPI(Swagger)でREST API設計。
- 開発環境整備・技術選定・コア実装・アーキテクチャ選定【2022/01〜2022/02】
- Windowsを使用している方もいるため、Docker Composeによるコンテナベースの開発環境構築。
- サーバサイドのフレームワーク・ライブラリ・アーキテクチャ選定。
- サーバサイドのコア実装を行いチームに横展開し、Rest API実装を進める。
- CI/CDをGitHub Actionsで整備。
- 自動テストの設定(UT)。
- OpenAPIの自動フォーマット。
- GoのMockファイル生成。
- コンテナをビルドしAWS Fargateにデプロイするパイプライン作成。
- < 使用技術等 >
- gomock / golangci-lint / pq / PostgreSQL / Docker Compose / Docker / OpenAPI / ECR / Fargate / Cognito / GitHub Actions / Vue3 / Nuxt3 / TypeScript / Node.js
- Go
- 社内の標準言語となっているおりノウハウがある程度あるため。
- sqlx
- 複雑なSQLを書くことが多いためORマッパーは検討していなかった。database/sqlの薄いラッパーであり、構造体にバインドする機能が便利なため使用。
- echo
- 既存のGo製REST APIではDSLからOpenAPIとhandlerを生成してくれるGoaを採用していたが、ドキュメント不足により内部実装をみることが多いことや精通している方が少ないため薄いフレームワークであるechoを採用。
- レイヤードアーキテクチャ
- 既存システムではhandler(controller)に処理を全て書いておりメンテナンス性や実装の統一感に問題があった。そのため、レイヤー毎に実装ルールを定義しロジックも分割することで既存の問題に対処した。また、これまでは結合テストのみだったが、レイヤーを分けたことで単体テストと結合テストをそれぞれ分けて実装できるようになった。
- DDD
- 項目毎にロジックをもっていたとしても既存システムはフロントやサーバ、SQL内部など統一感なく実装されおり、ロジックの影響範囲調査が非常に困難であった。厳密なDDDではないが、すべてのシステムから共通で使うライブラリとして項目毎にValue Objectのようなものを作成することで、全ての実装者はそのライブラリだけ見ればロジックがわかるようになった。
- 管理者向けシステムの機能実装【2022/02〜2022/10】
- サーバとフロントの実装・テスト。
- 外注の方への技術指導・レビュー。
- 予約検索結果エクスポートバッチの技術選定・設計・実装【(2022/10〜2023/01】
- REST APIへのリクエストをトリガーとしてAWS Batch起動する構成。
- 巨大なデータのためバッチのメモリを枯渇させないようにストリーム形式でCSV, Excel帳票, PDF帳票をS3へアップロード。
- Goのioパッケージについて理解が深まった。
- ついでにファイルアップロードのコア実装としてチーム内に横展開。
- 新しく入ったメンバーのメンターをしながらタスクを分解し割り振り。
- < 使用技術等 >
- Go, gocsv, ECR, Fargate, ECR, GitHub Actions, Docker
- pgx
- pqが機能追加はとまりメンテナンスのみしか行われていないためpgxのノウハウを得るため。
- scany
- 社内で採用実績のあるsqlxと似た使い方できるかつ、pgxのドライバ以外の機能に対応しているため。また、sqlxのメンテナンスが積極的に行われていないのも理由。
- AWS Batch
- バッチの処理が15分以上かかる場合もあるためLambdaではタイムアウトしまうため。
- S3
- CSV, Excel帳票, PDF帳票を配置し、ダウンロード用の期間の短い署名付きURLを発行するため。
- SES
- 帳票が作成できたことをダウンロード用URLとともにメール通知するため。また、バッチが予期しない理由で失敗した場合にもメール通知する。