【Scala】 playframework2.5とslick3でwebサーバを書いた話

目次

  1. なぜこんなことをした!言え!
  2. どこで使い方を習った
  3. 今までの(play slick)とは違うよ!
    1. DI(Dependencies Injection)
    2. さよならDBAction 未来を信じて
    3. 欲しかった安心は手に入った?
      1. 運用してみて(2016/05/31追記)
    4. 使えるの?
    5. リンク
  • タイトルの通り

なぜこんなことをした!言え!

  • Fate/EXTRAで敵のパターンをテキストに記録し続けるのが億劫になってきたから
  • ブラウザ上でポチポチしてパターンを記録したり絞り込んだりできる奴作ろうと思って
  • nodejs辺りでさくっとやっても良かったが、DB周りが不安だったので、過去にやったことのあるplay slickで

どこで使い方を習った

  • 公式ドキュメントを読んだのよ

  • 公式ドキュメントにしたがってactivatorの最新版(ここでは2.5)をダウンロード/インストール

  • PlaySlickの公式ドキュメントにしたがって依存性解決

  • application.confに適切な設定をしたらコーディング開始

  • Eclipse使ってるんで、plugin.sbtにsbteclipseの設定も忘れずに

今までの(play slick)とは違うよ!

  • playframeworkは2.4になってからDIのサポートを始めたり、DBActionを廃止したりしてる
    • 前に書いた時は2.3.6だったので、書き方が全く変わっていて戸惑った

DI(Dependencies Injection)

依存性の注入(いそんせいのちゅうにゅう、英: Dependency injection)とは、コンポーネント間の依存関係をプログラムのソースコードから排除し、外部の設定ファイルなどで注入できるようにするソフトウェアパターンである。英語の頭文字からDIと略される。
!cite:https://ja.wikipedia.org/wiki/%E4%BE%9D%E5%AD%98%E6%80%A7%E3%81%AE%E6%B3%A8%E5%85%A5!
!title:依存性の注入 - Wikipedia!

  • 例えば、あるdaoを使いたいserviceが、そのdaoのインスタンスをnewするコードを含まなくても良い

    • でも、型は書かなきゃダメなんですよね
    • しかもimportしないといけないので、ソースコードから依存性の記述を排除できていないのでは?
  • こいつが力を発揮するのは、例えば上記の例ではdaoが共通であるクラス(dao基底)を継承している場合

    • ソースには基底だけ書いて、実際の型の記述は設定ファイルに追い出すことができる
    • これを利用すると、test時に使いたいmockの型を設定ファイルから読み込むだけでtestが簡単に書ける……んじゃないかな?
  • ぶっちゃけてしまうと、今回書いた程度の規模のサーバではそんなにありがたみがない仕組みだった

    • 規模を大きくしてテストもガッチリ書くプロダクトでなら嬉しいのかも
  • daoを書く際にdb設定をDIで注入しないといけないのに注意

さよならDBAction 未来を信じて

  • これのおかげでかなり楽にかけていたが、2.4から廃止された

  • 基本的にAction.asyncを使ってFutureを返せということらしい

  • daoからの戻り値は基本的にFuture型に固定される

  • Future型は、「結果はまだ確定していないが後で確定するから処理を続行してくれ」という「ここは俺に任せて先に行け」を地で行く型

  • 例えばDBアクセスは重いので、「その後に書かれているがDBアクセスの結果を使わない処理」を先にやってしまえるならそのほうが効率が良いよね、というようなこと

  • これもやっぱり小規模なサーバではそんなにありがたくない

  • Optionと同じくMonadなので、mapとか諸々を使える

  • 成功/失敗判定をして別々の処理をさせる記述も可能

    • 例外処理をしっかり書くことが推奨されるようなDBアクセスとかはそれが書きやすくて良いのかも

  • activator new時に生成されるapplication.confはslick用にチューンされていない
  • slick用の設定を必ず自分で書くように

欲しかった安心は手に入った?

  • 書くだけ書いてまだ運用していないが、微妙な気がしてきた
  • ポチポチする事が面倒になるのがなんとなく見えている
  • とは言え、目grepでパターンを探さなくても良くなるのはちょっと期待してる

運用してみて(2016/05/31追記)

  • 4回戦のランルーくん戦でめっちゃ威力を発揮
  • これ、パターンをテキストに記録して目grepとかしてたら気が狂うレベルにパターンが多い
  • しかし、ExMatchを使えば何度もリトライして死に覚えゲーすることでかなりのパターンを網羅できる

使えるの?

  • githubには置いてあるけど、DB空っぽなので1から登録してかないといけないです
    • そのうちcsvにでもしてデータロードできるようにしたい

リンク