SpringBoot(Spring Framework)と聞くと「DI」とか「AOP」とか専門的なワードが出てきてなんだかとっつきにくい印象があり、使い始めてみるにはハードルが高く感じる人もいるかもしれません。
そんな方が最短・最小でSpringBootで開発を始められるように知識を集約してみました。
SpringBootのシステム開発・運用を6年間してきた知識・経験がベースになっているので、きっと仕事に活かせる内容になっています!
この記事は、こんな人にオススメ!
・これからSpringBootを使おうと思っている
・細かいことよりまず動くものを作ってみたい
前提
・Java:インストール済み
・IDE:Intellij
この記事では、「Hello, world」と画面に表示するだけのWebアプリの開発を例に手順を解説していきます。
「とりあえず動くものを」を重視するため、アプリケーションの実装方法の詳細は別記事にてまとめようと思います。
プロジェクト作成
まずは、アプリケーションを開発する基礎となるプロジェクトを作成します。
プロジェクトの作成は、https://start.spring.io/ から行います。
入力項目についてそれぞれ解説します。
■Project
大きくGradle or Mavenを選択します。
個人的にはGradleの方がのちに出てくるプロジェクトの設定ファイルがみやすいのでオススメです!
GradleにもGroovy or Kotlinの選択肢がありますが、Groovyの方が情報が多い印象なので初心者向けなのはGroovyかと。
■Language
Java, Kotlin, Groovyからの選択ですが、ここは現場での言語選定によると思います。
この記事では一番メジャーであろうJavaを選択します。
■SpringBoot
特に理由がなければ最新のversionでかつ「SNAPSHOT」「M」「RC」のついていないものを選びましょう!
ざっくり開発中のversionを表すsuffixです。
SpringBootでは「SNAPSHOT」→「M1」→「M2」→…→「RC1」→「RC2」→…
というversionを経てGA版がリリースされる傾向があります。
ちなみに
・RC:Release Candidate(リリース候補版)
・GA:General Availability(一般公開版)
という意味です!
■Project Metadata
「Group」と「Artifact」だけ入力すればとりあえずはOKです!
「Group」にはサービスのドメインを逆順に設定するものをよくみます。
たとえばGoogleが提供するライブラリに「gauva」というものがあるのですが、
groupに該当する部分が「com.google」となっています。
この記事のドメインが「hirabay.net」なので、ここでは「net.hirabay」というgroupにしています。
「Artifact」にはアプリの名前を設定しましょう。
■Dependencies
「ADD DEPENDENCIES」をクリックすると使用するライブラリを選択できます。
ここで選択するものは作りたいものによって変わります。
この記事では「Spring Web」と「Thymeleaf」を追加します。
最後に「GENERATE」ボタンをクリックでプロジェクトファイルが一式zipに固まったものがダウンロードできます!
Intellijでプロジェクトを開く
プロジェクトをダウンロードしたら、zipファイルを解凍しましょう。
解凍後のディレクトリに存在する「build.gradle」を指定してIntellijで開きます。
「Open as Project」の方を選択しましょう!
画面下の処理中のバーが表示されなくなったら開発の準備はOKです!
アプリケーション開発
SpringBootでは、アプリケーション開発に必要な枠組みを相当量用意してくれています。
ピュアJavaの「mainクラスを実装してー」みたいな知識は一旦捨てて、
「SpringBootで、こういうアプリケーションを作ろうと思ったらこれとこれを実装する」みたいなことを覚えるところから入ると理解しやすいと思います!
では、今回作ろうとしているWebアプリで必要なものが何かというと「Controller」と「HTMLテンプレート」です。
Controller
@Controller
のついたクラスのことです。
src/main/java/net/hirabay/sample/controller/HelloWorldController.java
を作成してみましょう。
・パスを増やしたい場合は、同じようにメソッド追加でも良いですし、別の@Controllerがついたクラスを実装しても良いです
// @Controllerアノテーションを付与する
@Controller
public class HelloWorldController {
// アクセスされるパスを指定
@GetMapping("/hello")
public String hello() {
// テンプレート名を返却
// templates配下の「xxxx.html」と対応させる
return "hello";
}
}
HTMLテンプレート
画面表示するHTMLのもととなるテンプレートファイルです。
拡張子は通常のHTMLと同じく.html
で、src/main/resources/templates/
配下に作成します。
先ほど、Controllerでhello
を返却するように実装をしたので、hello.html
という名前で作成します。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Hello, world</title>
</head>
<body>
<h1>Hello, world.</h1>
</body>
</html>
※テンプレートへの変数の埋め込み等は別記事にて(準備中)
アプリケーション起動
ここまで実装できたらアプリケーションを起動してみましょう!
開発中
開発中は「bootRun」というGradleのタスクを実行することでアプリケーションを起動します。
画面右側のGradleタブから操作をします
./gradlew bootRun
Started XxxxxxApplication in x.xxx seconds
というようなログが出力されれば起動完了です!
本番
本番向けのアプリケーションはjarファイルを実行することで起動します。
ここでは最もシンプルにjarファイルを生成して実行する例を載せます。
$ ./gradlew bootJar
$ java -jar ./build/libs/sample-0.0.1-SNAPSHOT.jar
build/libs
配下に、[artifact]-[version].jar
という形式で作成されます。追加で知っておくべきこと
これでアプリケーションの起動まではできるようになったので、
ここからは実務で知っておかないと困るであろうことを補足していきます。
ライブラリの追加
業務をおこなっていると利便性のためにライブラリを追加したくなると思います。
※依存を追加するとかって言ったりします。
そういったときはbuild.gradle
のdependencies
部分を修正します。
ここではlombok
を例に、依存に追加する方法を3つ紹介します。
SpringBootと関わりの深いライブラリ(特にspringと名のつくもの)については、SpringBootにサポートバージョンがあったりするので、start.spring.ioから依存の追加ができるものは、start.spring.ioからがオススメです。
プロジェクトを作成した時と同じく https://start.spring.io/ にアクセスし、「ADD DEPENDENCIES」をクリック、「lombok」で検索します。
Dependencies以外はProjectがプロジェクト作成時と同じであればなんでも良いです。
Lombokが追加できたら、「EXPLORE」をクリックします。
そうするとzipに圧縮されてダウンロードできる中身のファイルが表示されます。
ここでは「build.gradle」を選択し、既存のプロジェクトとの差分をコピペすればOKです!
...
configurations {
compileOnly {
extendsFrom annotationProcessor
}
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
...
org.projectlombok:lombok:1.18.26
のようにversionを含まなければなりません。しかし、「plugins」で記載のある「org.springframework.boot」「io.spring.dependency-management」のプラグインのおかげで、versionの記載なしでSpringBootのversionにあったものを自動で追加してくれます。
start.spring.ioで見つからなかったライブラリは、公式ドキュメントから利用方法を探してみましょう。
だいたい「Get started」「install」と言ったワードで探していくと見つかります。
Lombokの場合はここに記載がありました。
これは玄人向けに近いのですが、目当てのライブラリの目星がついていればMaven Repositoryであればどんなライブラリでもこの一箇所を探せば見つかります。
https://mvnrepository.com/ にアクセスし、「lombok」と入力し検索します。
探していたライブラリが見つかったらリンクへ飛び、利用したいversionのリンクに飛びます
Gradleのタブを選択するとコードが表示されるので、build.gradle
のdependencies部分に追加しましょう!
業務クラスの実装
ここまではごく簡単な実装例で、クラスが1つしか登場してきませんが実際は業務クラスや他リソースとの通信を担うインフラレイヤーのクラスもあったりします。
この記事では仮の業務クラスを実装して先ほど実装したControllerクラスから呼び出せるようにしてみます。
ここでDIの知識が必要になるのですが、まずは「こう書いたらDIが使える!」を覚えてしまいましょう。
「ライブラリの追加」で追加した「Lombok」を使う前提で解説します。
※Lombokを使った方が実装量が減るのでオススメです!
まずは業務クラスの作成です。
// @Componentアノテーションをつける
@Component
public class HelloWorldService {
public void hello() {
// 業務ロジック
}
}
ポイントは、@Component
というアノテーションをつけることです。
本当は@Service
とか@Repository
とか似たような役割のアノテーションがあるのですが、
とりあえず@Component
をつければDIが使えるくらいの理解で大丈夫です!
次に、この業務クラスをControllerクラスから呼び出します。
ポイントとなる変更箇所は2点です。
・@RequiredArgsConstructor
をつける
・利用したいクラスをfinalフィールド変数で定義する
// @Controllerは実は@Componentのリクエストを受け取るクラス専用版
@Controller
// @RequiredArgsConstructorをつける
@RequiredArgsConstructor
public class HelloWorldController {
// 利用したいクラスをfinal修飾子つきで定義
private final HelloWorldService helloWorldService;
@GetMapping("/hello")
public String hello() {
helloWorldService.hello();
return "hello";
}
}
@RequiredArgsConstructor
はLombokのアノテーションで、finalがついたフィールド変数を引数にとるコンストラクタを自動で生成してくれます。
利用したいクラスを引数に設定されているコンストラクタがあるとDIが使えます!
これでContollerから別のクラスが呼び出せるようになりました!
・呼び出す側:@RequiredArgsConstructor+finalフィールド変数
・呼び出される側:@Component
▼Lombokの使い方についてもっと知りたい方はこちら
【超実用的】覚えておくべきLombokアノテーション7選まとめ
この記事ではとりあえずSpringBootのプロジェクトを作成してから起動できるようになるまでを解説しました。
アプリケーションの種類ごとの実装方法は別途記事を作成予定です!