# 役割
- サーバーサイド・インフラ担当
# 私がしたことを時系列で記載
## 設計
- フロントエンド担当と話し合い機能要件を洗い出し
- 機能要件を元にER図の作成
- 技術選定(Next.js, Nest.js, Docker, TypeORM, MySQL, AWS(EC2, RDS, Cognito, SES, など))
## 技術調査
- Nest.jsでのREST ful APIの構築は初めてだったため、Nest.jsとTypeORMの学習を始める
- 管理画面とユーザー側のアプリケーションでDB共有が必要なためDockerを使ってローカル環境での別アプリケーションから同じDBにアクセスする環境構築方法を調べる
- その他は実装しながら調べつつ進めていく
## 実装
- 開発者は2人、フロント担当とサーバーサイド担当のみ。
- 開発期間は6月から10月末までの5ヶ月間。
- フロントをNext.js、サーバーサイドをNest.js、SPAを11月にリリース。
- AWSのEC2へデプロイ
# 私が出したバリュー
## 技術
- 基本設計
- ER図
- 要件定義
- 機能要件
- 開発環境構築
- OpenAPIの構築
- PlantUMLを用いたER図の共有
- Dockerを使い2アプリ間でDBを共有できるローカル開発環境を構築
- githubを用いてバージョン管理とタスクをissueで管理
- テスト環境構築
- AWS EC2でユーザー側アプリケーションと管理画面側アプリケーションのテスト環境を構築
- 静的ファイルをS3に保存し、Clowd FrontをCDNとして経由して取得
- RDSでDBを構築。2つのアプリケーションでDBを共有
- pm2を使ってフロントとバックのサーバーを永続化
- 本番環境
- ユーザー側のアプリケーションはEC2のCPU使用率に応じてカスタムAMIを作ってオートスケールするように調整
- フロント
- metaタグを編集し、URLのthumbnail、twitter用カード、facebook用カードの表示を調整
- サーバーサイドから受け取ったエラーメッセージを使ったエラーハンドリングの調整
- Googleタグマネージャーの埋め込み
- パスワードの表示非表示ボタンと削除ボタンの実装
- バックエンド
- 機能ごとモジュールに分けAPIを作成
- モジュールごとのリクエストボディとなるDTOを作成し、バリデーションを実装
- DBのリレーションの構築
- HTTPリクエストが大きくなることを想定し、バッチ処理を実装
- Stripe決済を実装
- DBを更新する部分や、Auth部分のロギングを実装
- DBを更新するメソッドはトランザクションで管理し、エラーハンドリングを行い、エラーの場合はロールバックされるように調整
- 郵送業者用のCSVに適合した内容のCSV出力機能を実装
- AWS Cognitoを用いた認証周り全般を実装
- AWS Lambdaを用いて認証メールをカスタマイズ
- AWS SESを用いた一斉メール送信APIを実装
## 技術ではないところ
- プロダクトオーナー、マーケティング担当、フロントエンド担当、のコミュニケーションのハブとなり、意見やアイデア、または不満がある場合にMTGを企画し、情報共有に努めていた。
- 時間外も業務に関わる知識のインプットの時間に使う姿勢
- 元お笑い芸人の特性を活かした楽しいコミュニケーション
# 開発における課題と解決策と成果
## 未経験の言語での開発と実装
- Nest.jsとTypeORMでサーバーサイドのAPIを実装した経験がなかったことと、ドキュメントがどちらも英語しかなかったため学習の時間が不十分なまま開発がスタートしてしまった。
- 課題の解決に多いに活躍したものはGitHub Copilotでした。コメントアウトで何を実装したいかを書き、最初の部分のコードを書くことでメソッドの候補が出ることでそれをテストし、開発スピードの向上と学習の両方が得られました。
## フロントとのAPIエンドポイントの共有
- OpenAPI(Swagger Editor)を用いることでエラーハンドリングの内容も含めて共有できた。これによりフロント側の問題なのかサーバーサイド側の問題なのかの切り分けができた。
## ローカル環境での2アプリ間でのDB共有
- 1つのアプリケーションではサーバーはローカルで立ち上げ、もう一つのアプリケーションではバックエンドサーバーをDockerで立ち上げることで、2つのアプリケーションをDocker Networkで繋ぎ、Dockerで起動しているMySQLの一つのDBを共有して使うことができた
# 私のセールスポイント
- これからもっと成長できると思っています!
- 一昨年の10月からプログラミング学習を始め、新しい知識を手に入れることが楽しくて寝食を忘れて勉強しております!
- コミュニケーション能力は高いほうなので、実装以外のところでも開発に貢献できると思っています。