# 概要
- 行政制度DBの管理システムのリプレイス
- データ更新作業の効率化のための機能開発
# 担当
- 企画, 技術選定, 設計, 開発
- (当初CTO含めエンジニア3人ほどだったためこのシステムに関する全て個人で担当)
# 課題
- 全自治体の行政制度の定期更新に人件費が多くかかっており、新機能による工数削減が求められていた。
- ダブルチェックはしていたがそれでも意図しない更新によりデータの不備が発生していた。
- フロントエンドにReact, Vueのようなフレームワーク等が使われておらず、UIを含む新機能では2000行程のコード量になることが多かった。
- ES5以前のJavascript, レガシーなライブラリ, 使われてない機能等々の要因で運用保守にも頻繁に工数がかかっていた。
- EC2を用いて常時起動でデプロイされていたため、利用頻度に対して料金が多くかかっていた。
# 取り組み
1. リプレイス
- Typescript, React Hooks, MaterialUIの導入
- jsxやhooksによる記法で以前のDOM操作のコード量が約10分の1程度に削減
- MaterialUIでの実装により統一感のある要素やData Gridなどの複雑なUIをシンプルなコードで実装
- TypescriptやES2015以降の構文に統一し、型安全かつ可読性の高いコードを実現
- バックエンドAPIのサーバーレス化
- AWSのAPIGateway, Lambdaで行政制度DB(MongoDB)に接続するAPIを実装
- 管理システムと切り離し、別プロジェクトでも利用できるよう汎用的なAPIを構築(node.js, express)
- テストコードの実行とデプロイを自動化( jest, mongo-jest, gitlabCI, AWS CDK)
- フロントエンドのサーバーレス化
- AWS S3, CloudFrontを用いてをサーバーレスで実装
- SPAに対応するためCloudFrontの設定をカスタマイズしAWS CDKでインフラをコード化
- サーバーレス化するにあたり認証機能を持つマネージドサービスとしてFirebase Authenticationを利用
- (当時AWS CogniteではUIの変更や日本語対応が難しかったためFirebaseの認証を使用)
2. 追加機能の実装 (リプレイス前に実装した機能を含む)
- 制度名などの重要な項目の変更は管理者権限に制限
- WebSocket通信によりリアルタイムで誰がどの制度を更新しているか表示
- (従来システムではSocket.ioで、新システムではAPIGatewayとDynamoDBを用いて実装)
- 必須項目が空であるときなどにエラー出力するバリデーション機能
- 過去の制度情報と比較し非エンジニアでも見やすい更新時のdiffを表示
- 参照元自治体サイトをiframeにより同タブ内に表示
- 前回更新時の制度情報の参照元URLと現在のURLのHTML差分を元サイトのCSS等を適応することにより見やすく表示
- 複数のデータの一括更新
# 工夫した点
- React, Firebase, AWSのサーバーレスの構成などは社内でも初めての試みで他の手法も検討した上で良いと思ったものを導入した
- WebSocketによる他ユーザーの編集中制度の表示がサーバレスに移行する上でのネックであったが、当時ExperimentalだったAPIGatewayのWebSocketの機能を先駆けて導入し、公式ドキュメントが不足するなか試行錯誤して実際に動くとこまで実装できた。
- 実際に一ヶ月ほど行政制度の更新作業に参加することで、利用者目線に立つことができ追加機能の提案に大きく役立った。
# 成果
- バリデーション機能によりシステムで最低限の品質が担保され重大なデータの不備はなくなった
- 自治体サイトの差分表示機能により差分のみの確認で十分になり工数の削減が実現
- 過去データとのdiffを表示する機能により、元々制度データの更新内容を別途メモしていた工数が削減
- 業務未経験で入社したエンジニア2名に引き継ぎ、2週間ほどで運用保守、機能追加を問題なく対応できている
- (従来のコード量の場合一ヶ月かけてもシステム全貌の把握は困難だった)