ScalaでWebAppの開発に必要なN個のこと

PerlでWebAppの開発に必要なN個のこと - Islands in the byte stream の Scala 版です。


あるプログラミング言語で実際にWebAppを開発できるようになるまで、何が必要だろうか。言語仕様の習得は終えているとしよう。おそらく、最低限以下のような知識が必要だと思われる。とりあえずScalaについて知っていることを書いた。

パッケージマネージャ

sbt が全てやってくれる。Scala のバージョン管理も、ライブラリのバージョン管理も。
http://www.scala-sbt.org/


Maven や gradle を使用することもできる。

アプリケーションサーバ

Scala の Web アプリは 2 つのタイプに分けられる。Java の Servlet API を使用するものと、使用しないものである。どのフレームワーク、ライブラリを使うかによって変わってくる。


Servlet API を直接または間接的に使用する場合は Tomcat や Jetty などのサーブレットコンテナが使用される。
http://tomcat.apache.org/
http://www.eclipse.org/jetty/


Servlet API を使用しないものの多くは Akka や Netty、または Netty のラッパーである finagle を利用し、独自に実装されている。
http://akka.io/
http://netty.io/
https://github.com/twitter/finagle


PSGI、Rack のようなものはまだない。http4s がそれを目的に開発されているようだ。
https://github.com/http4s/http4s

ルーティングとリクエストパラメータの処理

最もとっつきやすいのは scalatra だろう。Servlet API の上に Ruby の Sinatra ライクな DSL を構築したものだ。
http://scalatra.org/


unfiltered や Akka ベースの spray も人気がある。
http://unfiltered.databinder.net/Unfiltered.html
http://spray.io/

データベース

ここが一番の悩みどころだ。

Scala からデータベースへ接続するのには JDBC を利用するのが一般的で、JDBC をベースに様々な ORM や DSL が作られてきた。

Scala の総本山 Typesafe が開発しているのは Slick だ。データベースのテーブルを Scala のコレクションのように扱うことができる。
http://slick.typesafe.com/


ORM としては Squeryl も人気がある。
http://squeryl.org/


私のおすすめは scalikejdbc だ。
https://github.com/seratch/scalikejdbc


JDBC を利用しないものでは postgresql-async, mysql-async がある。non-blocking な DB アクセスに興味があればチェックしておくと良いだろう。
https://github.com/mauricio/postgresql-async

ビューのレンダリング

XML,HTML についてはごく単純な場合は Scala の XML リテラル で事足りてしまう。


複雑になってきたら Scalate を使うと良い。Jade, SSP, Mustache, Scaml などの記法に対応している。
http://scalate.fusesource.org/


Play の Scala Template に慣れているのであれば Twirl という選択肢もある。
https://github.com/spray/twirl


Json のレンダリングには Json4s が便利だ。
https://github.com/json4s/json4s

HTTPクライアント

dispatch が有名だ。
https://github.com/dispatch/dispatch
https://github.com/dispatch/reboot


dispatch の API はかなり奇妙なので好き嫌いが別れる。
気に入らなければ Apache の HTTP クライアントや、AsyncHttpClient など、Java のライブラリを選んで使えば良い。
dispatch もそれらを利用して実装されている。

http://hc.apache.org/
https://github.com/AsyncHttpClient/async-http-client

テストフレームワーク

ScalaTest、Specs2 が双璧をなしている。
私は Scalatest が好きだ。

http://www.scalatest.org/
http://etorreborre.github.io/specs2/


実行は sbt の test コマンドで行う。

WAF

以前は Lift が一番人気だったが今では Play 2 が取って代わった。
http://www.playframework.com/
Play 2 を使用すれば上に挙げたモジュールの多くは必要なくなる。




以上。他にもあれば指摘してほしい。