Column: Web アプリケーション開発でよく使うライブラリ

よく使うライブラリ紹介

他の言語にあるような大きいフレームワークより、組み合わせ可能な小さいライブラリを組み合わせて使うのを好むというのは分かったとは思いますが、それでいきなり「どうぞご自由にお好きなライブラリをお使いください」と言われてもよく分からないと思うので、この Column では Web アプリケーション開発に必要なライブラリを幾つか紹介していきたいと思います。

まず Web アプリケーションに必要な機能は主に以下のようになると思います。

  • アプリケーションサーバー
  • ルーティング
  • テンプレートエンジン
  • データベース

これらについてそれぞれ適当なライブラリを紹介していきましょう。

アプリケーションサーバー

Web サーバーとアプリケーションを繋ぐインターフェイスとしては Part2 で説明したように Ring がデファクトスタンダードになっているので Ring を使います。 Clojure の Web アプリケーションは Java と同様に fatjar 化して実行する方法と、 war ファイルにしてアプリケーションサーバーへとデプロイする方法の 2 種類があります。 war ファイルにする場合、デプロイ先は自由に選べるのでここでは説明しませんが fatjar 化してしまう場合には以下にあげるようなライブラリを使うことが出来ます。

  • ring-jetty-adapter
  • http-kit
  • immutant

ring-jetty-adapter はこのドキュメントで既に使っていますが、最近では immutant がよく使われるようになってきています。著名なテンプレートである Luminus のデフォルトサーバーも immutant となっているので悩んだ場合は immutant を使えば間違いないでしょう。また fatjar 化しない場合でも、開発時は REPL 上でサーバーを起動するほうが開発を速くすることが出来るため、上記のライブラリを dev プロファイルの依存関係へと含めることが多いです。

ルーティング

ルーティングについては Part3 で述べたように幾つかの著名なライブラリが存在しますが、それぞれの特徴は以下のようになっています。

Library clj cljs Syntax Isomorphic? Self-contained? Extensible?
Compojure   Macros    
Moustache   Macros    
RouteOne   Macros  
Pedestal   Data    
gudu   Data  
secretary   Macros
silk Data
fnhouse   Macros    
bidi Data

juxt/bidi の README.md より引用

このドキュメントではここまで Compojure を用いてきましたが、後の方では Compojure を使っていた部分を他のライブラリに変えてみようと思います。

テンプレートエンジン

テンプレートエンジンは Part4 で説明したように主に 3 つのライブラリが主流となっていますが、勿論それ以外にも沢山のライブラリがあります。例えば Mustache の Clojure 版である Clostache や日本人の方が作られた拡張可能なテンプレートエンジンである cuma というものがあります。

  • Enlive
  • Selmer
  • Hiccup
  • Clostache
  • cuma

他にも ClojureScript で Hiccup のような書き方が出来る Hiccups などもありますが、必要に応じてどのようなライブラリを使うか選んでみてください。

データベース

データベースと一口に言っても Clojure では幾つかのライブラリを使う必要が出てくることが多いです。まずは JDBC 接続するためのライブラリですが以下の 3 つがあります。

  • clojure.java.jdbc
  • clojure.jdbc
  • suricatta

clojure.java.jdbc はこのドキュメントでも採用しているように簡単に使うことが出来る Clojure のコアライブラリです。 clojure.jdbc は clojure と名前に付くものの公式のライブラリではないので注意してください。このライブラリの利点はトランザクションを clojure.java.jdbc に比べると複雑なもの(ネストしているトランザクションやプラガブルなトランザクション)を扱えることとドキュメントが綺麗に整備されていることだと思います。 suricatta は clojure.java.jdbc や clojure.jdbc よりもっと高レベルな API を提供しますが、よりシンプルで明確になっていて間違いやすい API が少なくなっているのが特徴です。

そして、 JDBC は SQL を文字列で受け取るようになっていますが、この SQL を文字列で直接書くのはやや冗長だったり置換文字 (?) の数を数えるのが複雑になるほど大変になるので出来るだけ避けたいところです。なので、 DSL を提供してくれるライブラリを使います。

  • HoneySQL
  • stch.sql
  • suricatta
  • yesql
  • HugSQL

yesql と HugSQL 以外は DSL という感じですが、 suricatta は JDBC のレイヤーだけでなく DSL も提供しています。 yesql は SQL をテンプレートファイルに書いておいてそれを Clojure プログラム中から呼び出しパラメーターを与えるという使い方をします。ここでまた Luminus を引き合いに出しますが、 Luminus が現在デフォルトで採用しているのは yesql です。

それから実アプリケーションで忘れてはいけないのがコネクションプールですが、これは Java のものをそのまま使うことも出来ますが、 Clojure バインディングが幾つかあるのでそれらを使うのがいいでしょう。

  • clojure.jdbc-c3p0
  • clojure.jdbc-dbcp
  • hikari-cp

最近では hikari-cp を使うのが無難のようです。

その他

Web アプリケーションを作る場合上述した幾つかのライブラリを使えば問題なく作ることが出来るでしょう。とはいえもう少しあったら便利なライブラリなどもあるのでそれらを軽く紹介したいと思います。

  • Environ

    異なるリソースに設定されている環境設定を管理するライブラリ

  • Migratus

    DB マイグレーション

  • Buddy

    ユーザー認証をサポートするライブラリ

  • Timbre

    ロギングライブラリ

  • core.async

    非同期プログラミングをサポートするライブラリ

  • Component

    アプリケーションのライフサイクルと依存関係を安全に管理してくれるライブラリ

まとめ

という具合で現在良く使われているライブラリを主に紹介してみました。 Clojure で Web アプリケーション開発を始めよう、と思っても最初は色々なライブラリがあることに戸惑いを覚えると思いますし、どれを使うのが一番良いのか分かり難くとっつき難いと感じてしまうかもしれません。ですが、 2015 年現在メジャーなライブラリというのもだいぶ固定化されてきているので、最初はここで紹介したようなライブラリを使い始めるのが良いかもしれません。また、どのライブラリも独立しているため同じ領域をカバーしてくれるライブラリが他にある場合、差し替えるのもそんなに難しくないのでまずは試してみるというのも手だと思います。