本ページはプロモーションが含まれています

Java入門

Java開発が変わる!超高速Quarkus入門 5つの特徴

トム

・SaaS勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

「最近、Java界隈でQuarkusという名前をよく聞くけど、一体何がすごいの?」「Spring Bootと比べてどう違うの?」

長年Javaでの開発に携わっていると、起動の遅さやメモリ消費の大きさが、特にクラウド環境では悩みの種。そんなときにQuarkusです。初めてQuarkusで開発したアプリケーションが、高速起動したなんてことに。

この記事は、過去の私と同じように感じている「Javaのパフォーマンスに課題を感じる開発者」に向けて書いています。

この記事を読み終える頃には、あなたが抱える以下の悩みを解決できます。

  • Quarkusの基本的な特徴と、なぜ注目されているかがわかる
  • Spring Bootとの具体的な違いを理解できる
  • Quarkusを始めるための具体的な手順がわかる
  • クラウドネイティブな開発でQuarkusがいかに強力な選択肢になるかを学べます

Java開発の新しいスタンダードになりうるQuarkusの世界を、一緒に見ていきましょう。

Quarkusとは?Javaで注目される3つの理由

Quarkusは、Red Hat社が開発を主導する、クラウドネイティブかつコンテナファーストなJavaアプリケーションを構築するためのフレームワークです。Kubernetesのような環境でJavaを最適に動かすことを目的に設計されました。

その最大の特徴は、驚異的な起動速度と低いメモリ消費にあります。サーバーレスやマイクロサービスといった現代的なアーキテクチャで、Javaが持つ堅牢性を最大限に活かせます。

Quarkusの基本的な特徴

Quarkusのパフォーマンスを支えているのは、「コンパイル時にできることは全てやってしまおう」という思想です。

従来のJavaフレームワークは、アプリケーション起動時にクラスパスのスキャンや設定の読み込み、DI(依存性の注入)コンテナの構築などを行っていました。これには時間がかかり、メモリも多く消費します。

一方でQuarkusは、ビルドの段階でこれらの処理の多くを済ませてしまいます。GraalVMという技術を使って、JavaコードをOSが直接実行できるネイティブイメージに変換することも可能です。

このネイティブイメージ化により、JVM(Java仮想マシン)の起動が不要になり、数十ミリ秒という驚異的な速さでアプリケーションが起動します。javaQuarkusのこの仕組みが、パフォーマンスの高さを実現しているのです。

Spring Bootとの違い

Java開発で最もポピュラーなSpring BootとQuarkusは、しばしば比較対象になります。どちらも優れたフレームワークですが、思想と得意な領域が異なります。

項目QuarkusSpring Boot
起動速度非常に高速(ネイティブで数十ミリ秒)やや遅い(数秒〜数十秒)
メモリ使用量非常に少ない(ネイティブで数十MB)やや多い(数百MB〜)
得意な領域マイクロサービス、サーバーレスモノリス、マイクロサービス
エコシステム成長中非常に成熟、膨大
開発体験ライブコーディング機能が強力DevToolsによるホットリロード

Spring Bootは長年の実績があり、非常に広範なエコシステム(ライブラリや情報)を持っています。どのようなアプリケーションにも対応できる万能性が魅力でしょう。

対してQuarkusは、クラウドネイティブ環境に特化することで、リソース効率を極限まで高めました。特にコンテナとの相性は抜群です。

クラウド時代に選ばれる背景

なぜ今、Quarkusのようなフレームワークが求められるのでしょうか。その背景には、アプリケーションの実行環境の変化があります。

現代の開発では、Dockerでアプリケーションをコンテナ化し、Kubernetesで管理するスタイルが主流です。このような環境では、多数のコンテナを効率よく、そして迅速に起動・停止させる必要があります。

例えば、アクセスが急増した際にサーバーの数を自動で増やす「オートスケール」を考えます。起動が遅いアプリケーションでは、スケールが間に合わずサービス停止につながるかもしれません。

Quarkusの高速起動・低メモリ消費という特徴は、コンテナを素早く立ち上げ、1台のサーバー上でより多くのコンテナを稼働させることを可能にします。これは、クラウドの利用料金、つまりコストの削減に直結する非常に大きな利点なのです。

Quarkusのメリットとデメリット

Quarkusは素晴らしい技術ですが、万能ではありません。採用を検討する際には、メリットとデメリットの両方を正しく理解しておく必要があります。

Quarkusを使うメリット(高速起動・軽量化)

Quarkusがもたらす最大のメリットは、やはりそのパフォーマンスです。

メリット

  1. 圧倒的な高速起動と省メモリJVMモードであってもSpring Bootより高速に起動し、ネイティブイメージ化すれば、その差は歴然です。メモリ使用量も数分の1に抑えられ、リソースを有効活用できます。
  2. 優れた開発者体験Quarkusには「ライブコーディング」という強力な機能があります。コードを修正して保存すると、即座にアプリケーションに反映されるのです。ビルドや再起動を待つストレスから解放され、開発サイクルを大幅に短縮できます。
  3. 標準技術の採用Quarkusは、JPAやJAX-RS、MicroProfileといったJavaの標準仕様を積極的に採用しています。特定のベンダーにロックインされることなく、Java開発者が持つ既存の知識を活かせます。

