Java 製 REST API のプロトタイピング

先日 Java の開発環境と CI 環境を作ったので、次のステップとして Java と Spring Boot を使って REST API のプロトタイプを作ってみた。

kazuhe.hatenablog.com

また、書籍「ユースケース駆動開発実践ガイド」で説明されている ICONIX プロセスを参考にアプリケーションの機能要求やユースケースなどを洗い出した。プロトタイプを作りながらアーキテクチャも検討したので学びの記録として簡単にまとめてみる。

Java も Spring Boot も REST APISQL も学習中なので、突っ込みどころは多くあるだろうが実際のプロトタイプのリンクを貼っておく。

github.com

紙芝居

作ろうとしているアプリケーションの画面構成を簡単に表現した。

機能要求

システムができることは何かを定義する。

  • ユーザーは 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 を持つことができる

ドメインモデル

これは用語集に登場する概念らの関係を視覚化した図で、この図を作る作業はドメインモデリングと呼ばれている。

ユースケース

このアプリケーションのユーザーが、このアプリケーションを使用して何ができるのかを表現している。

ユースケース記述

ユースケース図をより具体化するためにユーザーとアプリケーションの対話を記述する。

本来ならユースケースの代替コース(例外)も記述するべきだが面倒なので省略する。

  1. node を登録する
    1. ユーザーはページへアクセスする
    2. システムは tree を表示する
    3. ユーザーは node の右上の「・・・」ボタンを押下する
    4. システムはドロップダウンメニューを表示する
    5. ユーザーは「Add child node」ボタンを押下する
    6. システムは child node を作成し、作成された child node の名前を入力するための input 要素にフォーカスする
    7. ユーザーは node の名前を入力しフォーカスアウトする
  2. node の名前を編集する
    1. ユーザーはページへアクセスする
    2. システムは tree を表示する
    3. ユーザーは node の右上の「・・・」ボタンを押下する
    4. システムはドロップダウンメニューを表示する
    5. ユーザーは「Edit」ボタンを押下する
    6. システムは node の名前を入力するための input 要素にフォーカスする
    7. ユーザーは node の名前を変更しフォーカスアウトする
  3. parent node を編集する
    1. ユーザーはページへアクセスする
    2. システムは tree を表示する
    3. ユーザーは node の右上の「・・・」ボタンを押下する
    4. システムはドロップダウンメニューを表示する
    5. ユーザーは「Change parent node」ボタンを押下する
    6. システム parent node にしたい node の選択(クリック)を促すメッセージを表示する
    7. ユーザーは任意の node をクリックする
    8. システムは選択された parent node と当該 node を結びつける
  4. node を削除する
    1. ユーザーはページへアクセスする
    2. システムは tree を表示する
    3. ユーザーは node の右上の「・・・」ボタンを押下する
    4. システムはドロップダウンメニューを表示する
    5. ユーザーは「Delete」ボタンを押下する
    6. システム node を削除し、child node がある場合は削除した node の parent node と child node 結びつける
  5. tree の参照
    1. ユーザーはページへアクセスする
    2. システムは tree を表示する

アーキテクチャ

オニオンアーキテクチャの思想をベースにした。

Node.js のフレームワークである Express を利用して似た構成で簡単なアプリケーションを作ったことがあるが、それに比べると DI(dependency injection)が魔法のように簡単に実現できて感動した。

レイヤ 役割
Domain Entity ビジネスの概念やルールを表現したドメインオブジェクト
Repository ドメインオブジェクトの取得や更新を表現したインターフェース
Service Service ユースケースを実現するアプリケーション固有のロジック
UI Controller リクエストを解釈しレスポンスを生成するオブジェクト
Infrastructure Repository いわゆる Data Access Object

これから

この後どの様にアプリケーション開発を進めていくか予定を立てる。

書籍「達人に学ぶDB設計 徹底指南書 ~初級者で終わりたくないあなたへ」を読んで DB 設計をする。この書籍は約 2 年ほど前に購入して読んでいるが、あまり活用する機会がなく忘れているのでもう 1 度読む。

www.shoeisha.co.jp

次に書籍「Web APIの設計」を読んで API の設計をしてみる。

www.shoeisha.co.jp

その後、ICONIX プロセスの「ロバストネス分析」以降の工程を定型的になぞって開発を進めてみようと思う。