SpringBootを完全に理解する1 | 株式会社スタイラジーの「居心地の良い」ブログ

株式会社スタイラジーの「居心地の良い」ブログ

会社の事や仕事の事、
その他イベントなど、
色々な話題を思うがままに
株式会社スタイラジー社員
の日常を紹介します。

株式会社スタイラジーの
「居心地の良い」ブログ、
2008年1月7日スタート!

こんにちはバイバイ

先週は「テキストノードの操作」について紹介しましたが、

今週のテーマは「SpringBootを完全に理解する1」ですひらめき電球

 

久しく触っていなかったが、

最近のJavaがどうなってるのか調べてみた。    


    
- AltJava    
    - Groovy    
    - Scala    
    - Kotlin    
- Javaのバージョン    
    - 8 or 11    
- フレームワーク    
    - SpringBoot (Tomcat組込)    
- ビルドツール:    
    - Gradle    
- ORM    
    - JPA    
- テンプレートエンジン    
    - Thymeleaf    
    - Mustache    
- IDE    
    - Spring Tools Suite (STS)    
    - VSCode    
    - Atom    
- コンテナ?    
    - JVMは重量級なのでコンテナ向きじゃないのかも    
    - 最近コンテナ技術に最適化されたQuarkusが登場したので一気に置き換わりそう    
    
SpringBootでローカルの開発環境を作ってみる。    
    
1.前提    
WindowsでCLIでdockerを動かせる状態になっていること。    
    
2.ミドルウェア構成    
- mysql等はdockerコンテナ上で動かす    
- JVM(SpringBoot)はコンテナ化すると重そうなのでホスト側で行う    
    
SpringBoootの開発ではSTSを使うとよい。    
(しかしEclipse嫌いなのでVSCodeで行くことにした)    
    
3.手順    
まず、Spring Initializrで最小構成のスターターファイルをダウンロードする。    
https://start.spring.io/  ;  
    
利用するライブラリを選ぶとzipにしてダウンロードできるので適当にこんな感じ。    
    
- DevTools    
- Web    
- Thymeleaf    
- JPA    
- MySQL    
- JDBC    
    
あとで追加したい場合は`biuld.gradle`の依存を修正すればいい。    
(ちなみにSTSならわざわざダウンロードしなくても新規プロジェクト作成時に対話式で選択できる)    
    
Javaはscoopでopenjdkをインストールした    
    
```bash    
$ scoop install openjdk    
$ java --version    
openjdk 11.0.2 2019-01-15    
OpenJDK Runtime Environment 18.9 (build 11.0.2+9)    
OpenJDK 64-Bit Server VM 18.9 (build 11.0.2+9, mixed mode)    
```    
    
作業ディレクトリ    
    
```bash    
$ mkdir -p repos/springboot-demo    
$ cd repos/springboot-demo    
```    
    
Spring Initializrからダウンロード    
    
```bash    
$ wget -O demo.zip "https://start.spring.io/starter.zip?name=demo&groupId=jp.co.stylagy&artifactId=demo&version=0.0.1-SNAPSHOT&; \    
description=Demo+project+for+Spring+Boot&packageName=jp.co.stylagy.demo&type=gradle-project&packaging=jar&javaVersion=11&language=java& \    
bootVersion=2.2.0.BUILD-SNAPSHOT&dependencies=devtools&dependencies=data-jpa&dependencies=mysql&dependencies=jdbc&dependencies=thymeleaf&dependencies=web"    
- --2019-03-27 10:44:38--  https://start.spring.io/starter.zip?name=demo&groupId=jp.co.stylagy&artifactId=demo&version=0.0.1-SNAPSHOT&; \    
description=Demo+project+for+Spring+Boot&packageName=jp.co.stylagy.demo&type=gradle-project&packaging=jar&javaVersion=11&language=java& \    
bootVersion=2.2.0.BUILD-SNAPSHOT&dependencies=devtools&dependencies=data-jpa&dependencies=mysql&dependencies=jdbc&dependencies=thymeleaf&dependencies=web    
start.spring.io (start.spring.io) をDNSに問いあわせています... 104.20.5.247, 104.20.6.247    
start.spring.io (start.spring.io)|104.20.5.247|:443 に接続しています... 接続しました。    
HTTP による接続要求を送信しました、応答を待っています... 200 OK    
長さ: 57921 (57K) [application/zip]    
`demo.zip' に保存中    
     
demo.zip           100%============================================================================>]  56.56K   320KB/s 時間 0.2s    
     
2019-03-27 10:44:40 (320 KB/s) - `demo.zip' へ保存完了 [57921/57921]    
```    
    
展開する    
    
```bash    
$ unzip demo.zip    
Archive:  demo.zip    
  inflating: gradlew    
   creating: gradle/    
   creating: gradle/wrapper/    
   ・・・    
   ・・・    
   ・・・    
  inflating: src/test/java/jp/co/stylagy/demo/DemoApplicationTests.java    
```    
    
git管理しておく    
    
```bash    
$ rm demo.zip    
$ git init    
$ git add .    
$ git commit -m "initial commit"    
```    
    
