春が来たので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は避けて通れない
SpringはSpring 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種類有る。
- フレームワークを動かすBean
- アプリを構成するBean
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のバージョンをサポートするバージョンのライブラリが無いこと示している。
入力項目
Gradleとは
Gradleはビルドツール
ビルドツールは以下のことをやってくれる。Java製アプリを Eclipse から実行したことしかない新人に「ビルドツールとは?」を説明してみる…そして CI へより引用
- ビルドを構成するタスクを定義し,それを実行する.例えば以下の様なタスクを行う.
- ソースファイルのコンパイル - テストや静的解析の実行,およびその結果のレポート出力 - リリース用アプリケーションイメージの構築
- ビルドを構成するタスク間の依存関係を管理し,そのタスクのインプットとなる上流タスクの結果やソースコードなどの変更有無からタスク- の実行有無を判断する.
- ライブラリの依存関係を管理する.(これを行うことに特化した「パッケージマネージャー」というカテゴリに属するツールもあります.有名なのは JavaScript の npm や,Ruby の RubyGems など.)
- タスクのインプットとなるファイルを監視し,変更があった場合に自動的にタスクを実行する. (Grunt における watch や,Gradle における continuous build など)
Angular開発におけるwebpack + npm的存在ではないでしょうか。
Gradleの特徴とは
GroovyベースのDSLを用いたビルドスクリプト。Javaのビルドツールとしては他にAntやMavenなどが有名ですが、それらはxmlベースのため大きく違う点と言えます。 Groovyは、Javaプラットフォーム上で動作する動的プログラミング言語です。DSLはDomain 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について整理したいと思います。
参考にさせていただきましたサイト様