Toyokumo Tech Blog

トヨクモ株式会社の開発本部のブログです。

Clojureで作るAPI Web サーバーを立ち上げる

[連載]Clojureで作るAPIの3記事目です。

前回の記事はこちらです。

tech.toyokumo.co.jp

この記事ではWebサーバーを立ち上げていきます。

Webサーバーのライブラリを追加

まずは依存関係にWebサーバーのライブラリを追加します。 deps.edn を次のようにしてください。

{:paths ["src"]
 :deps {org.clojure/clojure {:mvn/version "1.11.1"}
        info.sunng/ring-jetty9-adapter {:mvn/version "0.17.6" :exclusions [org.slf4j/slf4j-api]}
        spootnik/unilog {:mvn/version "0.7.30"}}}

ClojureのWebサーバーはRingに沿って作ります。 Ringがどういうものなのかは次の記事で詳しく解説しているのでご覧ください。

tech.toyokumo.co.jp

ここで info.sunng/ring-jetty9-adapterJettyをRingの仕様に適合させてくれているライブラリです。 slf4j-api を除外したり、Clojureのロギングライブラリである spootnik/unilog を加えたりしているのはJavaの複雑なログライブラリの事情によるものなのですが、そこを解説していると別の記事になってしまうので、ここでは一旦触れないでおきます。

最初のWebサーバー

ライブラリが追加できたら core.clj を次のようにします。

;; ./src/cljapi/core.clj
(ns cljapi.core
  (:require
   [ring.adapter.jetty9 :as jetty]))

(defn ring-handler
  [_req]
  {:status 200
   :body "Hello, Clojure API"})

(defn -main
  [& _args]
  (jetty/run-jetty ring-handler {:port 8000}))

(comment
  (-main) ;; (1)
  )

ここまで書けたらREPLを立ち上げて、ファイル全体を評価した後で、(1)の式を評価します。 そうすると大量のログがREPLに出力されつつ、Webサーバーが立ち上がります。

curlを使って確認してみます。

$ curl http://localhost:8000
Hello, Clojure API

localhostの指定したポートにWebサーバーが起動していて、アクセスすると定義した関数(Ring handler)が呼び出されていることが確認できました。

おわりに

とても簡単にWebサーバーを立ち上げることができました。

コードはGitHubのリポジトリに上げてあります。 03_Webサーバーを立ち上げるというタグからご覧ください。

ClojureでAPIを作ることは、言ってしまえば上記で定義した ring-handler に機能を足していくだけの作業です。 とてもシンプルであるおかげで、一度作り上げれば継続したメンテナンスが楽になるということが少しだけでも伝わるでしょうか?

次は開発の生産性を上げるために、REPLを再起動しなくてもWebサーバーの再起動ができるようにしていきます。


トヨクモでは一緒に働いてくれる技術が好きなエンジニアを募集しております。

採用に関する情報を公開しております。 気になった方はこちらからご応募ください。