Chapter 01

開発する準備を整えよう

あしたば
あしたば
2021.03.26に更新

この章で学ぶこと

SpringBootに関してざっくりとした知識を紹介した後、spring initializrで雛形をダウンロードします。spring initializrを使ったことがあるならば、この章を読む必要はありません。

  • SpringBootを知ろう
  • spring initializrでさくっと雛形を作ろう

SpringBootを知ろう

SpringBootはSpringのProjectの一つとして提供される、Springアプリケーションを必要最低限の形で手間なく動かすことを目的としたフレームワークです。
主にWebアプリケーションの開発に用いられています。

Spring

SpringとはSpring Frameworkを指しています。Spring Frameworkの歴史はそこそこ長く、最初のリリースは2003年頃です。
Spring Frameworkは、DI(依存性注入)やAOP(アスペクト指向プログラミング)といった概念を使ったプログラミングをサポートするフレームワークです。簡単に言うと、より人間にとって管理しやすいコードを書くためのフレームワークです。
その性格上、WebアプリケーションをSpring Frameworkで作る場合は、Spring Framework以外に何らかのWebアプリケーションフレームワークを組み合わせて利用します。

例えば、Webアプリケーションに必要な機能を揃えるSpring Web、DBに関わる諸機能を提供するSpring Dataなど、様々なものをエンジニアが選んで組み合わせ、それぞれ設定する必要がありました。
そのため、Spring Frameworkといえば設定が難解なもの、組み合わせを考えるのが面倒なもの、などといったイメージを抱かれることが多いようです。(私の観測範囲では)

SpringBoot

SpringBootは、そんなSpring Frameworkのイメージを一新しました。
需要の高い機能であるSpringFrameworkの仕組みをコアとして取り入れ、すぐWebで公開可能にするため、Webサーバ(正確には、サーブレットコンテナ)も組み込んでいます。
また、複数あるSpringプロジェクトのフレームワークを簡単に取り込み、設定できたりと、手早く使うための工夫がたくさん実装されています。

このおかげで、どこか古臭い・・・たとえばXMLによる設定だらけになりがちだったJavaのアプリケーションフレームワークから生まれ変わっています。

クイックスタート

さて、知識の話は置いておいて、早速SpringBootを触ってみましょう。
ここでは、公式のクイックスタートガイドの内容を少し詳細に補足しながら引用・紹介します。

spring initializrでさくっと雛形を作ろう

start.spring.ioは、基礎となるSpringBootのプロジェクト構成を自動生成してくれます。(この機能自体は人気のIDE、例えばIntelliJ IDEAやEclipseでもプラグインとしての提供があります)

アクセスすると、次のような画面が表示されます(2021/03/06)。
spring initializr

それぞれの項目に関して抑えておきましょう。

項目

Project

Maven、GradleはそれぞれJavaのプロジェクト管理ツールです。これは、作っているアプリケーションのビルドはもちろん、テストやドキュメントの自動生成、オープンソースの組み込みまでを簡単に管理してくれるスグレモノです。

  • Maven(メイヴン):シンプルなツールで、比較的学習コストが低めです。XMLで記述するため、ある程度直感的に理解することできます。
  • Gradle(グレイドル):Mavenと比較すると、自由度の高い強力なツールです。特に、マルチプロジェクト/マルチモジュールと呼ばれるプロジェクト構成においては、非常に柔軟な記述をサポートしています。ただ、学習コストは高くなりがちであるため最初はMavenをおすすめします。

Language

SpringBootは複数のJVM言語をサポートします。それが、候補に上がっているJava,Kotlin,Groovyです。

  • Java: Javaです
  • Kotlin(コトリン): Androidの開発言語として採用されたため、Javaの後継と認識されていることが多いようです。が、Groovy,Scala,C#の影響のほうが色濃くでています。Javaが採用したくても、そうできない機能をふんだんに盛り込んでいるという点では後継という側面もあるかもしれません。
  • Groovy(グルービー): Java、Kotlinはコンパイルを前提とする静的型付けの言語ですが、GroovyはPHPやRuby、Python等と同様の動的プログラミング言語です。Gradleや色々なツールの設定を書くDSL(domain-specific language)としての採用は多いのですが、アプリケーションに採用される例は少なめです。

SpringBoot

このよくわからない数列はバージョンを指しています。オープンソースはもちろん、社内のアプリケーションであってもそれらはバージョン管理されているのが通例です。アプリケーションでなくとも、古くからオンラインゲームはバージョンアップと言う概念がありますし、近年では家庭用のゲームですらアップデートされるようになりました。この数字は、セマンティック・バージョニングに従ってつけられているSpringBootのバージョンです。

Project Metadata

プロジェクト管理のための詳細情報を表します。

  • Group: 世界の色んな人がOSSを公開しています。Javaはパッケージ名によってimportするものを識別しますから、同じパッケージ名のものが溢れると混乱を招きます。通例として、Groupは自分の持っているドメインの をもとに入力します。例えば、YahooならXXX.jp.co.yahooです。今回は世界に公開しませんので好きにして構いません。

