みなさん、こんにちは!プロダクト開発部 ユーザープラットフォームGの吉川です。
現在、JMDCが保有している医療ビッグデータを活用して生活者や医療に新しい価値を提供する新規プロダクト開発チームのバックエンドを担当しております。今回は新規プロダクト開発のバックエンドで採用している技術や設計について紹介させていただきます。
Go
ユーザープラットフォーム開発部の新規プロダクト開発チームは Go を採用しています。採用した理由は色々ありますが、主に以下の点から新規プロダクト開発でもGoを採用することにしました。
- 静的型付け言語である
- APIを作りやすい
- シンプルなコードを書ける
- メンバーのGoでの開発に対するモチベーションが高い
また、昨年に若手の Go 未経験のエンジニアが入社したので Go をスムーズにキャッチアップできるようにオンボーディング資料を作成しました。
主に使用しているライブラリは以下の通りです。
- 99designs/gqlgen:GraphQLアプリのコードベース構築ライブラリ
- kyleconroy/sqlc:SQLから生成するORマッパー
- golang-migrate/migrate:DB マイグレーションライブラリ
- stretchr/testify:テストライブラリ
- Mock 定義のみ使用しています
- onsi/ginkgo:テストライブラリ
- BDD でテストコードを書くために ginkgo を採用しました
GraphQL
新規プロダクトチームとして初めてのプロダクト開発をする時に REST API か GraphQL のどちらで開発するかフロントエンドチームと話し合っていました。
両方のメリット・デメリットを話し合い、「1回のクエリで様々な情報を取得できる」「フロントエンドの変更に伴うサーバーサイドの変更の影響が少ない」など GraphQL の方がメリットがあると思い、 GraphQL を採用する方向で進めました。しかし、知見がないためすでに導入済みのチームに相談して知見を共有していただきました。(その時の議事録を一部公開)
Go で開発する際には、スキーマからコードを生成するスキーマ駆動開発ができる 99designs/gqlgen を採用しています。詳しい話は別の機会に紹介しようと思います。
DDD
サーバーサイドのアーキテクチャはクリーンアーキテクチャを採用しました。
クリーンアーキテクチャは「関心ごとを分離できる」や「分離したレイヤーの依存関係を単純化できる」といった設計ができ、プロダクトのスケールアップによる変更に強くできると考えました。
また、 DDD やクリーンアーキテクチャの理解度向上のために、部内で輪読会を実施しています。
その他
その他、採用している技術について簡単に紹介させていただきます。
インフラ構成
クラウドは AWS を採用しています。主に利用しているサービスは以下の通りです。
- ECS(Fargate)
- ALB
- CloudFront
- EC2(踏み台)
- S3
- RDS(Aurora PostgreSQL)
- System Manager
また、Terraform を使って IaC 化をすることでインフラ構成に関してスムーズに理解できる状態になっています。
CI/CD
CI/CD は GitHub Actions で構築しています。 PR を作成した時にユニットテストとTerraformのテストが走るようにしたり、 アプリのデプロイや terraform apply ができるようになっています。
まとめ
今回は採用している技術や設計について紹介させていただきました。日々開発していく中で学ぶことが多く、チーム内で輪読会やディスカッションをしてチームのスキルの底上げに取り組んでいます。
「良かったポイント/大変ポイント」や「こんな実装をしてみた」など実装よりの話をまた別の機会で紹介させていただきます。
最後まで読んでいただき、ありがとうございました!