【Java】Spring Bootを使ったToDoアプリケーションを作成しよう-③実装方針と環境構築-

本稿では、TODOアプリケーションのファイル構成や環境構築について記載をしていきます。また、実装する上で知っておいた方がよい知識もまとめてみました。
実装は次の投稿からはじまり、本稿は知識を入れるための読み物の位置づけです。

# 今回TODOアプリケーションを実装するファイル構成
今回のTODOアプリケーションのファイル構成は以下の通りです。

```
ファイル構成
tutorialTodoApplication
	|-src/main/java
		|-com.example.demo
		　|-ServletInitializer.java
		　|-TutorialTodoApplication.java
		|-com.example.demo.common
		　|-Constants.java
		|-com.example.demo.controller
		　|-TaskController.java
   		　|-GlobalAdviceController.java
		|-com.example.demo.entity
		　|-Task.java
		|-com.example.demo.form
		　|-TaskForm.java
		|-com.example.demo.mapper
		　|-TaskMapper.java
		|-com.example.demo.repository
		　|-TaskRepository.java
		|-com.example.demo.service
		　|-TaskService.java
		　|-TaskServiceImpl.java
	|-src/main/resources
		|-com
		　|-exmple
		　　|-demo
		　　　|-mapper
			|-TaskMapper.xml
		|-static
		|-templates
	      	　|-task
		　　|-complete.html
		　　|-confirm.html
		　　|-deleteConfirm.html
		　　|-edit.html
		　　|-index.html
    		|-systemError.html
		|-application.properties
		|-messages.properties
```

Controller:
役割: ユーザーからのHTTPリクエストを受け取り、適切なServiceクラスのメソッドを呼び出して、結果をユーザーに返す。
例: TaskController.java

Service:
役割: ビジネスロジックを実装するクラス。Controllerからのリクエストを受けて、Repositoryを通じてデータベースにアクセスし、結果を返す。
例: TaskService.java

Repository:
役割: データベースへのアクセスを抽象化するクラス。MyBatisのMapperを呼び出してデータベースとの対話を行う。
例: TaskRepository.java

Mapper:
役割: MyBatisで使用されるSQLクエリをマッピングするインターフェース。データベースとの通信を行うメソッドを提供する。
例: TaskMapper.java

Form:
役割: ユーザーからの入力データを受け取り、ControllerやServiceで処理しやすい形に変換する。バリデーションのためのデータ構造もここで定義することがあります。
例: TaskForm.java

Entity:
役割: データベースのテーブルと1:1で対応するクラス。各属性はテーブルのカラムにマッピングされ、Repositoryを通じてデータベースとやり取りする。
例: TaskEntity.java

これらのクラスの連携によりControllerがユーザーのリクエストをServiceに渡し、ServiceがRepositoryを通じてデータベースと通信し、最終的にデータがユーザーに返されるという一連のプロセスが実現されます。各クラスはそれぞれの責務を持ち、コードが整理されて保守性が向上します。

# 実装方針
TODOアプリケーションの実装全体像は以下の通りです。

まず、ControllerクラスではHTTPリクエストを受け取り、適切な処理を行います。リクエストに応じて適切なServiceクラスのメソッドを呼び出し、必要なデータを取得します。その後、取得したデータをビューに渡して、適切なHTMLファイルを返します。

Serviceクラスでは、ビジネスロジックを実装します。リクエストに対するデータの操作や処理を行い、Repositoryクラスを介してデータベースとのやり取りを行います。この際、ビジネスロジックがControllerクラスから切り離されるため、コードの再利用性や保守性が向上します。

Repositoryクラスでは、データベースとのやり取りを担当します。MyBatisを使用してSQLクエリを実行し、データの永続化や取得、更新、削除などの操作を行います。また、Mapperクラスを介してSQLクエリを定義し、Repositoryクラスから呼び出します。

実装の流れは、まずControllerクラスから始めて、リクエストに対する処理を実装します。次に、Serviceクラスでビジネスロジックを実装し、必要なデータの操作を行います。その後、Repositoryクラスを記載し、mapperクラスの実装を行います。その結果。データベースとのやり取りを行うことになります。最後に、HTMLファイルを作成し、thymeleafをhtmlにマージしていきます。


# 環境構築
以下のブログを参考にしてください。

Springboot＋MyBatisの環境構築/HelloWorldの出力
https://qiita.com/aki_number16/items/bfb24542e41f6d21cac7


# スキーマ・テーブルの作成
workbenchでスキーマを作成しましょう。
MySQLでテーブルを作成する
https://qiita.com/aki_number16/items/1e1ee12aa98893e54677


## テーブル作成
2.設計からテーブルを作成しましょう。テーブルを作成するDDLはこちらになります。

