株式会社ユーザベースの技術チームブログです。【Clojure】Ductで始めるWebAPI開発2019-09-24【Clojure】Ductで始めるWebAPI開発ClojureTweetこんにちは!!SPEEDA開発チームの岡村です!!私たちの開発チームでは、先日チームメンバの野口が書いたこちらの記事に書かれているように、チームメンバーの入れ替えが頻繁に行われます。言う私も一ヶ月前に行われたチームシャッフルで、ClojureでDuctを使って開発を行うチームに移動しました。(Clojureほぼ未経験)私がClojure初心者だからこそ、これからClojureとDuctを始めて見ようかなと思っている方に対し、お伝えできることがあると思い、今回はDuctでWebAPIを作成する方法をご紹介しようと思います。DuctとはDuctはライフサイクル管理を行うライブラリ、Integrantをベースとしたサーバサイドのフレームワークであり、アプリケーション構造は、Integrantのコンフィグレーションマップによって定義されます。DuctとIntegrantの関係に関しては、弊社の中村がこちらの記事でも一度ご紹介しています。作成物CRUDの題材として定番な、TODO管理を下記リクエストで行えるAPIを作成していきます。指定したデータを削除するプロジェクト作成DuctプロジェクトはLeiningenを使って作成することができ、プロファイルを指定すると、それに合わせプロジェクト構成や設定ファイルを自動で生成してくれます。+postgresと指定しました。Todoを管理するデータベースも作成しておきましょう。今回はDockerコンテナで作成しました。*eREPLが起動したら、(dev)と入力し開発環境をロードします。(dev):loadedその後、(go)とコマンドを入力するとシステムを起動することができるのですが、DBへの接続情報をまだ記述していないため、下記の様なエラーが発生し、起動することができません。(ConnectionFactoryImpl.java:534).サーバはパスワード・ベースの認証を要求しましたが、パスワードが渡されませんでした。dev=>システムを起動させるため、DB接続情報を記述しましょう!/todo/dev/resources配下にある、dev.ednファイルを以下の様に変更します。このファイルはファイル名の通り、開発環境での設定を記述するファイルです。}Ductではednファイルにコンフィグレーションマップを書いていくことで、アプリケーションの構造を表現することができます。ここではduct.database/sqlというコンポーネントの初期化時に、データベースの接続情報が渡される用に定義しています。書き換えた後に、再度システムを起動させてみましょう。3000}:initiated上記の様に表示されていれば、システムが起動されています。curlでリクエストを送ってみましょう。http://localhost:3000{"error":"not-found"}errorが帰ってきますが、起動していることがわかります。利用して、システムの起動時にテーブルの作成と、テストデータの投入が行われるようにしましょう。先ほど編集したdev.ednを下記のように編集します。}システムを再起動させてみましょう。REPLで(reset)と入力すると、再起動することができます。:todo.migration/create-todos#2cd2c3f9:resumedこれでデータベースにテーブルが作成され、データが投入されました。一覧取得処理の実装まずはTodo一覧を取得する処理を実装していきましょう。/todo/resources/todo/に存在する、config.ednを下記のように編集します。[:todo.handler.todos/list]}という記述を追加しました。これは、/todosにGETリクエストが来た時、:todo.handler.todos/listコンポーネントで処理をするということを表しています。{}という記述も追加しました。これは:todo.handler.todos/listコンポーネントの初期化時に空のマップを渡すということを示しています。続いてハンドラーを作成していきます。/todo/src/todo/handlerに、todos.cljというファイルを作成し、以下を記述します。"OK!!!"}]))Integrantでマルチメソッドとして定義されている、ig/init-keyを実装することにより、コンポーネントを作成することができます。::listというのは、todo.handler.todos/listと同じ意味になります。これにより、先ほどconfig.ednで書いた設定と処理を紐づけることができます。戻り値は、Ataraxyを利用しているのでベクタで記述することができます。"OK!!!"というマップを返すようにしました。http://localhost:3000/todos{"message":"OK!!!"}レスポンスが帰ってくることを確認できました!それでは、実際にデータベースからTodoリストを取得し、返すように実装を変えていきます。/todo/resources/todo/config.ednを下記のように変更します。:duct.database/sql}に変更しました。#ig/ref関数を利用し、:todo.handler.todos/listコンポーネントは、:duct.database/sqlコンポーネントに依存しているということを示しています。:duct.database/sqlは、最初にdev.ednで記述したコンポーネントのことです。初期化済の:duct.database/sqlコンポーネントを受け取ります。次に先ほど作成した、todos.cljを以下のように変更します。後で作成する、データベース接続を行うBoundaryにDB接続情報を渡して結果を返すようにしました。第二引数にはコンフィグマップのコンポーネントに対応する以下のようなバリューが渡ってきます。:duct.database/sql}のことです。#ig/refと記述しているため、初期化された:duct.database/sqlコンポーネントが渡ってきています。続いて、実際にデータベースへの接続を行う層として、Boundaryを作成していきましょう!/todo/src/todo/boundaryにtodos.cljというファイルを作成し、以下を記述します。)DBへの接続情報を受け取り、clojure.java.jdbcを利用してデータベースにアクセスしています。次にデータベースへの登録処理を実装していきましょう。流れは一覧取得処理を実装した時とほとんど同じです。config.ednに/todosにPOSTでリクエストが送られてきた時の定義を記述します。{}}先ほどと違うところは、HTTPリクエストからパラメータを取得しているというところです。HTTPリクエストの情報はマップで渡ってきており、そこから登録に必要な:body-paramsの値を取り出しています。次にhandlerを下記のように変更します。id)])))無名関数の引数が一覧検索の時と異なっています。この無名関数の引数には下記のようなHTTPリクエスト情報のマップが渡ってきます。:post}そのため:ataraxy/resultを分配束縛させています。)jdbc/queryを使っても、もちろん実装できるのですが、jdbc/insert!を利用してみました。これまでと同様にして実装することができます!そのため説明は割愛させていただきますが、最終的に実装は下記のようになります。)まとめIntegrantの「アプリケーションの構造と実装を、明確に分けて開発を行っていける」という機能を利用して作成されたDuctは、ednファイルで各コンポーネント間の依存関係を明示でき、「何が何に依存しているのかednファイルを見ればわかる」といったとこや、提供されているモジュールを利用することにより、実装を手軽に行えるということに魅力を感じました。17:55【Clojure】Ductで始めるWebAPI開発Tweet関連記事2019-11-01ReactとReactHooksを使って、Flux的なアーキテクチャを実現するこんにちは。SPEEDA開発チームの冨田です。昨今のフロントエン...2019-10-07Ringアプリケーションで例外をいい感じにハンドリングする方法(Ductでの解説も含む)こんにちは!こんにちは!SPEEDA開発チームのあやぴーです。1.10.x時代の新しいデバッグツールこんにちは!こんにちは!SPEEDA開発チーム(通称PDT)に所属して...2018-04-03はじめてのDuctSPEEDA開発の中村です。技術チームインターンの前田です。»プロフィール『経済情報で、世界を変える』をミッションに、企業・業界情報プラットフォーム「SPEEDA」やソーシャル経済ニュース「NewsPicks」、ABMを強力にサポートする「FORCAS」、スタートアップの情報収集を圧倒的効率化「entrepedia」などを提供する株式会社ユーザベースの技術チームブログです。多国通貨」をハンズオンしたら快適で楽しかったGo言語でオブジェクト指向プログラミングの基本(型編)月別アーカイブ検索@Uzabase_Techさんのツイートスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。