[Groovy]RatpackでシンプルなWEBアプリケーションを開発する -インストール&Hello World-

これはG* Advent Calendar 2015の3日目の記事です。

# Ratpackってなに？
GroovyのWEBフレームワークといえばGrailsですが、Ratpackも同様にGroovyで利用できるWEBフレームワークです。
しかし、Grailsとは方向性が違い、かなりシンプルな、モダンなWEBフレームワークを目指しているようです。
Nettyベースなので標準でWebソケットを使ったリアルタイムチャットなども構築できるようです。
今回は、リアルタイムチャットとかそういう細かい話は抜きにして、単純にHTTPをリクエストが合ったらリクエストを返すという基本を書いてみたいと思います。
Ratpack、かなりお手軽です。

# 準備
1. [SDKMAN](http://sdkman.io/)をインストールします。
2. sdkmanを使ってGradleをインストールします。(`sdk install gradle 2.8`)
3. 以上！

# Ratpackの初回準備
RatpackはGradle経由でインストール、実行させます。とってもモダンです！

まず、適当なディレクトリにプロジェクトディレクトリを作成します。
私は今回、`advent2015`というディレクトリを作成しました。

次に、必要最低限なディレクトリを作成します。
`mkdir -p src/ratpack`
これでsrcとその配下にratpackという2つのディレクトリが作成されました。

続いて`src/ratpack/ratpack.groovy`というファイルを作成します。Ratpackは自動的にこのファイルを読み込んで実行してくれます。
中身は以下のとおりです。

```groovy:src/ratpack/ratpack.groovy
import static ratpack.groovy.Groovy.ratpack
ratpack {
    handlers {
        get {
            render "Hello Ratpack"
        }
    }
}
```

「おいおい、LazyBonesっていう最適なディレクトリを作ってくれる便利なツールがあるんだぜ？」と思われるかもしれませんが、個人的には最初はこのレベルのディレクトリ構成であれば手動で作ってしまったほうが、全体の構成が掴めて宜しいのではないかと思います。
Grailsレベルになるとさすがに全部手動で作成するのは辛いですが。。。
その点からもRatpackのシンプルさが伺えますね！

最後に、プロジェクトトップ（私の場合は`advent2015`）に`build.gradle`を作成し、ファイルの中身を以下のようにします。

```groovy:build.gradle
buildscript {
  repositories {
    jcenter()
  }
  dependencies {
    classpath "io.ratpack:ratpack-gradle:1.1.1"
  }
}

apply plugin: "io.ratpack.ratpack-groovy"
apply plugin: "idea"

repositories {
  jcenter()
}

dependencies {
  runtime "org.slf4j:slf4j-simple:1.7.12"
}
```

コレで準備完了です！
現在、ディレクトリ構成は以下のようになっているはずです。

```bash
[koji:advent2015]$ tree
.
├── build.gradle
└── src
    └── ratpack
        └── ratpack.groovy

2 directories, 2 files
[koji:advent2015]$ 
```

# Ratpackの実行
それでは実行してみましょう！
実行もお手軽！Gradle経由なので以下のコマンドをプロジェクトトップで実行するだけです。

`gradle run`

初回は依存するライブラリのダウンロードが入ったりするので恐らくちょっと時間がかかると思います。
しばらくするとコンソールに以下のような内容が出力されるはずです。

```
[main] INFO ratpack.server.RatpackServer - Starting server...
[main] INFO ratpack.server.RatpackServer - Building registry...
[main] INFO ratpack.server.RatpackServer - Ratpack started (development) for http://localhost:5050
> Building 83% > :run
```

動いてるっぽいですね？
では、ブラウザで[http://localhost:5050](http://localhost:5050)にアクセスしてみましょう！

**Hello Ratpack**と表示されましたね！こんなにお手軽にWEBアプリケーションが作れるんですね。。。
なお、アプリケーションの終了はGradleなので`ctrl-c`でOKです。
では一旦終了してみましょう。
.
.
.

終了しましたか？
では今度は`-t`オプションを使って再度Ratpackを起動して、ブラウザで[http://localhost:5050](http://localhost:5050)にアクセスしてみてください。

`gradle run -t`

動いていますか？
ではこの状態で、`src/ratpack/ratpack.groovy`の中身を変更してみます。

```groovy:src/ratpack/ratpack.groovy
import static ratpack.groovy.Groovy.ratpack
ratpack {
    handlers {
        get {
            render "Hello Ratpack!! Groovy's Version: ${GroovySystem.version}"
        }
    }
}
```

このファイルを普通に保存して、再度[http://localhost:5050](http://localhost:5050)にアクセスしてみてください。
なんと！動的にちゃんと変更が反映されました！Gradle凄い！
今回`-t`をつけてGradleからRatopackを起動しましたが、この`-t`がその動的な再読み込みの指定になります。

なお、先ほどの修正で、画面にGroovyのバージョンが表示されているはずです。
もしかしたら「あれ？自分がインストールしているGroovyのバージョンと違うぞ？」と思われる方も居るかもしれません。
実は、Ratpackが自分が実行するのに必要なGroovyも依存関係としてGradleが自動的にダウンロード&設定してくれているのです！

RatpackはシンプルなWEBアプリケーションの為に凄く合っているのではないかと思います。
GrailsはGrailsでオールインワンでGORMなどの非常に強力な機能がついています。
どちらかがどちらかを駆逐するのではなくて、方向性が全く異なる２つのフレームワークなので、ようは使い分けという感じですね。

またお前かよという感じですが、明日は引き続きRatpackでHTTPルーティングの方法を投稿する予定です。

# 参考
[Ratpack](https://ratpack.io/)
[Ratpackについて(前編)](http://grimrose.bitbucket.org/blog/html/2014/12/06/g_advent_calendar_2014_ratpack_01.html)
[Ratpackについて(後編)](http://grimrose.bitbucket.org/blog/html/2014/12/07/g_advent_calendar_2014_ratpack_02.html)
[Ratpackについて(延長戦)](http://grimrose.bitbucket.org/blog/html/2014/12/31/g_advent_calendar_2014_ratpack_overtime.html)