Quarkusのデメリットや課題

一方で、Quarkusにはいくつかの課題も存在します。

デメリット

  1. エコシステムの成熟度Spring Bootが長年かけて築き上げてきた巨大なエコシステムと比較すると、Quarkusが対応しているライブラリや、世の中にある知見の量はまだ少ないのが現状です。必要なライブラリがQuarkusの拡張機能として提供されていない場合、自力で対応する必要が出てくるかもしれません。
  2. ネイティブビルドの時間ネイティブイメージの実行は高速ですが、そのイメージを生成するビルドには数分程度の時間がかかります。開発中はJVMモードのライブコーディングを使い、本番用のイメージを作成するCI/CDパイプラインでのみネイティブビルドを行う、といった使い分けが必要です。
  3. 学習コストQuarkus独自の考え方や、ネイティブイメージの制約(リフレクションの扱いなど)を理解するには、ある程度の学習が必要です。しかし、標準技術をベースにしているため、Java開発者であれば比較的スムーズに学習を進められるでしょう。

向いている開発環境と向いていない環境

これらの特性から、Quarkusは特に以下の環境で真価を発揮します。

  • 向いている環境
    • マイクロサービスアーキテクチャ
    • サーバーレスアプリケーション(AWS Lambdaなど)
    • Kubernetes上でのコンテナ運用
    • リソースに制約のあるIoTデバイス
  • 向いていない環境
    • 巨大なモノリシックアプリケーション(一括での移行は困難)
    • Quarkusが対応していない特殊なライブラリに強く依存するシステム
    • フレームワークの学習に時間をかけられない短期プロジェクト

Quarkusの開発環境を整える方法

Quarkusでの開発を始めるのは非常に簡単です。ここでは、Mavenを使った基本的なセットアップ方法を紹介します。

Quarkusのインストール手順

最も簡単な方法は、公式サイトのプロジェクトジェネレーターを利用するやり方です。

  1. code.quarkus.io にアクセスします。
  2. GroupやArtifactなどを入力します。
  3. 必要な拡張機能(quarkus-resteasy-reactive-jacksonなど)を選択します。
  4. 「Generate your application」をクリックし、Zipファイルをダウンロードして展開します。

これだけで、すぐに開発を始められるプロジェクトの雛形が完成します。

Maven/Gradleでのセットアップ

ダウンロードしたプロジェクトは、標準的なMavenまたはGradleプロジェクトです。pom.xml(Mavenの場合)には、Quarkusを動作させるためのプラグインやライブラリの依存関係がすでに記述されています。

主要な部分は以下のようになっています。

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>io.quarkus.platform</groupId>
      <artifactId>quarkus-bom</artifactId>
      <version>3.2.4.Final</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>io.quarkus</groupId>
    <artifactId>quarkus-resteasy-reactive</artifactId>
  </dependency>
  </dependencies>

<build>
  <plugins>
    <plugin>
      <groupId>io.quarkus.platform</groupId>
      <artifactId>quarkus-maven-plugin</artifactId>
      <version>3.2.4.Final</version>
      <executions>
        <execution>
          <goals>
            <goal>build</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
</build>

開発をスムーズにする拡張機能

Quarkusの機能は「拡張機能」として提供されます。プロジェクトジェネレーターで選択するか、後からコマンドで追加可能です。

  • quarkus-resteasy-reactive-jackson: REST APIを開発するための基本的な拡張機能。
  • quarkus-hibernate-orm-panache: データベースアクセスを劇的に簡素化します。
  • quarkus-container-image-jib: Dockerfileなしでコンテナイメージをビルドできます。

これらの拡張機能が、Quarkusでの高い生産性を支えています。

Quarkusでの実装例

それでは、実際に簡単なアプリケーションを作成してみましょう。

Hello Worldを作ってみる

プロジェクトジェネレーターで作成したコードには、すでに簡単なエンドポイントが含まれています。

src/main/java/org/acme/GreetingResource.java

package org.acme;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/hello")
public class GreetingResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    public String hello() {
        return "Hello from RESTEasy Reactive";
    }
}

このプロジェクトのルートディレクトリで、以下のコマンドを実行して開発モードで起動します。

./mvnw quarkus:dev

起動後、ブラウザやcurlで http://localhost:8080/hello にアクセスすると、「Hello from RESTEasy Reactive」と表示されます。

REST APIの実装手順

次に、簡単なJSONを返すAPIを実装してみましょう。GreetingResource.javaを以下のように修正します。

package org.acme;

import jakarta.ws.rs.GET;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import jakarta.ws.rs.core.MediaType;

@Path("/greeting")
public class GreetingResource {

