【システム設計】図書管理システムを作りたい

# はじめに
フレームワークのSpringBootを効率よく学習するためにSpringBootで図書管理システムのシステム設計を実施しました。chatGPT（GPT-4)に必要情報を繰り返し入力することで作成された設計工程ですが何かの参考になれば幸いです


## 要件定義書を作成する

要件定義を文書化するうえで、今回は大きく3つのセクションに分割し作成します

- 概要：このプロジェクトが何であるか、その目的は何であるか、誰がユーザーであるかなどを簡潔に記述します。
- 機能要件：システムがどのような機能を提供する必要があるかをリスト形式で書き出します。
- 非機能要件：システムのパフォーマンス、セキュリティ、信頼性、使いやすさなど、機能以外の要素について記述します。



### 要件定義書: 図書管理システム
#### 1. プロジェクトの目的
本図書管理システムは、図書館の職員と利用者が、効率的かつ簡易的に図書の管理と貸出を行うことを目的としています。

#### 2. システムの概要とユーザーグループ
本システムは、図書の検索、貸出、返却、在庫管理を行うことができるウェブアプリケーションです。システムは次のユーザーグループを対象としています：

- 一般利用者: 図書の検索と自身の貸出状況の確認が可能。
- 図書館スタッフ: 貸出・返却の管理、新規図書追加、既存図書削除、図書情報編集が可能。
- システム管理者: システム全般の設定やユーザーアカウントの管理が可能。
#### 3. 機能要件
##### 3.1. 認証機能
各ユーザーはユーザー名とパスワードを使ってログインでき、そのユーザーアカウントに応じた権限でシステムを利用することができる。アカウントの作成はシステム管理者によって行われる。不正なログイン試行が一定回数以上行われた場合、そのアカウントは一時的にロックされる（15分後に自動解除）。ロックされたアカウントの解除は、システム管理者が手動で行うことも可能。

##### 3.2. 検索機能
一般利用者と図書館スタッフはタイトル、著者名、出版社名、分類から図書を検索できる。

##### 3.3. 貸出・返却機能
図書館スタッフが一般ユーザーの代わりに利用可能な図書を借り、貸出日と返却期限を記録する。図書館スタッフが一般ユーザーの代わりに借りた図書を返却する。

##### 3.4. 管理機能
図書館スタッフは新しい図書の追加、既存の図書の削除、図書の詳細情報の編集を行うことができる。管理者は貸出状況の確認と管理を行うことができる。

#### 4. 非機能要件
##### 4.1. 性能
- スケーラビリティ: システムは、少なくとも10,000冊以上の図書データと、それに関連する貸出・返却データを処理できる必要があります。
- 応答時間: ユーザーの操作に対するシステムの応答時間は、通常の操作環境下で2秒以内に制限します。ピーク時の負荷でも5秒以内に応答することを目指します。
- 同時接続ユーザー: システムは、同時に最大100人のユーザーが使用できるように設計します。
- 負荷テスト: システムは、負荷テストにて十分なパフォーマンスとスケーラビリティが確認されることが求められます。
- アップタイム: 本システムの可用性（アップタイム）は99.9%を目指します。
- データ処理速度: 新規図書追加、既存図書削除、図書情報編集などのデータ操作に対する応答時間は5秒以内に制限します。
##### 4.2. セキュリティ
ユーザーのパスワードは暗号化されて保存される。不正なログイン試行が一定回数以上行われた場合、そのアカウントは一時的にロックされる（15分後に自動解除）。ロックされたアカウントの解除は、システム管理者が手動で行うことも可能。

##### 4.3. 使い易さ
ユーザーインターフェースは直感的で、簡単に操作できる。

## 基本設計書を作成する
基本設計書はエンジニア向けの設計書ではなく、非エンジニアでも理解できるイメージ図を指しています。外部設計とも呼びます。
顧客に完成予想図をイメージさせることができればOKなので、書き方（フォーマット）の決まりはありません。フローチャートによる画面の遷移図や、完成した場合のデザインを画像を用意するなど、非エンジニアとのコミュニケーションに用いる設計図なので、完成図が容易にイメージできることが必須とされています

