# プロジェクト概要
- 社内システム
- ローカル管理しているExcelやスプレッドシートのシステム化
- DB管理
- 各テーブルに対するCRUD機能
- CSVによるUL、DL機能
- 検索、ソート機能
- 入力値制限
- 権限管理
# チーム情報
- 新規立ち上げメンバーとして参画
- スクラム(アジャイル)チーム
- 若手中心メンバー
- プロパー3名、派遣社員2名
# 主な担当業務
- スクラムマスター
- バックエンドリーダー
- フロントエンド開発
- 他部署調整
# 担当フェーズ
### メンバーの一員として担当経験あり
- 技術選定
- 基本設計
- システム立ち上げ時のDB設計
### 独力で担当経験あり
- 追加機能要件定義
- 追加機能DB設計
- 新規API詳細設計
- API仕様書新規作成、改修
- 新規API実装
- 既存API改修
- JUnitテスト作成、改修
- テーブル作成、改修
- テーブル定義書等ドキュメント作成
- 内結試験書作成、レビュー、実施
- 外結試験書作成、レビュー、実施
- 既存画面改修
- 画面設計書改修
- コードレビュー(バック、フロント両方)
# 開発・新規登録API作成
### 概要
システムの基本機能である新規登録機能を0から作成
システム設計〜単体テストの作成
### どのような機能の開発・実装か
フロントから受け取った各カラムとその登録値がセットになったjsonリクエストを元に、
各カラムに対するデータ型、文字数、入力必須などの制限を満たすかチェックし、DBに登録し成功メッセージを返す
各種チェックで失敗した際にはエラーメッセージを返すとともにログを出力する
### 課題・問題点
各カラムに対してチェックする内容が多く、テスト漏れが心配された
### 打ち手・使用した技術
JUnitを用いた単体テストを作成
作成完了後カバレッジを取得し、想定外エラー箇所を除く部分のカバレッジが100%になるまでテスト追加
# 開発・データ量増加によるメモリエラー対策
### 概要
データ量増加により、重複チェックでメモリエラーが発生
原因特定、内部構成の再検討から実装、テストまでを独力で実施
### どのような機能の開発・実装か
新規登録/更新リクエストとして最大100カラム×10万レコードのデータを受け取る(csvアップロード)
そのうち重複不可指定されているカラムに対して、まずはリクエスト内で重複をしていないかのチェックを行い、重複がなければDB既存値とリクエスト値が重複していないかのチェックを行う
DBのレコード最大登録数は40万件であるため、30万×10万のチェックを重複不可指定カラム数分実行されることが想定された
DBレコード登録数が増えるにつれ大量のチェックとなるため、メモリエラーが発生し、その解消が求められた
### 課題・問題点
当初の設計では受け取ったリクエストはカラム名と指定値のマップがレコード毎に1要素となったリストとして保持していた
リクエスト内重複チェックを行う際には対象カラムの値だけを抜き取り一つのリストとし、リスト内重複値を取得
DB重複チェックを行う際には対象カラムの値だけを抜き取ったリストをfor文で回し、各レコードの値が
DBに存在しないかSQLで存在チェック
もし重複があれば重複した値がリストの何番目にあるかを求め、その値からアップロードされたCSVの何行目の値であるかも添えてエラーメッセージを返却
特にDB重複チェックでは総当たり検索を大量に行うことがメモリ圧迫や実行長時間化につながった
### 打ち手・使用した技術
リクエストをマップリストではなく、一時テーブルで保持するよう内部構成を根本から変更
また、一時テーブルにはカラムに対する値だけでなくCSV行数も一カラムとして追加することでエラーメッセージ作成の負荷も軽減
各種チェックを一時テーブルに対するSQL指定で行うことでメモリ削減
リクエスト内重複チェックはGROUP BY, HAVING, COUNTを用いて対象レコードを絞り込み該当する
レコードのCSV行数カラム値を取得
DB重複チェックはテーブル同士を内部結合した上でリクエスト内重複チェックと同様の処理を実施
# スクラムマスターとしての経験
- 引き継ぎ直後はスクラムに対する知識を前任者が残してくださった資料を元に勉強
- 基本イベントのファシリテーターを担当
### 工夫した点 - 稼働時間の見積り方を見直し
引き継いだ当時は稼働時間の見積もりを定時時間内で行っていたが、実際の稼働時間には残業時間も含まれるためプランニング時のタスクよりを超えるタスクがスプリント内で完了していた
全体の進捗として単純に残業をしないことで見積もりを正しいとすることはできないタイミングであったため、見積もり時間に残業時間も加えることで見積もり制度の向上を図った
# バックエンドリーダーとしての経験
- フロントのみを担当していたメンバーや新卒メンバー向けに、考えていることを全て声に出して説明しながらの実装実演
- 新卒メンバーとのペアプロを通じたコーディング指導
- マージリクエストの最終承認(コードレビュー自体はメンバー全員が行う)
### 工夫した点 - SQL作成の自動化
システムの特徴上、他部署から依頼されたテーブルをDB上に作成することが多くあった
その際には依頼されたテーブル自体だけでなく、システムで管理しているマスタテーブルにも各情報を追加する必要があり、多くのSQLを作成する必要があった
当初は依頼時に提出していただく申請書を見ながら手で作成していたが、データ投入のミスが何度かあった
そこで、申請書(スプレッドシート)から自動的にSQLを作成できるよう、申請書自体の改修とGASによるAPIを作成し、手入力をほぼ無くすことに成功した
入力ミスが減っただけでなく、SQL作成工数も大きく削減した