    public static class Message {
        public String value;
        public Message(String value) {
            this.value = value;
        }
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Message greet() {
        return new Message("こんにちは、Quarkus!");
    }
}

ファイルを保存すると、Quarkusが自動で変更を検知し、アプリケーションが更新されます。

http://localhost:8080/greeting にアクセスすると、以下のようなJSONが返却されます。

{"value":"こんにちは、Quarkus!"}

DB接続とPanacheの活用

Quarkusの拡張機能であるPanacheを使うと、データベースアクセスが非常にシンプルになります。

まず、quarkus-jdbc-postgresqlquarkus-hibernate-orm-panacheの拡張機能を追加します。

次に、application.propertiesにデータベース接続情報を記述します。

quarkus.datasource.db-kind=postgresql
quarkus.datasource.username=user
quarkus.datasource.password=password
quarkus.datasource.jdbc.url=jdbc:postgresql://localhost:5432/mydatabase

quarkus.hibernate-orm.database.generation=drop-and-create

エンティティクラスを作成します。PanacheEntityを継承するだけで、基本的なCRUD操作が可能になります。

import io.quarkus.hibernate.orm.panache.PanacheEntity;
import jakarta.persistence.Entity;

@Entity
public class Fruit extends PanacheEntity {
    public String name;
    public String color;
}

これだけで、Fruit.findById(id)Fruit.listAll()fruit.persist()といったメソッドを使って簡単にデータベースを操作できるようになります。javaQuarkusの強力な機能の一つです。

Quarkusとマイクロサービス開発

Quarkusは、その設計思想からマイクロサービスやクラウドネイティブ開発と非常に高い親和性を持っています。

Kubernetesとの相性

Kubernetesはコンテナのオーケストレーションツールであり、Quarkusとの相性は抜群です。

  • 高速なスケールアウト: Quarkusコンテナは起動が速いため、負荷に応じてPod(コンテナの実行単位)を迅速に追加できます。
  • 高いリソース効率: メモリ使用量が少ないため、一つのノード(サーバー)により多くのPodを集約でき、インフラコストを削減可能です。
  • ヘルスチェック: Quarkusは標準で/q/healthのようなヘルスチェック用エンドポイントを提供しており、KubernetesがPodの正常性を簡単に監視できます。

クラウドネイティブ開発での強み

クラウドネイティブとは、クラウドの利点を最大限に活用するように設計されたアプリケーション開発のアプローチです。Quarkusはまさに、このアプローチを体現しています。

設定情報を環境変数から読み込む機能や、コンテナイメージを簡単に作成する仕組みが標準で備わっており、CI/CDパイプラインへの統合も容易です。イミュータブル(不変)なインフラを構築する上で、Quarkusは強力な武器となります。

他のフレームワークとの比較

クラウドネイティブなJavaフレームワークはQuarkusだけではありません。

  • Micronaut: Quarkusと同様に、コンパイル時DI(依存性の注入)によって高速起動を実現します。GraalVMネイティブイメージにも対応しています。
  • Helidon: Oracleが開発するフレームワークで、シンプルなAPIとリアクティブ対応が特徴です。

これらのフレームワークも素晴らしい選択肢ですが、Red Hatという強力なバックボーンと活発なコミュニティを持つQuarkusは、現在最も勢いのあるフレームワークの一つと言えるでしょう。

Quarkusを学ぶためのステップ

Quarkusに興味を持ったら、次は実際に触れてみることが一番の近道です。

公式ドキュメント・チュートリアルの活用

Quarkusの公式サイトには、非常に充実したドキュメントとガイドが用意されています。

  • Getting Started: 最初に読むべき導入ガイドです。
  • Guides: 「REST APIの作り方」「データベースへの接続」など、目的別の詳細なガイドが多数あります。

まずは公式サイトのガイドに沿って、実際に手を動かしてみることを強くお勧めします。

学習に役立つ書籍や記事

国内外でQuarkusに関する書籍が出版され始めています。また、多くの技術ブログで実践的な情報が発信されていますので、「java quarkus チュートリアル」などで検索すると、有益な情報が見つかるはずです。

実務で使う前に学んでおきたいこと

Quarkusを本格的に利用する前に、以下の3つの概念について理解を深めておくとスムーズです。

  1. DIコンテナ "ArC": QuarkusのDIコンテナの仕組み。
  2. 設定管理: application.propertiesでのプロファイルごとの設定方法など。
  3. ネイティブイメージの制約: ネイティブイメージで動作させる場合、Javaのリフレクションなど一部機能に制約があります。その仕組みと対処法を学んでおくと、トラブルシューティングに役立ちます。

Quarkusは、Javaに新しい可能性をもたらす、非常にエキサイティングなフレームワークです。

  • この記事を書いた人
  • 最新記事

トム

・SaaS勤務/javaのバックエンドエンジニア
/java歴10年以上 ・首都圏在住30代
・資格:基本情報技術者/応用情報技術者/Java Silver/Python3エンジニア認定基礎

-Java入門