mmts1007’s diary

プログラミング関連の技術系ブログです。

Java Spark

ブログを書く時間をうまく確保できてない mmts1007 です。

今回は Javaフレームワーク Spark について書きます。

Java Spark とは

Spark は Java の Web アプリケーションフレームワークです。
Rubyフレームワーク Sinatra にインスパイアされたフレームワークです。
Java 8 で追加になった ラムダ式 を使うことでシンプルに記述することができます。

特徴

特徴としては前述のとおり

です。

サンプル

Hello Spark

とてもシンプルな例です

gistb99122ff8af2fa0774e4

ルーティング

Sinatra は HTTP メソッドと URLを元にルーティングを決定します。
Spark は Sinatra にインスパイアされたため、Spark も同様にHTTP メソッドと URLを元にルーティングを決定します。
上記の例だと HTTP メソッド:GET、URL:"/" にリクエストした場合、上記のメソッドが実行されることになります。

シンプルな処理内容の記述

Spark はラムダ式を使用することで、シンプルに記述することができます。
get("URLパス", "処理内容"); となっており、第 2 引数にラムダ式を渡すことができます。
これにより、実際の処理内容をシンプルに記述することが可能となりました。

組み込みサーバ

今までの Web アプリケーションは war ファイルを作成し、それを Tomcat などのアプリケーションサーバにデプロイするのが主流でしたが今は組み込みサーバが流行っています。
サーバが組み込まれていると java -jar xxxx.jar のように Java コマンドで実行するだけでサーバが起動します。
アプリケーションサーバを用意しなくとも Web アプリケーションが実行できるのはとても楽です。

Rest API

REST API のサンプルとしてタスクの取得/登録/更新/削除のソースの書き方のイメージです。

public class TaskSpark {
    public static void main(String[] args) {
        get("/tasks", (req, res) -> {
            // 1. タスク内容を全て戻す
        });

        get("/tasks/:id", (req, res) -> {
            // 2. id に指定されたタスクを戻す
        });

        post("/tasks", (req, res) -> {
            // 3. パラメータに指定された内容でタスクを作成する
        });

        put("/tasks/:id", (req, res) -> {
            // 4. パラメータに指定された内容で id のタスクを更新する
        });

        delete("/tasks/:id", (req, res) -> {
            // 5. id に指定されたタスクを削除する
        });
    }
}

Sinatra ライクな記述のため、どのようなルーティングなのか分かりやすいです。
get の /tasks のリクエストがきたら 1. が実行される といった形です。
上記のソースのように REST API のような HTTP のメソッドに意味を持たせる場合、分かりやすいフレームワークだと思います。

実際に処理を書いたサンプルが下記のとおりです。
※ DB 処理を書くのが面倒だったので、適当にメモリに保持。ここら辺の記述は適当ですw

gist247abdc95d81b72bbfaa

new JsonTransformer() を 引数に与えることで、戻りの型を変換することができます。これは Spark の機能です。
今回は JSON 型に変換したかったので JsonTransformer クラスを作成し、指定しています。

まとめ

Sinatra ライクな Spark についての紹介でした。

といった Spark の特徴が少しでも分かって頂ければと思います。