Spring Boot + Reactで記事投稿アプリを作成予定｜Service、DTOの機能を洗い出してみた

※学習中のため、間違っている箇所があるかもしれません。
# はじめに
今回はService機能に関して、同実装していくのかを洗い出していきます。
メソッド名や返り値、想定エラーなど、実装時に必要となる情報を記載していきます。

まずは基本的なCRUDに関連する機能を実装していく予定です。
それ以外の機能は随時追加する際に詳細を詰めていきます。

# 機能の洗い出し
以前行った[Spring Boot + Reactで記事投稿アプリを作成予定｜機能整理と設計メモ](https://qiita.com/suica1010/items/1910e82dea147c19cddb)
の機能洗い出しを参照し、それぞれの機能について返り値やメソッド名を決定していきましょう。

## ホーム画面(記事一覧画面)
### 新着記事一覧をリストで表示
■機能名(ユースケース)
新着記事一覧の表示

■メソッド名(Service層)
newArticleList()//引数なし

■返り値
成功：List\<ArticleDto>
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
記事取得失敗(getArticleFailedException)
サーバーエラー(400 internal server error)
DB接続エラー(DataBaseAccessException)
セッションエラー(SessionInconsistencyException)

■使用リポジトリー
ArticleRepository.findAllByOrderByCreatedAtDesc

### ログイン画面を表示
■機能名(ユースケース)
ログインボタンを押下で画面遷移

■メソッド名(Service層)
Controllerで画面遷移を実装

■返り値
成功：ResultDto(result=true)
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
サーバーエラー(400 internal server error)
セッションエラー(SessionInconsistencyException)

■使用リポジトリ
なし

### ログアウトボタン
■機能名(ユースケース)
ログアウトボタンを押下

■メソッド名(Service層)
logout()//引数はなし

■返り値
成功：ResultDto(result=true)
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
サーバーエラー(400 internal server error)
セッションエラー(SessionInconsistencyException)
ログイン状態ではない場合にログアウトが発生(LogoutIllegalException)

■使用リポジトリー
なし

## ユーザー登録
### 登録機能
■機能名(ユースケース)
メールアドレス、パスワードを入力で登録

■メソッド名(Service層)
register(String id, String password)

■返り値
成功：UserDto
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
重複チェック(二重登録)(EmailDuplicationException)
banされたアドレスの場合(BanningUserException)
IDのフォーマットチェック(IdFormatException)
パスワードのフォーマットチェック(PasswordFormatException)
セッションエラー(SessionInconsistencyException)

■使用リポジトリー
基本的なCRUDで実装

## ログイン画面
### ログインボタンを押下
■機能名(ユースケース)
ログイン実行

■メソッド名(Service層)
login(String id, String password)

■返り値
成功：ResultDto(result=true)
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
サーバーエラー(400 internal server error)
DBに存在しない場合エラー(DataBaseNonExistsException)
Banされれているユーザーの場合エラー(BanningUserException)
IDのフォーマットチェック(IdFormatException)
パスワードのフォーマットチェック(PasswordFormatException)
セッションエラー(SessionInconsistencyException)

■使用リポジトリー
基本的なCRUDで実装

## マイページ(一般ユーザー)
### 記事一覧画面
■機能名(ユースケース)
ユーザーの記事一覧を表示する

■メソッド名(Service層)
myArticleList(String userId)

■返り値
成功：List\<ArticleDTO>
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
記事取得失敗(getArticleFailedException)
DB接続エラー(DataBaseAccessException)
サーバーエラー(400 internal server error)
セッションエラー(SessionInconsistencyException)

■使用リポジトリー
ArticleRepository.findByUserId

### 詳細表示画面
■機能名(ユースケース)
記事の詳細画面を表示

■メソッド名(Service層)
myArticleDetail(String userId, String articleId)

■返り値
成功：ArticleDetailDTO
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
記事取得失敗(getArticleFailedException)
DB接続エラー(DataBaseAccessException)
サーバーエラー(400 internal server error)
セッションエラー(SessionInconsistencyException)

■使用リポジトリー
基本的なCRUDで対応

### 記事投稿
■機能名(ユースケース)
記載した記事を投稿する

■メソッド名(Service層)
createArticle(ArticleDto dto, int articleId, String userId)

■返り値
成功：ResultDto(result=true)
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
記事フォーマットエラー(ArticleFormatException)
DB接続エラー(DataBaseAccessException)
サーバーエラー(400 internal server error)
セッションエラー(SessionInconsistencyException)

### 記事編集画面
■機能名(ユースケース)
記事編集機能

■メソッド名(Service層)
editArticle(ArticleDTO dto, int articleId, String userId)

■返り値
成功：ResultDto(result=true)
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
記事フォーマットエラー(ArticleFormatException)
DBに存在しない場合エラー(DataBaseNonExistsException)
DB接続エラー(DataBaseAccessException)
サーバーエラー(400 internal server error)
セッションエラー(SessionInconsistencyException)

■使用リポジトリ
基本的なCRUDで対応

### 記事削除画面(一覧から削除、詳細から削除)
■機能名(ユースケース)
記事削除機能

■メソッド名(Service層)
articleDelete(List<articleDeleteDto> dtoDeleteList, String userId)

■返り値
成功：ResultDto(result=true)
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
DBに存在しない場合エラー(DataBaseNonExistsException)
DB接続エラー(DataBaseAccessException)
サーバーエラー(400 internal server error)
セッションエラー(SessionInconsistencyException)

■使用リポジトリ
基本的なCRUDで対応

### 下書き保存機能
※投稿フラグの管理で実装予定

### 投稿フラグの管理
■機能名(ユースケース)
投稿フラグで表示管理

■メソッド名(Service層)
ArticlePublishFlg(int articleId, Boolean articlePublishFlg, String userId)

■返り値
成功：ResultDto(result=true)
失敗：Exceptionをスロー または ResultDto(result=false)

■エラー
DBに存在しない場合エラー(DataBaseNonExistsException)
DB接続エラー(DataBaseAccessException)
サーバーエラー(400 internal server error)
セッションエラー(SessionInconsistencyException)

■使用リポジトリ
基本的なCRUDで対応

## 今回洗い出しから除外した機能
一度にすべて作成していくとどうしても作成時の修正や変更が増えた場合に
修正していくことが困難になる可能性があります。
そのため最低限の機能を実装し、それ以外は実装時に詳細を詰めていきます。

■　ホーム画面
- タグ検索
- カテゴリ表示
- お気に入り表示
- 検索機能

■ ユーザー登録
- 認証メール送信

■ ログイン画面
- パスワードを忘れた方への実装
- メールにパスワード再設定urlを記載し送信処理
- 二段階認証の実装

■ マイページ
- 閲覧数
- like数

■ 管理画面(管理者)
※一般ユーザーとは異なるロールでログイン後にアクセス可能
- 一般ユーザーの記事確認・削除(不適切な記事の削除)
- ユーザー一覧とステータス確認
- ユーザーに対するアカウント削除機能(ban機能)

# 今回の注意点まとめ
### メソッド名
基本的にメソッド名の命名規則は統一したほうがいいので
今回は`動詞+名詞`で行いました。
現場によって命名規則は微妙に違ったりするので、この辺りは現場の規則に合わせましょう。

## DTO
`DTO`は主に`Service`と`Controller`間でデータのやり取りをするためのオブジェクトです。
`Entity`との違い`DTO`は直接データベースへ接続せずに、`Entity`から取得した値を整形し、`Service`から`Controller`へ受け渡す責務を負います。

## ResultDto
この`DTO`は共通して結果を返すための`DTO`です。
`<T>`(ジェネリクス型)を指定し、様々なクラスで使用する予定です。
`<T>`は

# まとめ
今回は`Service`に関する機能の洗い出しを行いました。

最初に大雑把に機能を決めておくことで、後からぶれていくことが少なくなるので
最低限の情報は決めてから製造していきましょう。

特に個人開発でやっていると、行き当たりばったりになってわからなくなり、途中でやめてしまうこともあります。
そのため、何を、どのように作成するのかは明確にしておきましょう。

次回以降
- Service,DTO
- Controller
- React連携

今回の記事が少しでもspring boot初学者の助けになれば幸いです。

[前：Spring Boot + Reactで記事投稿アプリを作成予定｜Repositoryを実装・解説してみた](https://qiita.com/suica1010/items/612440c7045e7ed71385)
[次：Spring Boot + Reactで記事投稿アプリを作成予定｜Flyway入門：DBマイグレーションの基礎からテーブル作成・データ挿入まで解説してみた](https://qiita.com/suica1010/items/5e4c1776b016cc71dca7)