1クール続けるブログ

とりあえず1クール続けるソフトウェアエンジニアの備忘録

黒べこ本(kotlin)でSpring Boot入門メモ① (Spring Boot概要・ざっくりGradle)

春が来たのでSpring Bootに入門しました。

今まではC#を書いていたのですが、次の仕事からJavaを使うことになりそうだったので、アクロ本結城浩さんのJava言語で学ぶデザインパターン入門で勉強しています。デザインパターン本の方は、言語仕様が古かったりするんですが、Java8以降ならこう書けるなというものを見つけていく作業が楽しかったりします。

その流れでSpringも勉強しようと思ったのですが、どうせならJavaと一緒にkotlinも勉強したいと思っていたので、いっそのことkotlinでSpringに入門するのもありかもと。ちょうどそのころに、書店でKotlin Webアプリケーション 新しいサーバサイドプログラミングを見つけて購入し、kotlinでSpring入門することとなりました。 ちなみにサーバサイドkotlinに興味を持ったのは、engineer meeting podcastのvol.104で既にkotlinで書かれたサービスがいくつか動いていることを知ったからです。

Spring Bootとは

Spring Bootを理解するためにSpringは避けて通れない

SpringSpring Frameworkをベースとしたプロジェクトの集合体

From configuration to security, web apps to big data – whatever the infrastructure needs of your application may be, there is a Spring Project to help you build it. Start small and use just what you need – Spring is modular by design.(公式サイトより)

Configurationからセキュリティ、ウェブアプリ、ビッグデータまでアプリケーションのinfrastructureに必要なものはSpringのプロジェクトで用意することができる。Springはモジュールごとに分かれているため、使いたい機能だけを選んで小さく始めることができる。

SpringのベースとなっているSpring Framework

Spring FrameworkはDIコンテナを主に特徴にあげられる様々なレイヤに対するフレームワークコンポーネントの集まり

Core support for dependency injection, transaction management, web applications, data access, messaging, testing and more.(公式サイトより)

Spring Bootの立ち位置

Spring Bootは、Spring Frameworkの持つ設定する項目が多すぎて本来の開発に集中できないという問題点を解決するため、Spring FrameworkにCoCを導入したもの。CoC = Convention over Configurationのこと。「設定より規約」ということで規約どおりなら無駄な設定ファイルを省略できるようにすることで無駄な設定を少なくする。 では、Springにおける設定ファイルとはなにか → Bean(コンテナ内のインスタンス)の設定。

Beanは大きく分けて2種類有る。

Spring Bootでは前者があらかじめ定義済みとなっている。 まとめると以下のような感じ。

Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can "just run". (公式サイトより)

"動かせる"ProductionレベルのSpringをベースとしたアプリケーションを簡単に作ることが出来る。

Spring Initializrとは

Spring Initializrは、Spring Bootの雛形を作ってくれるそう。ビルドツールや言語、バージョンによって変えなければいけない設定などで苦労することがないため、よりスピーディーに開発出来る。
ページ下部の"switch to the full version"を選択することで、パッケージングやJavaのバージョンの選択を行うことが出来る。また、依存ライブラリを一覧から選択することも可能となる。依存ライブラリの中で、赤文字になっているものは、選択しているSpring Bootのバージョンをサポートするバージョンのライブラリが無いこと示している。

入力項目

  • Group : パッケージ名(通例ドメイン名を逆にしたものから始まる)
  • Artifact : プロジェクト名
  • Dependencies : 開発に必要なコンポーネントを選ぶ

Gradleとは

Gradleはビルドツール

ビルドツールは以下のことをやってくれる。Java製アプリを Eclipse から実行したことしかない新人に「ビルドツールとは?」を説明してみる…そして CI へより引用

  • ビルドを構成するタスクを定義し,それを実行する.例えば以下の様なタスクを行う.
    - ソースファイルのコンパイル
    - テストや静的解析の実行,およびその結果のレポート出力
    - リリース用アプリケーションイメージの構築
    
  • ビルドを構成するタスク間の依存関係を管理し,そのタスクのインプットとなる上流タスクの結果やソースコードなどの変更有無からタスク- の実行有無を判断する.
  • ライブラリの依存関係を管理する.(これを行うことに特化した「パッケージマネージャー」というカテゴリに属するツールもあります.有名なのは JavaScript の npm や,RubyRubyGems など.)
  • タスクのインプットとなるファイルを監視し,変更があった場合に自動的にタスクを実行する. (Grunt における watch や,Gradle における continuous build など)

