本稿では、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はこちらになります。
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はこちら。
desc todoapplication.task;
Workbenchを使用する場合は、テーブルだけではなく、スキーマ名も指定しないといけません。他のSQL──例えば、selectなどでもテーブル名を指定するときは、「スキーマ名.テーブル名」という形で表現します。
Mybatisを使用して、Mapper.xmlにSQLを書くときは、テーブル名にスキーマ名をつけません。スキーマ名をつけるのはworkbenchで操作するときだけの対応になるので、忘れないようにしましょう。
*
SQLを用いた定義変更時の確認方法について
SQLでテーブルの定義を操作するときは、①操作前の状態を確認、②定義の変更、③操作後の状態を確認 というような流れでSQLを打っていきます。例えば、一度 create tableでテーブルを作成した後に、titleの桁数を変更するとします。その時、mysql workbenchに接続したうえで、以下のような操作を行います。
1.操作前の状態を確認
desc でtitleが100であることを確認します。
desc todoapplication.task;
2.定義の変更
ALTER TABLEで、桁数を変更します。
ALTER TABLE tasks
MODIFY COLUMN title VARCHAR(120) NOT NULL;
3.操作後の状態を確認
desc でtitleが120であることを確認します。
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
*
次の投稿では、一覧機能の実装を行っていきます。