【システム設計】商品在庫管理システムを設計する

# はじめに
学習目的でSpringBootで商品在庫管理システムを作成するためのシステム設計を実施しました。chatGPT（GPT-4)に必要情報を繰り返し入力することで作成された設計工程ですが何かの参考になれば幸いです

### プロジェクトの目的

- シンプルなUIを持つ在庫管理システムを提供し、小規模な店舗や個人事業主が手軽に在庫の追加、削除、編集、検索ができるようにする。

- 在庫の状況や動きを一目で把握できるダッシュボードを提供し、在庫の増減やトレンドを視覚的に確認できるようにする。

- プラグインやAPIを通じて、将来的に他のシステムやサービスと連携可能な設計を心がける。


## 基本設計
「何をどのような形で作るか」を大まかに決める段階です。これがないと、開発が始まっても方向性がブレたり、必要な機能が漏れたりするリスクが高まります。


### 機能要件

システム設計の前段階として、システムに加えたい具体的な機能や条件をはっきりさせる活動が「要件定義」と呼ばれます。この段階では、開発するアプリやウェブサイトの大切な項目や内容を見落とさないよう、大まかな計画や方向性を立てます。どんな機能が欲しいのか、どんな役割を持たせたいのかをリストアップ（箇条書き）することが一般的です。つまり欲しい機能をここで列挙させておくことで、開発者同士が同じ目標に向かって動くことができ、開発作業をスムーズに進める土台を作ることができます。

- ログイン機能
    - ユーザー認証、パスワードリセット、セッション管理
    - システムへの不正アクセスを防止し、利用者を特定する。
- 商品を登録する機能
    - 商品名、カテゴリ、価格、初期在庫数を入力して新規商品を登録する
    - 商品ごとに一意のIDが自動で割り振られる。
- 在庫編集
    - 商品IDや名前を元に商品を検索し、該当商品の情報を編集できる
    - 在庫数、価格、カテゴリなどの情報を変更できる
- 商品検索
    - 商品名やカテゴリで商品を検索する
    - 検索結果は一覧表形式で表示される
    - 検索結果から商品詳細ページへのリンクを提供する
- ダッシュボード
    - システムにログイン後、最初に表示されるページ
    - 在庫総数、品切れリスクのある商品、最も在庫が多い商品などのキーメトリクスを表示。
    - 最近の取引履歴やアラートも表示される。
- 取引記録
    - 商品の出庫や入庫の際の取引を記録する。
    - 取引の日付、商品ID、取引タイプ（販売、購入、廃棄など）、数量を入力する。
    - 取引によって在庫数が自動で更新される。

### 非機能要件
システムやアプリを作る際、何をするか（機能）とは別に、どれだけ良く動かすか（品質）に関する基準や要望を「非機能要件」と呼びます。

もし、システムやアプリを人間に例えるなら、機能要件は「この人は走ることができる」といった能力に関すること。非機能要件は「この人は1時間に10km走ることができる」といった、どれだけ上手く・早く走れるかの品質に関することと言えます。
- パフォーマンス
    - 各画面の表示時間は2秒以内。
    - 検索応答時間は3秒以内。
- セキュリティ
    - ユーザー認証機能を持ち、未認証のユーザーはシステムを使用できない。
    - パスワードはハッシュ化して保存する。
- バックアップ
    - データは毎日自動でバックアップされる。
    - バックアップデータは7日間保存される。
  
## 詳細設計

詳細設計は「アプリやシステムをどう作るか」を具体的に決めて書き下ろしたものです。この設計書があることで、開発者は迷わずに作業を進められ、アプリの完成品も設計通りのものとなります。

### システム概要
使用言語：Java
フレームワーク：Spring Boot
DBシステム：MySQL

システムアーキテクチャ
3層アーキテクチャ（プレゼンテーション層、ビジネスロジック層、データアクセス層）

### データベース設計
実際にシステムやアプリケーションで使うデータベースを作る前に、どのようなデータを保存し、それらのデータがどのように関連しているのかを決めるための設計工程です

