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 を使用すれば上に挙げたモジュールの多くは必要なくなる。
以上。他にもあれば指摘してほしい。