https://qiita.com/bigwheel/items/aa46c83897d8bd4d07da
  • Artifact: そのプロジェクトの識別名です。SpringBootをビルドすると、最終的にはJVMで実行可能なjarと呼ばれる形式のファイルが作成されますが、Artifactはその名前を示します。一般に英語で入力します。
  • Name:アプリケーションクラス名に利用されます。そのため、一般に英語で入力します。例えば、my-appと入力すればMyAppApplicationになります。
  • Description: プロジェクトの説明です。
  • Package name: このプロジェクトのルートとなるパッケージ名です。半角英数字と、ドット(.)だけで記述するのが通例です。

Packaging

プロジェクトの最終成果物の形式を選びます。

  • jar: javaのクラスファイルなどを含んだ、そのプロジェクトを実行可能な状態にまとめた圧縮ファイルです。(実態はzipファイルです)
  • war: jarに加え、Webアプリケーションサーバで実行するために必要なものを付加した圧縮ファイルです。HTMLファイルなども従来はwarに含めるものでしたが、SpringBootはHTMLも含めてjarに内包できてしまいます。SpringBootにおいては、組み込みのサーブレットコンテナではなく、別のサーブレットコンテナで実行したい場合に選ぶべき選択肢です。

Java(選んだ言語のバージョン選択)

Javaのバージョンを選択します。2021/03現在では11が無難な選択肢です。

Dependencies

依存関係と訳されます。開発するプロジェクトにおいて、どのようなライブラリを用いて開発するかを選んでおきます。
ここで選べるのは、SpringBootでの開発における代表的なものだけになります。また、後で追加することもできるので、深く考える必要はありません。
今回選ぶ依存関係に関しては以下で補足します。

生成

依存関係は以下になります。ADD DEPENDENCIES...ボタンを押して検索し、追加していきます。

  • 開発に必要なもの
    • Spring Web: Webアプリケーション開発のための機能。
    • Thymeleaf: テンプレートエンジンとも呼ばれる。Javaで動的なHTMLを扱うための機能。
  • 開発サポート関連
    • SpringBootDevTool: デバッグ時のサポートを行ってくれるツール
    • Lombok: アノテーションと呼ばれる仕組みを使ってコードの記述を簡単にしてくれるツール
    • SpringConfigrationProcessor: IDEと独自コンフィグファイルの連携を取りやすくするためのツール。

すべての項目を入力し、Dependenciesを追加したらGENERATEボタンを押します。そうすると、zipアーカイブファイルがダウンロードされます。これで、プロジェクトの雛形を手に入れることができました。

関連リンク

フレームワークに関する情報はインターネットにたくさん転がっていますが、まずは公式を頼る事が重要です。多くのフレームワークは英語で情報発信されていますが、DeepLやGoogle翻訳があれば何となく読めるはずです。

[付録]解説なく登場し、今後も解説の予定がない用語

字体で重要度を示す。いずれも、現段階で理解する必要はない。

  • 重要ではない
  • そこそこ重要
  • 重要

一覧

  • A->Z
    • AOP: Aspect Oriented Programming. 「Aspect Oriented」とは、横断的な関心事を指す。ログインに必要なセッション判定や、ログ出力といった共通の機能を部品としてアプリケーションから分離し、必要な箇所で簡単に利用できるようにする仕組み。
    • DB(Database): 一般にRDBMSを指す。データを保存し、あるデータとデータに関連付けをもたせて管理することのできるシステム。WebサービスやWebアプリケーションのほとんどは、このDBに何を保存し、何をどう取得するかという概念が中心にある。
    • DI(Dependency Injection): 依存性注入と訳される。コンポーネント(クラス)間の依存関係をソースコードから排除するための仕組み。 例えば、「領収書」データを保存しようとするとき、その保存方法は「DBに保存する」、「ファイルに保存する」、「FAX送信する」といった具体的な処理を気にせずプログラミングすることをサポートする。(保存するというインタフェースを使ってプログラミングすることができるという話)
    • Servler(サーブレット): Webに係る処理を行うJavaプログラム、またはその仕様そのもの。サーブレットコンテナはサーブレットを動作させるためのアプリケーション。
    • Web(World Wide Web): インターネットから情報を得る仕組みそのものを指す。
    • Webアプリケーション: インターネットを介して利用する(つまり、Web技術を利用した)アプリケーションのこと
    • Webサーバ: ある取り決め(プロトコル)に則って何らかのサービスを提供する概念。文脈によってコンピュータなのか、サーバ・ソフトウェアなのかは異なる。
      取り決めの例としては、例えば、URLの先頭にくっついているhttpやhttpsは、HyperText Transfer Protocolと呼ばれるプロトコルである。
    • XML(Extensible Markup Language): 人が読むためではなく、プログラムで扱いやすいように作られたマークアップ言語のひとつ。任意の用途に向けた拡張性に優れる。Javaにおいてはフレームワーク向けの環境設定ファイルとして嫌われている(私の観測範囲では)。