#### データベース名 (InventoryDB)
#### 商品テーブル (products)
|カラム名  |データ型  |説明  |
|---|---|---|
|product_id  |INT(11) AUTO_INCREMENT  |商品の一意のID |
|product_name  |VARCHAR(100)  |商品名  |
|description  |TEXT  |商品の説明  |
|stock_quantity  |	INT(11)  |在庫数  |
|price  |DECIMAL(10, 2)  |商品の価格  |
#### トランザクションテーブル (transactions)
|カラム名  |データ型  |説明  |
|---|---|---|
|transaction_id  |INT(11) AUTO_INCREMENT  |トランザクションの一意のID |
|product_id  |INT(11)  |商品のID (productsテーブルと関連)  |
|transaction_date  |DATE  |トランザクションの日付  |
|quantity |	INT(11)  |増減数（負の場合は減少）  |


### 機能の詳細

#### 商品登録・編集
- 入力
    - 商品名
    - 商品の説明
    - 在庫数
    - 商品の価格
- 処理
    -商品テーブルに新しいレコードを追加または既存のレコードを更新。
- 出力
    - 成功/失敗の通知メッセージ
#### 在庫の増減
- 入力
    - 商品ID
    - 増減数
- 処理
    - トランザクションテーブルに新しいレコードを追加。
    - 商品テーブルの在庫数を更新。
- 出力
    - 成功/失敗の通知メッセージ。
#### 在庫検索
- 入力
    - 商品名または商品ID
- 処理
    - 商品テーブルから該当の商品情報を検索。
- 出力
    - 検索結果の一覧表示。
#### トランザクション履歴の参照
- 入力
    - 商品ID (オプション)
    - 期間 (開始日と終了日)
- 処理
    - トランザクションテーブルから指定された条件に一致するトランザクション履歴を検索。
- 出力
    - トランザクション履歴の一覧表示。

### ユーザーインターフェース (UI) の設計
「アプリやウェブサイトの見た目や操作の仕方を決める作業」のことを指します。アプリやウェブサイトを使う人が快適に操作できるようにするための重要なステップです。

#### ログイン画面

- ユーザー名入力フィールド
- パスワード入力フィールド
- ログインボタン
- パスワードを忘れた場合のリンク
#### ホーム画面

- ナビゲーションバー
商品検索、商品追加、在庫増減、トランザクション履歴、ログアウト
システムの簡単な説明またはダッシュボードの表示（例：現在の総在庫数、最新のトランザクション履歴など）
#### 商品検索画面

- 検索フィールド
- 検索ボタン
- 検索結果の一覧表示（商品名、説明、価格、在庫数）
#### 商品追加・編集画面

- 商品名入力フィールド
- 商品説明入力エリア
- 価格入力フィールド
- 在庫数入力フィールド
- 保存ボタン
- キャンセルボタン
#### 在庫増減画面

- 商品IDまたは名前の選択
- 増減数入力フィールド
- 確定ボタン
- キャンセルボタン
#### トランザクション履歴画面

- 期間指定の日付選択
- 商品IDまたは名前でのフィルター
- 履歴の一覧表示（商品名、日付、増減数）

#### API設計
- スマホやタブレットなどの外部端末からも商品在庫管理システムを操作が可能にします
    - /api/login: ログイン機能。認証情報を受け取り、トークンを返す。
    - /api/items: 商品のリストを取得。
    - /api/items/{id}: 特定の商品の詳細情報を取得、更新、削除。
    - /api/transactions: トランザクション履歴のリストを取得。
    - /api/transactions/create: 新しいトランザクションを追加。
## あとがき
本記事では要件定義から詳細設計までのシステム設計のプロセスをチャットGPTを活用して取り組みました。
チャットGPTのサポートを受けながらでしたが、これでより具体的な設計が可能となりスムーズな実装作業が期待できます。
本記事を通じて、初心者でも取り組めるシステム設計のプロセスについて、一部分でも参考になれば幸いです。