Angular開発におけるwebpack + npm的存在ではないでしょうか。

Gradleの特徴とは

GroovyベースのDSLを用いたビルドスクリプトJavaのビルドツールとしては他にAntやMavenなどが有名ですが、それらはxmlベースのため大きく違う点と言えます。 Groovyは、Javaプラットフォーム上で動作する動的プログラミング言語です。DSLDomain Specific Language(ドメイン固有言語)の略で、メタプログラミングで使われます。 メタプログラミングはロジックを直接コーディングするのではなく,あるパターンをもったロジックを生成する高位ロジックを定義する方法(Wikipediaより)のようです。

Gradle has been counted in the top 20 open-source projects and is trusted by millions of developers to build software for billions of people

LinkedInやNETFLIXなどの大きな企業からも信頼を得ているようです。

Gradleの設定ファイルの構成

Gradleの設定ファイルはbuild.gradleです。 黒べこ本の手順で作成されたbuild.Gradleは以下です。コメントでそれぞれに注釈を付けました。

// build.gradle自体が依存するライブラリの設定を行なっています
buildscript {
    // ext ブロックは変数を定義するためのブロック
    ext {
        kotlinVersion = '1.2.20'
        springBootVersion = '2.0.0.RELEASE'
    }
    // repositories ブロックは依存性を解決する際に、Mavenリポジトリとしてアクセスする先を指定する
    repositories {
        mavenCentral()
    }
    // dependencies ブロックは依存ライブラリを指定するブロック
    dependencies {
        // groupId : artifactId : version
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:${kotlinVersion}")
        classpath("org.jetbrains.kotlin:kotlin-allopen:${kotlinVersion}")
    }
}

// ビルド設定で利用するプラグインの宣言
apply plugin: 'kotlin'
apply plugin: 'kotlin-spring'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'

// プロジェクト自体のバージョンや依存するJavaのバージョン
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = 1.8

// Production Codeのコンパイル
compileKotlin {
    // kotlinOptionsで追加のコンパイルオプションを指定する
    kotlinOptions {
        freeCompilerArgs = ["-Xjsr305=strict"]
        jvmTarget = "1.8"
    }
}
// Test codeのコンパイル
compileTestKotlin {
    kotlinOptions {
        // freeCompilerArgs:追加のコンパイル引数リスト
        // JSR-305 annotation によるNullチェックをErrorとして出力
        freeCompilerArgs = ["-Xjsr305=strict"]
        jvmTarget = "1.8"
    }
}

repositories {
    mavenCentral()
}


dependencies {
    compile('org.springframework.boot:spring-boot-starter-thymeleaf')
    compile('org.springframework.boot:spring-boot-starter-web')
    compile('com.fasterxml.jackson.module:jackson-module-kotlin')
    compile("org.jetbrains.kotlin:kotlin-stdlib-jdk8")
    compile("org.jetbrains.kotlin:kotlin-reflect")
    compile('org.springframework.boot:spring-boot-starter-jdbc')
    compile('org.webjars:bootstrap:4.0.0-2')
    testCompile('org.springframework.boot:spring-boot-starter-test')
    testCompile('org.assertj:assertj-core:3.8.0')
    // runtime:プロダクトのクラスを実行するときに必要になる依存関係
    runtime('com.h2database:h2')
}

次回はSpringの簡単な動きとThymeleafについて整理したいと思います。


参考にさせていただきましたサイト様

Spring Bootの本当の理解ポイント #jjug

第1回 DSLとは?:今そこにある“DSL”|gihyo.jp … 技術評論社

これから始めるSpringのwebアプリケーション

Gradle初心者によるGradle事始め - Qiita

Gradle を始めてみよう - Qiita

Kotlin 1.1.50 is out | Kotlin Blog