Play de アプリ開発 ~PlayFrameworkの環境構築をしてみよう~

## 「Scalaの学習も兼ねてPlayFrameworkでアプリを作ってみよう」
この度腰を据えてScalaとPlayFrameworkに触ることにしました。
PlayFrameworkはJavaでも使うことができますが、やはりScalaで用いられることが多いですね(Springという強者がすでにおりますし...)。
過去に業務で旧バージョン(1.x)を使っていたことがあるのだが、Javaでは主流のServletを使わなかったりホットリロードがあったりとそんなところが当初の私には魅力的でした。
現行バージョン(2.x)にマイグレーションしようと試みましたが、アーキテクチャーが大きく異なるため断念。いつか使いこなせるようになってやるという思いを胸に秘めておりましたが、そのチャンスが訪れなかったので今回意を決して独自で触ることにしました。
どうせ触るならせっかくだしScalaで開発をしていこうと思い、Scalaも初挑戦です。

## 動作環境
OS: macOS Mojave(10.14.6)
javaSE: 1.9
PlayFramework: 2.7.3

## 環境構築
始めるためにはまずは環境構築が必要です。
Playのメリットは手軽に始められることだと言われていますが、果たしてどれだけ手軽に環境構築ができるのか？
実際にやってみました。
なお環境構築はJava版でも同様の手順で行えます。


### 1. サンプルプロジェクトのダウンロード
PlayFramework(v2.7)のサンプルプロジェクトを[公式HP](https://www.playframework.com/documentation/2.7.x/LearningExamples)からダウンロードする。
サンプルプロジェクトはJava版とscala版があるので使う方をダウンロードすること。私はScala版を選択。
Playではsbtというビルドツールを使用しているが、sbtをインストールしなくてもすでにサンプルプロジェクトの中に組み込まれているため、サンプルプロジェクトのパスにて

```bash
./sbt run
```
と入力するだけで始められることができるとのこと。

ただ私の場合は実行したら

```bash
./sbt: Permission denied
./sbt-dist/bin/sbt: Permission denied
```
と拒否されてしまった。
確認したら実行権限が付与されていなかったので、

```bash
sudo chmod 700 sbt
sudo chmod 700 ./sbt-dist/bin/sbt
```
と入力して実行権限を付与して再度実行。するとビルドが開始された。
ビルドが完了するのに15分ほどかかったが、完了後`localhost:9000`にアクセスすると、チュートリアルが起動された。


### MySQLのインストール
アプリ開発にあたってデータベースは必須とも言えるだろう。
Playですぐに使うなら`H2DB`だが、実用性を考慮して今回は`MySQL`を導入する。
https://dev.mysql.com/downloads/ からインストールして`3306`ポートを使用する。
本記事とは趣旨が異なるためインストール手順は割愛。

### データベースの接続
MySQLのインストールが終わったら今度はPlayFrameworkがデータベースを使用するために設定を行わなければならない。

公式に記載の手順に従って`build.sbt`に以下を追記した。

```build.sbt
libraryDependencies += jdbc
libraryDependencies += "mysql" % "mysql-connector-java" % "【使用するMySQLバージョン】"
```

同様に`application.conf`にも以下を追記。

```application.conf
# Default database configuration using MySQL database engine
db.default.driver=com.mysql.jdbc.Driver
db.default.url="jdbc:mysql://localhost/【DB名】"
db.default.username=【ユーザー名】
db.default.password="【パスワード】"
```

そういえばまだデータベースを用意していなかったのでまずはデータベースの作成をしておこう。
`MySQL Workbench`で`localhost:3306`にアクセスして以下のクエリを実行した。

```sql
CREATE DATABASE 【DB名】
```

これで接続の準備が整った。


### （任意）Evolutionsの使用
PlayFrameworkには`Evolutions`と呼ばれる機能がある。
この設定をすることで、PlayFrameworkを起動するとテーブルの追加・削除やデータの挿入が行える。
以下の順番で実行した。

まずは`build.sbt`に以下を追記する。

```build.sbt
libraryDependencies += evolutions
```

Evolutionsを使う際は以下のようなディレクトリ構成にする必要がある。

```
conf 
 └ evolutions 
　　└ default
　　　　└ 1.sql
　　　　└ 2.sql
```

`1.sql`というファイル名を作成し、その中にEvolutionsで実行したいクエリを書く。
以下のように記載する。

```1.sql
# --- !Ups
CREATE TABLE user (
    id bigint auto_increment primary key,
    email varchar(255) not null,
    password varchar(255) not null,
    fullname varchar(255) not null,
    isAdmin boolean not null
);
INSERT INTO user VALUES (default, "ヒロロ",27, "hiroro@example.com");

# --- !Downs
drop table user
```

`# --- !Ups`にはEvolutionで作成、追加するもの、`# --- !Downs`はEvolutionで削除するものを記載する。
先に`Downs`が実行され、次に`Ups`が実行される。

開発が進むにつれてマスターを追加する必要がある場合には、`2.sql`, `3.sql`とファイルを追加してそこに記載すれば良い。
Evolutionsは数字の順番に従って実行される。

記載が終了したら`./sbt run`でアプリを起動する。
すると以下のような画面が表示される。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/412663/04262a46-739d-567c-3d04-d7c15d79f1db.png)

`Apply this script now!`をクリックするとスクリプトが実行されてDBにテーブルが作成される。

##### Evolutionsを使わずに手動でクエリを実行する方法でも問題はないが、チーム開発を考えると各自が自身の環境にマスターやサンプルデータを手動で対応するよりもEvolutionsを使った方が対応漏れが減り、スムーズに開発に着手できると思う。


## まとめ
環境構築自体はサンプルプロジェクトのダウンロードをするだけで特に他は何も意識しなくてもできるので確かに手軽でした。
また、公式サイトにドキュメントが豊富に取り揃えてあり、Evolutionsに関しても[ここ](https://www.playframework.com/documentation/2.7.x/Evolutions#Managing-database-evolutions)に丁寧に記載があったので助かりました。
強いていうなら日本語のドキュメントが最新版に更新されていないのが英語読めない人にとってはネックかな。

とはいえこれはあくまで準備段階。公式をさっと眺めた限り、これから開発を進めるにあたり色々知らないといけないことが多いから実際に進めながらその都度整理していこうと思います。