Spring Boot入門その1

この記事は[こちらのブログ](https://yk0807.com/techblog/2019/05/06/spring-boot%E5%85%A5%E9%96%80%E3%81%9D%E3%81%AE1/)をQiitaに移したものです。
まだSpring Bootを使うようになって1ヶ月ちょっとしか経っていなくて、説明が不適切な箇所があるかもしれませんが、その際は指摘していただければと思います。

[WEB+DB PRESS106号](https://gihyo.jp/magazine/wdpress/archive/2018/vol106)でSpring Bootの記事でタスク管理サービスとQiitaのクロール＆配信サービスを作るというのがあったので、とりあえずタスク管理サービスをの方をやってみました。
今回WEB+DB PRESSの記事をまねて作ったソースコードは[こちら](https://github.com/YusukeKitamura/todo)にあります。今後色々と改良していく予定です。
ちなみに、完成品（？）はこんな感じです。
<img width="1182" alt="Spring_todo.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/66360/24af088e-ba56-aac1-8893-10159298b133.png">

# 1.Spring Bootとは
2003年にSpring FrameworkというJavaのWebフレームワークが作られて、それを使いやすくしたものとして2014年に作られたのがSpring Bootです。
[DI(依存性の注入)](https://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5)の考え方を用いているのが特徴です。

# 2. Spring Bootで開発を行うために必要なもの
・[OpenJDK](https://openjdk.java.net/)（フレームワーク以前にJavaで開発をやるんなら当然必要でしょう。バージョンは今時の機能を使うんなら最低でも8以上は必要かと）
・[Spring Tool Suite](https://spring.io/tools)（STSと略す。EclipseベースのIDE。本だと3.9.5でやってたみたいだが、2019年4月時点だと4以降がデフォルトなので、自分は4.1.2でやった）
・[Lombok](https://projectlombok.org/)（ロンボックと読む。アノテーションをつけるだけでgetterとsetterを自動生成してくれる便利なライブラリです。ダウンロードしたlombok.jarをダブルクリックするだけでインストールされます。）
・データベース管理システム（Webシステムなんだから必要に決まってる。自分が普段使っているやつを使えばいいと思います。本ではH2 Databaseを使っていたが、自分は使い慣れているMySQLでやりました。）
・[Pleiades](http://mergedoc.osdn.jp/)（プレアデスと読む。Eclipse日本語化プラグイン。英語が得意な人には必要ではないんだろうけど、自分は入れました。導入の仕方は[こちら](https://java-reference.com/java_env_eclipsejapanese.html)を参照（リンク先はWindowsでの説明だけど、Macでもfeaturesとpluginsフォルダにダウンロードしたものの中身を入れるという、同じやり方で大丈夫です）。）
・[Maven](https://maven.apache.org/)（メイヴンと読む。Javaのビルドツール。STSを公式ページからダウンロードしてインストールした場合は大丈夫（なはず）だけど、brewコマンドとかでインストールした場合はmvn -versionで入っているか確認して、なかったら公式ページから持ってくるかbrew install mavenとかでインストールしてください）

# 3. Spring Bootの構成の大雑把な説明
ここでは、Laravelとの比較っぽい感じでSpring Bootの構成をかいつまんで説明して行きます。なお、Spring BootではLaravelとかと違って、フォルダ構成は決まっていないので、自分で構成を考える必要があります。
Javaのソースはsrc/main/java以下に、Java以外（html, css, jsなど）はsrc/main/resources以下に置かれます。JUnitでテストを行うためのソースはsrc/test以下に置かれます。

src/main/java （Javaソースファイル）
・Application（メイン関数です。アノテーションに@SpringBootApplicationをつけます。プロジェクトを実行するとこのメイン関数が呼ばれます。Laravelのindex.phpに近いか。）
・Entity（データの定義です。@Entityアノテーションをつけます。lombok.Dataをインポートして@Dataをつければゲッターとセッターが自動的に生成されます。さらに[JPA](https://ja.wikipedia.org/wiki/Java_Persistence_API)（Javaでデータベースを扱う標準技術）を使って@Table(name = “テーブル名”)をつければ、自動的にテーブルを作ってくれます。LaravelのModel（app直下のやつ）＋マイグレーションといったところか。）
・Repository（Entityで定義したデータのCRUD（create, read, update, delete）の基本操作を行うためのもので、JpaRepositoryを継承したインタフェースとして定義されます。Laravelにはない機能ですね。）
・Controller（MVCのCを担うControllerで、Laravelのものと似ていますが、データに対する処理などは次に説明するServiceを呼び出す形で実装します。@Controllerアノテーションをクラスにつけます。また、Getメソッドならメソッドに@GetMapping(value=”（URL）”)を、Postメソッドならメソッドに@PostMapping(value=”（URL）”)をアノテーションにつけることでリクエストをマッピングすることができます。なので、LaravelだとController＋routesに近いイメージかも）
・Service（データに対して行う処理を実装して、Controllerに渡すものです。これもLaravelにはないですが、あえて言えばModelとControllerの間をつなぐものというイメージかもしれないです。@Serviceアノテーションをつけます。実際の処理はRepositoryのCRUD操作を呼び出して実装します。）
・Form（htmlフォームに入力した値をコントローラに渡すためのクラス。バリデーションとかもここで行うことが多いようです。LaravelでいうRequest？）

src/main/resources（フロントエンドなど）
・Thymeleaf（タイムリーフと読む。植物のハーブから名付けられたようです。いわゆるテンプレートエンジン。LaravelだとBladeがデフォルトだけど、Spring Bootではこれ以外にもいくつかのテンプレートエンジンをサポートしているようです。）
・application.properties（アプリケーションの設定値を持たせるもので、Laravelだとconfig配下のファイルが近いと思います。使用するデータベースの設定なんかもここで行います。）

以上、かなり駆け足で書いたのでざっくりとした説明になってしまいましたが、その２を書くときはもう少し詳しく書ければと思います。