ビルド(初回はライブラリのDLに時間がかかる)    
    
```bash    
$ ./gradlew build    
     
> Task :test    
     
jp.co.stylagy.demo.DemoApplicationTests > contextLoads FAILED    
    java.lang.IllegalStateException    
        Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException    
            Caused by: org.springframework.beans.factory.BeanCreationException    
                Caused by: org.springframework.beans.BeanInstantiationException    
                    Caused by: org.springframework.boot.autoconfigure.jdbc.DataSourceProperties$DataSourceBeanCreationException    
     
1 test completed, 1 failed    
     
> Task :test FAILED    
     
FAILURE: Build failed with an exception.    
     
* What went wrong:    
Execution failed for task ':test'.    
> There were failing tests. See the report at: file:///C:/msys64/home/Stylagy12/repos/springboot-demo/build/reports/tests/test/index.html    
     
* Try:    
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.    
     
* Get more help at https://help.gradle.org  ;  
     
BUILD FAILED in 35s    
5 actionable tasks: 5 executed    
```    
    
テストでコケたので`build.gradle`を修正して一旦DBなしで動かす    
    
```diff    
--- a/build.gradle    
+++ b/build.gradle    
@@ -16,11 +16,11 @@ repositories {    
 }    
     
 dependencies {    
-       implementation 'org.springframework.boot:spring-boot-starter-data-jpa'    
-       implementation 'org.springframework.boot:spring-boot-starter-jdbc'    
+       // implementation 'org.springframework.boot:spring-boot-starter-data-jpa'    
+       // implementation 'org.springframework.boot:spring-boot-starter-jdbc'    
        implementation 'org.springframework.boot:spring-boot-starter-thymeleaf'    
        implementation 'org.springframework.boot:spring-boot-starter-web'    
        runtimeOnly 'org.springframework.boot:spring-boot-devtools'    
-       runtimeOnly 'mysql:mysql-connector-java'    
+       // runtimeOnly 'mysql:mysql-connector-java'    
        testImplementation 'org.springframework.boot:spring-boot-starter-test'    
 }     
```    
    
もう一度ビルドしたら今度は成功    
    
```bash    
$ ./gradlew build    
     
> Task :test    
2019-03-27 10:58:10.940  INFO 5400 --- [       Thread-5] o.s.s.concurrent.ThreadPoolTaskExecutor  : Shutting down ExecutorService 'applicationTaskExecutor'    
     
BUILD SUCCESSFUL in 10s    
5 actionable tasks: 4 executed, 1 up-to-date     
```    
    
サーバー起動(止めるときは`Ctrl + c`)    
    
```bash    
$ ./gradlew bootRun    
     
> Task :bootRun    
     
  .   ____          _            __ _ _    
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \    
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \    
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )    
  '  |____| .__|_| |_|_| |_\__, | / / / /    
 =========|_|==============|___/=/_/_/_/    
 :: Spring Boot ::  (v2.2.0.BUILD-SNAPSHOT)    
     
2019-03-27 11:01:48.432  INFO 10076 --- [  restartedMain] jp.co.stylagy.demo.DemoApplication       : Starting DemoApplication on ・・・    
2019-03-27 11:01:48.445  INFO 10076 --- [  restartedMain] jp.co.stylagy.demo.DemoApplication       : No active profile set, falling back to default profiles: default    
2019-03-27 11:01:48.495  INFO 10076 --- [  restartedMain] .e.DevToolsPropertyDefaultsPostProcessor : Devtools property defaults active! Set 'spring.devtools.add-properties' to 'false' to disable    
・・・    
・・・    
・・・    
2019-03-27 11:01:50.279  INFO 10076 --- [  restartedMain] jp.co.stylagy.demo.DemoApplication       : Started DemoApplication in 2.25 seconds (JVM running for 2.72)    
<=========----> 75% EXECUTING [12s]    
> :bootRun    
```    
    
ブラウザでページを確認    
    
```bash    
$ start http://localhost:8080/  ;  
```    
    
404エラーページが表示される    
    
なぜならまだ何もページを作成してないからだ    
ということでindexを作成する    
 src/main/java/jp/co/stylagy/demo/IndexController.java    
    
```java    
package jp.co.stylagy.demo;    
     
import org.springframework.web.bind.annotation.RequestMapping;    
import org.springframework.web.bind.annotation.RestController;    
    
@RestController    
public class IndexController {    
    
@RequestMapping("/")    
    public String index() {    
        return "Hello World";    
    }    
}    
```    
    
ブラウザでページを確認    
    
```bash    
$ ./gradlew build    
$ ./gradlew bootDev    
$ start http://localhost:8080/  ;  
```    
    
※`org.springframework.boot:spring-boot-devtools`を組み込んでいれば、エディタ側で自動ビルド設定しておくとコードの変更時に自動的にサーバを再起動してくれるので便利だ。    
VSCodeのプラグインはデフォルトで`bin`ディレクトリに出力するようなので`.classpath`を修正して`build`ディレクトリに出力するようにしておくとよい    
    
無事に表示された。    
    
次回はテンプレートエンジンを使用するところから紹介しますかに座

 

それではまたキラキラ