Quarkus 2.0とSpring Webを使ってOpenAPIを定義してみた
Springを軽く動かす
前回は、JavaのコードをネイティブにコンパイルしてLambdaにデプロイする例をご紹介しました。現在、Javaのフレームクワークとしてして主流になっているのは、Spring FrameworkベースのWebアプリケーションを簡単に作ることができるSpringBootだと思います。今回は、Quarkusを用いて、Spring Web APIの動作を確認してみたいと思います。
マシン環境
- macOS Big Sur version 11.4
- MacBook Pro (13インチ, 2020, Thunderbolt 3ポート x 4)
- プロセッサ 2.3 GHz クアッドコアIntel Core i7
- メモリ 32 GB 3733 MHz LPDDR4X
- グラフィックス Intel Iris Plus Graphics 1536 MB
環境構築
前回と同じソフトウェアをインストールしておいてください。
サンプルプロジェクトのセットアップ
Mavenを使ってSpring Webを含むQuarkusのプロジェクトを作成します。
mvn io.quarkus:quarkus-maven-plugin:2.0.1.Final:create \ -DprojectGroupId=org.acme \ -DprojectArtifactId=spring-web-quickstart \ -DclassName="org.acme.spring.web.GreetingController" \ -Dpath="/greeting" \ -Dextensions="spring-web" cd spring-web-quickstart
GreetingController.javaのソースコードです。
package org.acme.spring.web; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/greeting") public class GreetingController { @GetMapping public String hello() { return "Hello Spring"; } }
Mavenから開発用Webサーバーとして起動します。
$ ./mvnw compile quarkus:dev Listening for transport dt_socket at address: 5005 __ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ 2021-07-09 23:47:19,392 INFO [io.quarkus] (Quarkus Main Thread) spring-web-quickstart 1.0.0-SNAPSHOT on JVM (powered by Quarkus 2.0.1.Final) started in 2.189s. Listening on: http://localhost:8080 2021-07-09 23:47:19,401 INFO [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated. 2021-07-09 23:47:19,402 INFO [io.quarkus] (Quarkus Main Thread) Installed features: [cdi, resteasy, resteasy-jackson, smallrye-context-propagation, spring-di, spring-web] -- Tests paused, press [r] to resume, [w] to open the browser, [h] for more options>
キーボードの[w]を押すとブラウザが立ち上がり、動作確認ができます。
$ http://localhost:8080/greeting Hello Spring
ネイティブコード化
続きまして、ネイティブコードにコンパイルします。
$ ./mvnw package -Pnative [INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 106910ms [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 01:57 min [INFO] Finished at: 2021-07-09T23:51:40+09:00 [INFO] ------------------------------------------------------------------------
ビルドされたコードを実行すると即座にWebサーバーが起動しました。
./target/spring-web-quickstart-1.0.0-SNAPSHOT-runner __ ____ __ _____ ___ __ ____ ______ --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \ --\___\_\____/_/ |_/_/|_/_/|_|\____/___/ 2021-07-09 23:52:14,475 INFO [io.quarkus] (main) spring-web-quickstart 1.0.0-SNAPSHOT native (powered by Quarkus 2.0.1.Final) started in 0.019s. Listening on: http://0.0.0.0:8080 2021-07-09 23:52:14,618 INFO [io.quarkus] (main) Profile prod activated. 2021-07-09 23:52:14,618 INFO [io.quarkus] (main) Installed features: [cdi, resteasy, resteasy-jackson, smallrye-context-propagation, spring-di, spring-web]
OpenAPI
OpenAPIとSwagger UIに対応した拡張機能をインストールしてコンパイルして起動します。
./mvnw quarkus:add-extension -Dextensions="io.quarkus:quarkus-smallrye-openapi" ./mvnw compile quarkus:dev
OpenAPIを可視化するSwagger UIの出来上がりです。
まとめ
Quarkusには、多くの拡張機能があります。Spring Frameworkを利用したコードをコンパイルすることができ、ネイティブアプリとして動作させることができました。OpenAPIやSwaggerUIを表現する拡張機能もあるため、簡単に動作確認をすることができます。このように、Quarkusは、Javaの既存資産をうまく取り込みながら、軽量に動くネイティブアプリを生成することができる素晴らしいツールです。