BPStudy#60でPlay!Frameworkの話を聞いてきたよ

イベントページ

http://connpass.com/event/887/

Javaなのに!Javaっぽくない!Railsライクなフレームワークでお馴染みのPlay!FrameworkについてBPStudy#60で聞いて来ました。*1

PlayFrameworkってなに?

  • Java/Scala用WEBフレームワーク
    • Typesafe社のTypesafe Stackの一部でもある
    • Raisライク
    • WEB開発者のためのFW
    • 決してJEEじゃない
    • シンプルなアーキテクチャ
      • HTTPServer(Netty)の上にPlayが乗ってるだけ
    • JEEは抽象化レイヤが多すぎて複雑すぐる
      • 将来出現するかもしれないWEBじゃない何かにまで対応しようとしてる?
      • 多すぎる抽象化レイヤは悪
      • WEBのものだからWEBに特化したほうがわかりやすい
      • Heroku曰く「なんでJavaのWEBはこんなに複雑なんだ」
      • 鈍重な開発サイクル行き過ぎた抽象化を避けよう
      • 開発は短く、テストに時間をかけよう!
    • コード変更、即コンパイル、即反映
      • config/routes にルーティングルールが書いてある
      • 開発モードならコンパイルエラーが起こってもWEB画面に詳細に表示してくれる
      • JSのコンパイルエラーも報告してくれる(Clousure-compiler内蔵)
      • routesの設定とControllerの不整合も検出してくれる
      • Servletなし(ステートレス)
      • XMLの設定ファイルもない
      • サーバの再起動もなし

PlayFrameworkのver.1とver.2

  • ver.0
  • ver1.0
    • OSS化、IO非同期化、Groovy
  • ver1.2
    • Nettyへ変更
    • Websocket対応
    • Scalaサポート
  • ver2.0
    • 内部をScalaで書き直し
    • 非同期IOの徹底
PlayFramework 1

Javaで書かれたJavaフレームワーク

PlayFramework 2

Scalaで書かれたJavaScalaフレームワーク
主に外国で急成長中、熱狂的なファンが多い

Playの特徴

  • 高生産性かつ楽しい
  • WEBに完全フォーカス
    • ステートレス
      • HttpSessionはない
      • SessionはただのCookie
      • クラウドコンピューティング時代、WEBはステートレスであるべきじゃない?
        • キャパプランニング、サーバ調達、デプロイ、と言う時代ではない
        • まずデプロイ、状況に応じてスケールアウトする
      • ステートレスなのでロードバランサレベルでスケールアウトする
    • 広範囲な型安全
      • Httpルーティング設定、Htmlテンプレート、jsに至るまで全てコンパイルし、静的にエラー検出
      • テンプレートはScalaの関数として実装、テンプレートも存在しない変数などを検出してくれる
      • LLみたいに柔軟に素早くコーディングしながら、あらゆるものを静的に検査してくれる型安全性
        • 型安全だが堅苦しくない
      • Scala型推論とPlayのホットスワップの合わせ技
  • ノンブロッキング
    • これからはリアルタイムWEBの時代
    • 完全な非同期HTTPプログラミングモデルをサポートすることが求められる
    • commetとかWebSocketとかコネクションはロングポーリング的になってきた
      • Nettyによる非同期IOの実現
      • Akkaによる継続プログラミングモデルの実現
      • 場合によってはNodeより早いかも
    • NettyはJBossのネットワークフレームワーク
      • Java NIOのラッパー
      • 非同期イベント駆動型
      • PlayがServletAPIを使ってない理由の一つ
      • PlayはNettyのラッパーといえるくらい綺麗にラップしてる
    • AkkaとはScalaで書かれたActorベースの非同期処理フレームワーク
      • ActionInvoker
        • FWがルータからコントローラを呼ぶ部分で
      • PromiseInvoker
        • FW利用者が明示的にPromiseを利用する時に
      • WebSocketAgent
        • WebSocket利用時
      • Nettyで意識せずに非同期IO
      • Akkaのヘルパーで気軽に非同期処理を扱える
  • 高いテスタビリティ
    • Specs2:BDDフレームワーク内蔵
    • Play2はあらゆるものがScalaの関数なのでテストしやすい
      • テンプレートもただの関数
        • Viewのテストも可能*2
      • コントローラも関数なのでテスト可能
      • Seleniumu Web Driverも内蔵
    • テストフレームワークが組み込まれてるのでいきなりBDD、TDDに取り掛かれる
    • CIに組み込むのも簡単
  • プラグイン機構
    • FW全体にプラグイン機構を採用
      • Db層やAkkaなどはプラグインとして実装されてる
      • まだPlay1ほどのバリエーションはないけどMongoとかRedisとかmemcacheとかリリースされ始めてる
  • デプロイの選択肢
    • デプロイは苦労知らず
    • Servletコンテナ使ってないので特に設定とかは要らない
    • 開発と本番の差異がほぼない
      • 設定の切り替えはPlayサーバ起動時に指定するキーとかで切り替える
      • なのでリポジトリからチェックアウトすればデプロイ完了
    • ステートレスなのでIaaSやPaaSと相性が良い
    • Javaが使えればレンタルサーバでも特に問題ない
    • PaaSの選択肢
      • ネイティブでサポート
        • Heroku
        • Cloudbees
        • OpenShift

利用事例など

    • 外国では利用事例も多い、スタートアップなんかは特に
    • 国内は情報が少ない
    • 金融機関で使われてるという噂(未確認情報)

感想

後日ちょこっと触ってみたけど、まるでJavaじゃないかのような軽快な開発は癖になりそう。特に設定ファイルの不整合まで画面に懇切丁寧に表示してくれるのは感動モノ。
今出回ってる情報量はPlay1の方が圧倒的に多いけど、開発チームとしては完全にPlay2の方にシフトするそうで、しばらくサポートはするけど、これからのものはPlay2がオススメとのこと。*3

*1:お前これいつの勉強会だよ、エントリ書くの遅すぎるんだよ等といったツッコミはもはや今更なので割愛します

*2:出来るけどあまりしない方がいい。というかViewにロジック入れるべきじゃない

*3:まだ枯れてないけど