以下はWondershare EdrawMas(試用版）というアプリを使って作成したフローチャートになります
![スクリーンショット 2023-06-30 17.54.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2765288/743f035d-9569-4158-16be-fdf570cb1fe0.png)


## 詳細設計書を作成する
詳細設計は、基本設計の段階で定義された要件や機能に基づき、具体的な画面やボタン、システムの項目などのリストを作成することです。これはプログラマーが見るための書類であり内部設計とも呼ばれています。プロジェクトの規模や工程の進め方によっては基本設計の後に詳細設計を省略して開発に進む場合があります。今回は次の項目を詳細設計とさせていただきます

### 詳細設計書：図書管理システム
#### システム概要
使用言語：Java
フレームワーク：Spring Boot
DBシステム：MySQL
#### システムアーキテクチャ
3層アーキテクチャ（プレゼンテーション層、ビジネスロジック層、データアクセス層）
#### データベース設計
データベース名：LibraryManagementSystem
テーブル名：Users, Books, BorrowedBooks, BorrowHistory, Staff
- Usersテーブル
    - userId：ユーザー管理ID
    - username：ユーザー名
    - password：パスワード
    - email：メールアドレス
    
- Booksテーブル
    - bookId：本の管理ID
    - title：図書の名前
    - author：著者
    - publicationYear：出版年
    - publisher：出版社
    - genre：ジャンル
    - status (available or borrowed)：貸出状況
- BorrowedBooksテーブル
    - userId：貸出ユーザーのID
    - bookId：ユーザーが借りている本のID
    - borrowedDate：借用日
    - returnDueDate：返却期限日
- BorrowHistoryテーブル
    - userId：貸出ユーザーのID
    - bookId：ユーザーが借りた本のID
    - borrowedDate：貸出日
    - returnedDate：返却日
- Staffテーブル
    - staffId：スタッフのログイン用ID
    - username：スタッフの名称
    - password：パスワード
#### API設計
- POST /api/users - ユーザー作成
- POST /api/staff - スタッフ作成（管理者専用）
- GET /api/books - 書籍の一覧取得
- GET /api/books/{bookId} - 特定の書籍の詳細情報取得
- POST /api/books/{bookId}/borrow - 書籍の貸出
- POST /api/books/{bookId}/return - 書籍の返却
- GET /api/users/{userId}/history - ユーザーの貸出履歴の取得
- GET /api/books/{bookId}/history - 書籍の貸出履歴の取得
- GET /api/staff/{staffId}/book-history - スタッフが閲覧できる全ての図書の貸出履歴
- POST /api/books - 新規書籍の追加（スタッフ専用）
- DELETE /api/books/{bookId} - 書籍の削除（スタッフ専用）
#### 画面設計
##### ログイン画面
- ユーザー名とパスワードの入力フィールド
- ログインボタン
- パスワードのリセット/再設定リンク
##### ダッシュボード画面
- 借りている図書の表示
- 新着図書の表示
- 検索バー
- 図書検索画面へのリンク
- 書名、著者名などの検索条件入力フィールド
- 検索ボタン
##### 検索結果の一覧表示
- 書影表示
- 図書のジャンルや貸出状態の表示
- 図書詳細画面へのリンク
- 図書の詳細情報表示（書名、著者名、出版社、出版年など）
- 貸出ボタン（貸出確認画面へ移行/スタッフのみ）
##### 貸出確認画面（スタッフアカウントのみ）
- ユーザー情報の入力フィールド
    - ユーザーIDから情報入力で貸出ユーザーを確認
    - 抽出した情報から本人確認実施
- 図書情報の表示
- 貸出日と返却予定日の選択
    - 貸出日から2週間後を自動登録
- 貸出ボタン（スタッフアカウントの場合のみ表示）

#### 返却画面
- ユーザー情報の入力フィールド
    - ユーザーIDから情報入力で貸出ユーザーを確認
    - 抽出した情報から本人確認実施
- 図書情報の表示
- 返却ボタン
#### 在庫管理画面
- 在庫リストの表示
- 図書の追加や削除のオプション
- 在庫数の管理
- 購入依頼の処理
#### 一般ユーザー作成画面
- ユーザー名
- ユーザーID
- パスワード
- メールアドレス
- 電話番号
- 住所
- ユーザー作成ボタン
#### スタッフ作成画面（管理者専用）
- スタッフ名
- スタッフID
- パスワード
- メールアドレス
- スタッフ作成ボタン
#### 貸出履歴画面
- 貸出した図書の一覧表示
- 貸出日、返却日の表示
- 書籍の詳細へのリンク
#### スタッフ専用画面
- 図書の貸出履歴の一覧表示
- 各図書の貸出日、返却日の表示
- 各図書の詳細へのリンク

#### 補足
返却API（POST /api/books/{bookId}/return）を呼び出した時点で、BorrowHistoryテーブルにレコードを挿入する機能も実装


## あとがき

本記事では、初心者の私が要件定義から詳細設計までのシステム設計のプロセスをチャットGPTを活用して取り組みました。

まず、要件定義では図書管理システムのニーズを具体化しました。ユーザーの要件を理解し、システムの目的や機能、制約事項を明確にしました。

次に外部設計では、アーキテクチャやインターフェース、画面設計など、システムの外側の仕様を設計しました。ユーザーが直面する部分や外部システムとの連携を考慮しました。

最後に詳細設計では、データベース設計やAPI設計など、具体的な実装に必要な要素を設計しました。データベースのテーブル構造やAPIのエンドポイントを決めるなど、具体的な実装イメージを描きました。

チャットGPTのサポートを受けながらでしたが、これでより具体的な設計が可能となりスムーズな実装作業が期待できます。

本記事を通じて、初心者でも取り組めるシステム設計のプロセスについて、一部分でも参考になれば幸いです。

## 実際に作成したサンプル

https://qiita.com/EasyCoder/items/3a717db1761ddd9d3ae0

https://qiita.com/EasyCoder/items/24eba9e01e31bc492aa7