```sql
CREATE TABLE `tutorialtodoapplication`.`task` (
  `taskId` INT NOT NULL AUTO_INCREMENT,
  `title` VARCHAR(100) NOT NULL,
  `description` VARCHAR(200) NULL,
  `deadline` DATETIME NOT NULL,
  `status` INT NOT NULL,
  `userId` INT NULL,
  `created_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` DATETIME NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `deleteFlg` TINYINT NULL,
  PRIMARY KEY (`taskId`))
ENGINE = InnoDB
DEFAULT CHARACTER SET = utf8;
```

## EclipseからのDB接続

application.propertiesに以下のように記入します。usernameとpasswordはDBのインスタンスにログインする際に使うものです。
```
spring.datasource.url=jdbc:mysql://localhost/tutorialTodoApplication
spring.datasource.username=XXXXXX
spring.datasource.password=XXXXXX
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis.configuration.map-underscore-to-camel-case=true
```

＊

「スキーマ・テーブルの作成」を参考に、MySQL WorkbenchでCreate tableを実行します。実行したら、テーブルが作成できているか確認しましょう。テーブル定義を確認できるSQLはこちら。

```sql
desc todoapplication.task;
```

Workbenchを使用する場合は、テーブルだけではなく、スキーマ名も指定しないといけません。他のSQL──例えば、selectなどでもテーブル名を指定するときは、「スキーマ名.テーブル名」という形で表現します。

Mybatisを使用して、Mapper.xmlにSQLを書くときは、テーブル名にスキーマ名をつけません。スキーマ名をつけるのはworkbenchで操作するときだけの対応になるので、忘れないようにしましょう。

＊

**SQLを用いた定義変更時の確認方法について**
SQLでテーブルの定義を操作するときは、①操作前の状態を確認、②定義の変更、③操作後の状態を確認　というような流れでSQLを打っていきます。例えば、一度 create tableでテーブルを作成した後に、titleの桁数を変更するとします。その時、mysql workbenchに接続したうえで、以下のような操作を行います。

1.操作前の状態を確認
desc でtitleが100であることを確認します。
```sql
desc todoapplication.task;
```

2.定義の変更
ALTER TABLEで、桁数を変更します。
```sql
ALTER TABLE tasks
MODIFY COLUMN title VARCHAR(120) NOT NULL;
```

3.操作後の状態を確認
desc でtitleが120であることを確認します。
```sql
desc todoapplication.task;
```

なぜこのような手順を踏むのでしょうか。それは、「2.定義の変更」の操作だけだと、本当にこの操作で変更できているのか、見た目から確認ができないからです。そのため、テーブル変更の前後でテーブルを確認し、「変更したい部分が変わっていること」を確認します。


# 時間があるときに読むとよさそうな記事たち

参考になりそうな記事を集めてみました。

プロになるためのWeb技術入門をまとめてみた
https://qiita.com/Marusoccer/items/585a191f4d44c4b75386

Thymeleaf 3.0を使用した入力フォームのサンプル
https://qiita.com/rubytomato@github/items/8da1bb19537bbfc9c2ea

【バックエンド】駆け出しエンジニアが目指すジュニアレベルのエンジニアとは【2024年版】
https://qiita.com/mamimami0709/items/fd6556707e4b924c65ab

【入門】事例で学ぶ基本設計
https://qiita.com/KNR109/items/5d545903ec7fef85cd37

プログラミング勉強を加速させる7つの習慣
https://qiita.com/YudaiTsukamoto/items/42a8df22ca4c6b327dfd

【11万文字越え】プログラミング初心者に贈る即戦力ガイド
https://qiita.com/nuco_bk/items/27f5ad03d0c4b41241fc

あなたはブラウザについてどこまで説明できますか？
https://qiita.com/S4nTo/items/cb9e486749516034d1bd

何かのときにすっと出したい、プログラミングに関する法則・原則一覧
https://qiita.com/hirokidaichi/items/d6c473d8011bd9330e63

【SIer新人向け】研修では教えてくれないノウハウ集
https://qiita.com/old-stone/items/6221824566116710453f

「ビジネスロジック」とは何か、どう実装するのか
https://qiita.com/os1ma/items/25725edfe3c2af93d735

新人研修でドヤ顔で披露したらウケたEclipseのショートカット集
https://qiita.com/arai-wa/items/c2eb7387b5bf37b4ace4

【初心者向け】今度こそわかるDI〜DIの基礎とSpringにおけるDI〜
https://qiita.com/rebi/items/31169e5bcd64b4411f19

デザインパターン
https://www.techscore.com/tech/DesignPattern/

リファレンス
https://docs.spring.io/spring-boot/docs/3.2.0/reference/htmlsingle/#getting-started

初心者でもわかる！Javadocの意味と書き方【サンプルあり】
https://style.potepan.com/articles/15252.html

GETとPOSTの違いについて
https://qiita.com/kanataxa/items/522efb74421255f0e0a1

要件定義～システム設計ができる人材になれる記事
https://qiita.com/Saku731/items/741fcf0f40dd989ee4f8

【Eclipse】よく使うショートカットキー10選
https://qiita.com/orangecarol/items/9b2e7e4fc9c0125092e7

＊

次の投稿では、一覧機能の実装を行っていきます。