Scala + PlayFramework + ScalikeJDBC + Flyway + (Scala-logging) on Heroku + PostgreSQL

この記事は[「Scala Advent Calendar 2014」](http://qiita.com/advent-calendar/2014/scala "Scala Advent Calendar 2014")の8日目の記事になります。

少々推敲できていませんが、お気づきの点があればコメントなどいただけると嬉しいです・・・。

## 概要
Scalaを利用して個人的に開発効率の高そうな組み合わせ（個人的な好み含む）の骨組みの作り方を記述します。
ごく一般的なWebアプリケーションを作成する際に利用できるかと。

## はじめに
事前に以下のものがインストールされ、パスが通っていること。

- Typesafe Activator
- git（herokuを利用する場合）
- heroku toolbelt (herokuを利用する場合）

## テンプレート作成

### Activator UI の起動

※ 以下Windows想定ですが、Linux、Macでもほぼ同じように実行できるかと思います。  
以下を実行し、activator uiを起動する  

```shell-session
activator ui
````

### Playのプロジェクトを作成する

`Play Scala Seed`を選択し、保存先を選択し、`create`を押下しプロジェクトを作成する。
だーっとログが流れますのでじっと待ちましょう。。。

画面が遷移したらプロジェクト作成完了です。

### ScalikeJDBC の依存関係を追加する

#### build.sbtに以下を追加する

```scala
"org.scalikejdbc"  %%  "scalikejdbc"  %  "2.2.0",
"org.scalikejdbc"  %%  "scalikejdbc-play-plugin"  %  "2.3.4",
"org.scalikejdbc"  %%  "scalikejdbc-play-fixture-plugin"  %  "2.3.4", // optional
"com.h2database"  %	"h2"  %  "1.4.182"
```

### Flyway の依存関係を追加する

#### build.sbtに以下を追加する。

```scala
"com.github.tototoshi"  %%  "play-flyway"  %  "1.1.3"
```

### Scala-Logging の依存関係を追加する。

#### build.sbtに以下を追加する。

```scala
"com.typesafe.scala-logging"  %%  "scala-logging"  %  "3.1.0",
"org.slf4j"  %  "slf4j-api"  %  "1.7.7",
"ch.qos.logback"  %  "logback-classic"  %  "1.1.2"
```

### PostgreSQL の依存関係を追加する

#### build.sbtに以下を追加する

```scala
"org.postgresql"  %  "postgresql"  %  "9.3-1102-jdbc41"
```

##### ここまで追加したbuild.sbtは以下の様なイメージになります

```scala
(snip)
libraryDependencies ++= Seq(
  jdbc,
  anorm,
  cache,
  ws
)

libraryDependencies ++= (Seq(
  "org.postgresql"  %  "postgresql"  %  "9.3-1102-jdbc41"
) ++ Seq( // scalikeJDBC
  "org.scalikejdbc"  %%  "scalikejdbc"  %  "2.2.0",
  "org.scalikejdbc"  %%  "scalikejdbc-play-plugin"  %  "2.3.4",
  "org.scalikejdbc"  %%  "scalikejdbc-play-fixture-plugin"  %	"2.3.4", // optional
  "com.h2database"  %  "h2"  %  "1.4.182"
) ++ Seq( // flyway
  "com.github.tototoshi"  %%  "play-flyway"  %  "1.1.2"
) ++ Seq( // scala-logging
  "com.typesafe.scala-logging"  %%  "scala-logging"  %  "3.1.0",
  "org.slf4j"  %  "slf4j-api"  %  "1.7.7",
  "ch.qos.logback"  %  "logback-classic"  %  "1.1.2"
))
```

### application.confの修正

#### アプリケーションのlangの変更

```properties
application.langs="en"
    ↓
application.langs="ja"
```

#### 開発時はh2dbを利用するための設定

```properties
db.default.driver=org.h2.Driver # DEV
db.default.url="jdbc:h2:mem:play;MODE=PostgreSQL;DB_CLOSE_DELAY=-1" # DEV
db.default.user="" # DEV
db.default.password="" # DEV

db.default.user=${?DB_USER}
db.default.password=${?DB_PASS}
````

#### evolution pluginの無効化

```properties
evolutionplugin=disabled
```

#### 標準のdbpluginの無効化

```properties
dbplugin=disabled
```

#### Flywayのmigration設定

```properties
db.default.migration.validateOnMigrate=false // true by default
db.default.migration.initOnMigrate=true
db.default.migration.auto=true
```

### flywayのマイグレーション用sqlファイルの配置

/conf/db/migration/default 配下にsqlファイルを配置する。

#### 例）V0.0.1__first_create.sql のようなファイルを配置

```sql
-- members
create table members (
  id serial not null primary key, 
  name varchar(64), 
  created_at timestamp not null
);
```

### play.pluginsの作成

ファイル内は以下のように記述します

```scala
1000:com.github.tototoshi.play2.flyway.Plugin

10500:scalikejdbc.PlayPlugin

11000:scalikejdbc.PlayFixturePlugin
```

### アプリケーションをgitにコミットする

```shell-session
git init
git add .
git commit -m "init"
```

### Heroku 上で新規アプリケーションを作成する

```shell-session
heroku create {appname}
```

### Heroku 上へpushする

```shell-session
git push heroku master
````

### アプリケーションへアクセスする

以下のURLでアクセスする

```
https://{appname}.herokuapp.com/
```


おめでとうございます。
表示できましたね！！！


## おまけ

### eclispeのプロジェクトとして認識させる

プロジェクトのディレクトリにコマンドプロンプトで移動し、以下のコマンドを実行する。  

```shell-session
activator.bat
> eclipse with-source=true
```