springの再入門 - eclipseでスタート


## eclipseの設置

### 入手方法

* 本家やミラサイトからダウンロードして設置する。
* homebrewで設置する。

### 設置

__本家やミラサイトからダウンロードして設置__
[ここ](https://eclipse.org/downloads/)から「Eclipse IDE for Java EE Developers」をダウンロードして圧縮を解凍すれば設置が終わる。

```
% tar zxf eclipse-jee-mars-2-macosx-cocoa-x86_64.tar.gz -C ~/Applications/
```

本家サイトよりミラサイトやメンバーサイトのほうが早いので、そちらのサイトからダウンロードすることを推奨する。

![install_eclipse.png](https://qiita-image-store.s3.amazonaws.com/0/93752/af3f1f91-bc27-2988-d27e-39d9970f5c25.png "install_eclipse.png")

![install_eclipse_download.png](https://qiita-image-store.s3.amazonaws.com/0/93752/3ee13f3e-9517-12f8-a99a-352f92beceff.png "install_eclipse_download.png")

__homebrewで設置__
homebrewで設置する場合、brewで管理することができるので便利だが時間が掛かりすぎる。
ミラサイトからダウンロードして設置することを推奨するが、homebrewの設置方法も一応書いておく。

brew caskからeclipseで検索してみるといろんなものが出てくる。
eclipseはプラットフォームであり、言語ことにプラグインを設置することによってその言語の開発環境が用意される。
eclipse-jeeかeclipse-php、eclipse-javaのいずれか設置すればいいだろう。
因みにeclipse-jeeはjava eeの開発環境、eclipse-phpはphpの開発環境、eclipse-javaはjava seの開発環境がデフォルトでeclipseに組み込まれている。
ここではeclipse-jeeで設置する。

```
% brew cask search eclipse
==> Partial matches
eclipse-cpp	    eclipse-installer	eclipse-jee	    eclipse-php		eclipse-ptp	    nodeclipse
eclipse-ide	    eclipse-java	eclipse-modeling    eclipse-platform	eclipse-rcp

% brew cask install eclipse-jee
```

当然な話だが、eclipseはjavaアプリケーションなので、jdkやjreが設置されていない場合は動作しない。
設置されていない人はbrewでjavaを設置する。

```
% brew cask install java
```

## STS（Spring Tool Suite）

* eclipseをベースにしたspring frameworkを利用するための専用開発ツール
* ようするにeclipseをベースにしてSTSというプラグインを設置すればspringの開発環境が用意されるわけだ。
* 最近のeclipse（マース）では従来のプラグイン設置方法（install new software）以外にmarketplaceというものを提供していて大きなプラグインの設置がもっと容易になっている。

メニューからHelp > Eclipse Marketplace...順で選択する。
Eclipse Marketplaceからstsを入力して検索する。
Spring Tool Suiteのところの「install」ボタンをクリックする。
![install_sts_01.png](https://qiita-image-store.s3.amazonaws.com/0/93752/1737c817-c9c5-4cb9-8008-b94b55269099.png "install_sts_01.png")

Confirm Selected Featuresから全て選択された状態で「Confirm」ボタンをクリックする。
![install_sts_02.png](https://qiita-image-store.s3.amazonaws.com/0/93752/bff3e7af-b486-e935-723a-33ed71b28a0a.png "install_sts_02.png")

ライセンス画面から同意にチェックして「Finish」ボタンをクリックする。
![install_sts_03.png](https://qiita-image-store.s3.amazonaws.com/0/93752/ac84138b-3ba3-9ea3-cced-415cc8efb143.png "install_sts_03.png")

設置が終わったら「Yes」ボタンをクリックしてeclipseを再起動する。
![install_sts_04.png](https://qiita-image-store.s3.amazonaws.com/0/93752/bd84473c-43c1-d072-b7f3-93d6561c3d0f.png "install_sts_04.png")

再起動された画面からSpring関連内容が表れば問題なし。
![eclipse_sts.png](https://qiita-image-store.s3.amazonaws.com/0/93752/7b2f4a78-7e74-307b-f52e-476e43095b6e.png "eclipse_sts.png")

## プロジェクトの生成

* perspectiveをspringに切り替える。
* eclipseからspringの新規プロジェクトを生成する方法としてspring legacy projectとspring starter projectがある。
* spring legacy projectはspring frameworkを利用する従来の方法でプロジェクトを生成する。
* spring starter projectはspring bootを利用する新しい方法でプロジェクトを生成する。

### spring legacy project

Perspectiveをspringに切り替えてPackage Explorerからマウス右ボタンをクリックする。そして、spring legacy projectを選択する。
![create_project_01.png](https://qiita-image-store.s3.amazonaws.com/0/93752/95ca84fd-9fef-a55f-928a-fc7660a0c66f.png "create_project_01.png")

Project nameでは「FirstWebApp」と入力してTemplatesからは「Simple Spring Web Maven」を選択した後「Finish」ボタンをクリックする。
![create_project_02.png](https://qiita-image-store.s3.amazonaws.com/0/93752/8ede5d88-eec9-3a0f-c8a9-ad51b48e8ea4.png "create_project_02.png")

ビルドツールとしてmavenを使う場合のディレクトリ構成は次のようになる。
![create_project_03.png](https://qiita-image-store.s3.amazonaws.com/0/93752/136eceef-736f-ed0c-1d9b-74c092738a63.png "create_project_03.png")

javaはコンパイルが必要なので、antやmavenのようなビルドツールで作業が終わる度にビルドする必要がある。
プロジェクトを選択してマウス右ボタンクリック > Maven > Update project...順で選択するか、alt + F5キーを押せば「Update Maven Project」が表れる。そのまま「OK」ボタンを押してビルドする。

これでspring legacy projectは用意されたが、これを確認するためにはアプリケーションサーバを用意して関連プロジェクトを追加する必要がある。

### Pivotal tc Server Developer Editionを設置

* spring frameworkではtomcatではなくPivotal tc Serverというアプリケーションサーバを使うらしい。
* Pivotal tc Serverはhomebrewでインストールができる。
* [ここ](http://tcserver.docs.pivotal.io/docs-tcserver/topics/install-getting-started.html#topic_yxk_sp4_gn)を参考にした。

```
% brew update
% brew tap pivotal/tap
% brew install tcserver
```

homebrewでPivotal tc Serverの設置が終わったらeclipseに該当サーバを登録する。
![add_tcserver_01.png](https://qiita-image-store.s3.amazonaws.com/0/93752/09cf9fce-65e4-fb1a-24f6-c4c64807ff7c.png "add_tcserver_01.png")

Installation directoryから先ほど設置したPivotal tc Serverのlibexecのパスを入力して、「Next」ボタンをクリックする。
![add_tcserver_02.png](https://qiita-image-store.s3.amazonaws.com/0/93752/675399cb-e272-fdd6-33d3-0508fdaeb8f6.png "add_tcserver_02.png")

tc Server Configurationから「Create new instance」をチェックして「Next」ボタンをクリックする。
![add_tcserver_03.png](https://qiita-image-store.s3.amazonaws.com/0/93752/864cf864-2256-dd60-e29d-d40d1202cf61.png "add_tcserver_03.png")

Create tc Server InstanceからNameに適当な名称を、Templatesでは「base」にチェックして「Finish」ボタンをクリックする。
![add_tcserver_04.png](https://qiita-image-store.s3.amazonaws.com/0/93752/fdb8b8c6-dfc9-4196-0e25-e37fae64e21e.png "add_tcserver_04.png")

登録したサーバを確認しよう。
![add_tcserver_05.png](https://qiita-image-store.s3.amazonaws.com/0/93752/17656721-f79b-a6b5-9085-c924740f6723.png "add_tcserver_05.png")

### サーバへリソースを追加

登録したサーバを選択してマウスの右ボタンをクリックし「Add and Remove...」を選択する。
![add_tcserver_06.png](https://qiita-image-store.s3.amazonaws.com/0/93752/8f7f0755-954a-170b-71e8-dc5eadfc89c2.png "add_tcserver_06.png")

「FirstWebApp」を選択して「Add」ボタンをクリックすると左辺から右辺へ「FirstWebApp」が移動する。
![add_tcserver_07.png](https://qiita-image-store.s3.amazonaws.com/0/93752/20d9c05e-2109-90ff-8ffe-363ab2c42b9a.png "add_tcserver_07.png")

「finish」ボタンをクリックするとサーバへ「FirstWebApp」リソースが追加される。
![add_tcserver_08.png](https://qiita-image-store.s3.amazonaws.com/0/93752/f7dbb9a3-4b82-a856-ac66-9c8e6d50ea6c.png "add_tcserver_08.png")

サーバを起動する。緑のプレイボタンを押せばサーバが起動される。赤い停止ボタンを押せばサーバが停止される。
![add_tcserver_09.png](https://qiita-image-store.s3.amazonaws.com/0/93752/4e3439b0-1b60-fa56-619d-1d9995bbc3dc.png "add_tcserver_09.png")

ブラウザを開き下記のURLで確認する。
「Click to enter」というリンクが表れば問題なし。

```
http://localhost:8080/FirstWebApp
```

### spring starter project

* spring bootを利用する形でプロジェクトが生成される。
* spring bootはプロジェクト内にアプリケーションサーバが組み込まれていてspring legacy projectのようにサーバを登録してリソースを追加する必要はない。

Package Explorerからマウス右ボタンをクリック > New > Spring Starter Project順で選択する。
![spring_boot_01.png](https://qiita-image-store.s3.amazonaws.com/0/93752/ea0a4e74-3545-14a3-4c22-2ad926933bb1.png "spring_boot_01.png")

Nameには「SecondWepApp」を入力して「Next」ボタンをクリックする。
![spring_boot_02.png](https://qiita-image-store.s3.amazonaws.com/0/93752/1d425354-825a-6134-6e6e-6db650e55542.png "spring_boot_02.png")

DependenciesでWebを開いて「Web」だけチェックし「Finish」ボタンをクリックする。
![spring_boot_03.png](https://qiita-image-store.s3.amazonaws.com/0/93752/ac03e47e-a1c7-1d1c-e24f-54faf556a8fb.png "spring_boot_03.png")

これでSpring Bootのプロジェクトが生成された。
クラスを1個作って確認してみよう。
Package Explorerから「SecondWebApp」を選択してマウス右ボタンをクリック > 「New」 > 「Class」順で選択する。
![spring_boot_04.png](https://qiita-image-store.s3.amazonaws.com/0/93752/c869425a-c80c-1696-e859-b6ebe9f68da2.png "spring_boot_04.png")

Nameには「HelloController」を入力して「Finish」ボタンをクリックする。
![spring_boot_05.png](https://qiita-image-store.s3.amazonaws.com/0/93752/4c523b96-9f77-c053-2614-c999c531ae23.png "spring_boot_05.png")

HelloController.javaファイルを開いて次の内容を入力する。

```java
package com.example;

@RestController
public class HelloController {

	@RequestMapping("/")
	public String index() {
		return "Hello Spring Boot!";
	}
}
```

赤い✖︎が表示されるが気にするな。
![spring_boot_06.png](https://qiita-image-store.s3.amazonaws.com/0/93752/3ab65d3b-cd31-0e63-36db-a5e87d3de924.png "spring_boot_06.png")

command + shift + o を押すと必要なクラスが自動でimportされる。赤い✖︎表示は消えているはずだ。（eclipseでは頻繁に使うショートカットキーなので覚えておく）
![spring_boot_07.png](https://qiita-image-store.s3.amazonaws.com/0/93752/fbea7669-3cf9-c653-fdbf-d357a47a8fb9.png "spring_boot_07.png")

プロジェクトを選択して緑のプレイバタンをクリック > Run As > Spring Boot App順で選択する。アプリケーションサーバが立ち上がる。
![spring_boot_08.png](https://qiita-image-store.s3.amazonaws.com/0/93752/2e6c12bb-ad73-b1e5-440b-40e78fac2292.png "spring_boot_08.png")

ブラウザから確認する。
Hello Spring Boot!が表れたら成功！

```
http://localhost:8080/
```

![spring_boot_09.png](https://qiita-image-store.s3.amazonaws.com/0/93752/2437fb72-df85-c044-80df-7f4fc52a7a1c.png "spring_boot_09.png")

## アノテーションを使ってURLをマッピング

RESTfulなアプリケーションを作るためにはルート情報（URLマッピング）を設定ファイルに記述する必要がある。ruby on railsの場合はconfig/routes.rbファイルに記述する。しかし、spring bootでは設定ファイルが存在しない。アノテーションがその役割を果たしている。
クラスやメソッドが始まる前にある@RestControllerと@RequestMappingがアノテーションだ。@RestControllerはRESTfulなアプリケーションを構築するために用意されているクラスでクラスの前にこれを付けておくとそのクラスはRESTfulなクラスになる。そして、@RequestMappingは引数で渡されたURLにメソッドの処理結果をマッピングする。