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の既存資産をうまく取り込みながら、軽量に動くネイティブアプリを生成することができる素晴らしいツールです。

参考資料

QUARKUS - QUARKUS EXTENSION FOR SPRING WEB API