Java 製 REST API のプロトタイピング
先日 Java の開発環境と CI 環境を作ったので、次のステップとして Java と Spring Boot を使って REST API のプロトタイプを作ってみた。
また、書籍「ユースケース駆動開発実践ガイド」で説明されている ICONIX プロセスを参考にアプリケーションの機能要求やユースケースなどを洗い出した。プロトタイプを作りながらアーキテクチャも検討したので学びの記録として簡単にまとめてみる。
Java も Spring Boot も REST API も SQL も学習中なので、突っ込みどころは多くあるだろうが実際のプロトタイプのリンクを貼っておく。
紙芝居
作ろうとしているアプリケーションの画面構成を簡単に表現した。
機能要求
システムができることは何かを定義する。
- ユーザーは node を登録できなければならない
- node には名前を登録できなければならない
- root 以外の node は 1 つの parent node を登録しなければならない
- node は child node を任意個数登録できなければならない
- node と node は edge で結ばれていなければならない
- ユーザーは node の内容を編集できなければならない
- ユーザーは node を削除できなければならない
- ユーザーは tree を閲覧できなければならない
用語集
機能要求やユースケースで登場する用語の説明をする。
用語 | 説明 |
---|---|
node | ・システムに登録することができる最小単位の要素 |
edge | ・node と node を結び付ける要素 |
tree | ・node と edge で構成される node の集合体 |
root | ・最上流に位置する node |
parent node | ・ある node と edge で結ばれ上流側の node ・各 node にとって parent node は単一となる |
child node | ・ある node とedge で結ばれた下流側の node ・各 node には任意個数の child node を持つことができる |
ドメインモデル
これは用語集に登場する概念らの関係を視覚化した図で、この図を作る作業はドメインモデリングと呼ばれている。
ユースケース図
このアプリケーションのユーザーが、このアプリケーションを使用して何ができるのかを表現している。
ユースケース記述
ユースケース図をより具体化するためにユーザーとアプリケーションの対話を記述する。
本来ならユースケースの代替コース(例外)も記述するべきだが面倒なので省略する。
- node を登録する
- ユーザーはページへアクセスする
- システムは tree を表示する
- ユーザーは node の右上の「・・・」ボタンを押下する
- システムはドロップダウンメニューを表示する
- ユーザーは「Add child node」ボタンを押下する
- システムは child node を作成し、作成された child node の名前を入力するための input 要素にフォーカスする
- ユーザーは node の名前を入力しフォーカスアウトする
- node の名前を編集する
- ユーザーはページへアクセスする
- システムは tree を表示する
- ユーザーは node の右上の「・・・」ボタンを押下する
- システムはドロップダウンメニューを表示する
- ユーザーは「Edit」ボタンを押下する
- システムは node の名前を入力するための input 要素にフォーカスする
- ユーザーは node の名前を変更しフォーカスアウトする
- parent node を編集する
- ユーザーはページへアクセスする
- システムは tree を表示する
- ユーザーは node の右上の「・・・」ボタンを押下する
- システムはドロップダウンメニューを表示する
- ユーザーは「Change parent node」ボタンを押下する
- システム parent node にしたい node の選択(クリック)を促すメッセージを表示する
- ユーザーは任意の node をクリックする
- システムは選択された parent node と当該 node を結びつける
- node を削除する
- ユーザーはページへアクセスする
- システムは tree を表示する
- ユーザーは node の右上の「・・・」ボタンを押下する
- システムはドロップダウンメニューを表示する
- ユーザーは「Delete」ボタンを押下する
- システム node を削除し、child node がある場合は削除した node の parent node と child node 結びつける
- tree の参照
- ユーザーはページへアクセスする
- システムは tree を表示する
アーキテクチャ
オニオンアーキテクチャの思想をベースにした。
Node.js のフレームワークである Express を利用して似た構成で簡単なアプリケーションを作ったことがあるが、それに比べると DI(dependency injection)が魔法のように簡単に実現できて感動した。
レイヤ | 役割 |
---|---|
Domain | ・Entity ビジネスの概念やルールを表現したドメインオブジェクト・ Repository ドメインオブジェクトの取得や更新を表現したインターフェース |
Service | ・Service ユースケースを実現するアプリケーション固有のロジック |
UI | ・Controller リクエストを解釈しレスポンスを生成するオブジェクト |
Infrastructure | ・Repository いわゆる Data Access Object |
これから
この後どの様にアプリケーション開発を進めていくか予定を立てる。
書籍「達人に学ぶDB設計 徹底指南書 ~初級者で終わりたくないあなたへ」を読んで DB 設計をする。この書籍は約 2 年ほど前に購入して読んでいるが、あまり活用する機会がなく忘れているのでもう 1 度読む。