演習 - Quarkus アプリケーションを作成する

完了

このユニットでは、基本的な Quarkus アプリケーションを作成します。 Maven を使用して、任意のアプリケーションと統合開発環境 (IDE) をブートストラップしてコードを編集します。 任意のターミナルを使用して、コードを実行します。 ローカルでアプリケーションを実行してテストできるように、Docker を使用してローカル PostgreSQL データベースを起動します。

Maven を使用して Quarkus アプリケーションを生成する

Quarkus プロジェクト構造を生成するには、いくつかの方法があります。 Quarkus Web インターフェイス、IDE プラグイン、または Quarkus Maven プラグインを使用できます。 Maven プラグインを使用してプロジェクト構造を生成してみましょう。

いくつかの依存関係を持つアプリケーションを生成します。

  • REST エンドポイントを公開するための resteasy 依存関係
  • JSON をシリアル化および逆シリアル化するための jackson 依存関係
  • データベースと対話する hibernate の依存関係
  • PostgreSQL データベースに接続するための postgresql 依存関係
  • Docker イメージを構築するための docker の依存関係

最初にアプリケーションをローカルで実行し、コンテナー化されたバージョンを Azure Container Apps にデプロイするため、Azure の依存関係を指定する必要はありません。

コマンド プロンプトで、to-do アプリケーションを生成します。

mvn -U io.quarkus:quarkus-maven-plugin:3.19.0:create \
    -DplatformVersion=3.18.4 \
    -DprojectGroupId=com.example.demo \
    -DprojectArtifactId=todo \
    -DclassName="com.example.demo.TodoResource" \
    -Dpath="/api/todos" \
    -DjavaVersion=17 \
    -Dextensions="resteasy-jackson, hibernate-orm-panache, jdbc-postgresql, docker"

このコマンドは、新しい Quarkus プロジェクトを作成します。 Maven ディレクトリ構造 (ソース コード用にsrc/main/java、テスト用に src/test/java) が生成されます。 いくつかの Java クラス、いくつかのテスト、およびいくつかの Dockerfile が作成されます。 また、必要なすべての依存関係 (Hibernate、RESTEasy、Jackson、PostgreSQL、Docker) を含む pom.xml ファイルも生成されます。

  <dependencies>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-hibernate-orm-panache</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy-jackson</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-jdbc-postgresql</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-container-image-docker</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-arc</artifactId>
    </dependency>
    <dependency>
        <groupId>io.quarkus</groupId>
        <artifactId>quarkus-hibernate-orm</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-resteasy</artifactId>
    </dependency>
    <dependency>
      <groupId>io.quarkus</groupId>
      <artifactId>quarkus-junit5</artifactId>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>io.rest-assured</groupId>
      <artifactId>rest-assured</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

注記

pom.xml ファイル内のすべての依存関係は、Quarkus BOM (部品表) io.quarkus.platform:quarkus-bomで定義されます。

アプリケーションをコーディングする

次に、生成された MyEntity.java クラスの名前を Todo.java に変更します (TodoResource.java ファイルと同じフォルダーにあります)。 既存のコードを次の Java コードに置き換えます。 Java Persistence API (jakarta.persistence.* パッケージ) を使用して、PostgreSQL サーバーのデータを格納および取得します。 また、休止状態の ORM と Panache (io.quarkus.hibernate.orm.panache.PanacheEntityから継承) を使用して永続化レイヤーを簡略化します。

JPA エンティティ (@Entity) を使用して、Java Todo オブジェクトを PostgreSQL Todo テーブルに直接マップします。 その後、TodoResource REST エンドポイントによって新しい Todo エンティティ クラスが作成され、永続化されます。 このクラスは、Todo テーブルでマップされているドメイン モデルです。 テーブルは JPA によって自動的に作成されます。

PanacheEntity を拡張すると、型の一般的な作成、読み取り、更新、および削除 (CRUD) メソッドが多数取得されます。 そのため、1 行の Java コードで Todo オブジェクトを保存したり削除したりすることができます。

Todo エンティティに次のコードを追加します。

package com.example.demo;

import io.quarkus.hibernate.orm.panache.PanacheEntity;

import jakarta.persistence.Entity;
import java.time.Instant;

@Entity
public class Todo extends PanacheEntity {

    public String description;

    public String details;

    public boolean done;

    public Instant createdAt = Instant.now();

    @Override
    public String toString() {
        return "Todo{" +
                "id=" + id + '\'' +
                ", description='" + description + '\'' +
                ", details='" + details + '\'' +
                ", done=" + done +
                ", createdAt=" + createdAt +
                '}';
    }
}

そのクラスを管理するには、HTTP を使用してデータを格納および取得する REST インターフェイスを発行できるように、TodoResource を更新します。 TodoResource クラスを開き、コードを次のように置き換えます。

package com.example.demo;

import jakarta.inject.Inject;
import jakarta.transaction.Transactional;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.Produces;
import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;
import jakarta.ws.rs.core.Response;
import jakarta.ws.rs.core.UriBuilder;
import jakarta.ws.rs.core.UriInfo;
import org.jboss.logging.Logger;

import java.util.List;

@Path("/api/todos")
@Consumes(APPLICATION_JSON)
@Produces(APPLICATION_JSON)
public class TodoResource {

    @Inject
    Logger logger;

    @Inject
    UriInfo uriInfo;

    @POST
    @Transactional
    public Response createTodo(Todo todo) {
        logger.info("Creating todo: " + todo);
        Todo.persist(todo);
        UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder().path(todo.id.toString());
        return Response.created(uriBuilder.build()).entity(todo).build();
    }

    @GET
    public List<Todo> getTodos() {
        logger.info("Getting all todos");
        return Todo.listAll();
    }
}

アプリケーションを実行する

開発モードでアプリケーションを実行する場合は、Docker が実行されている必要があります。 これは、PostgreSQL データベースが必要であることを Quarkus が検出し (postgreSQL 依存関係 quarkus-jdbc-postgresqlpom.xml ファイルで宣言されているため)、PostgreSQL Docker イメージをダウンロードし、データベースでコンテナーを開始するためです。 その後、Todo テーブルがデータベースに自動的に作成されます。

Docker がコンピューター上でローカルで実行されていることを確認し、次のコマンドを使用して to-do アプリケーションを実行します。

cd todo
./mvnw quarkus:dev    # On Mac or Linux
mvnw.cmd quarkus:dev  # On Windows

Quarkus アプリケーションが起動し、データベースに接続する必要があります。 次の出力が表示されます。

2025-02-28 08:38:33,418 INFO  [io.qua.dat.dep.dev.DevServicesDatasourceProcessor] (build-28) Dev Services for default datasource (postgresql) started - container ID is ce37977203b0
2025-02-28 08:38:33,421 INFO  [io.qua.hib.orm.dep.dev.HibernateOrmDevServicesProcessor] (build-6) Setting quarkus.hibernate-orm.database.generation=drop-and-create to initialize Dev Services managed database
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,< / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2025-02-28 08:38:35,278 INFO  [io.quarkus] (Quarkus Main Thread) todo 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.18.4) started in 5.367s. Listening on: http://localhost:8080

2025-02-28 08:38:35,280 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2025-02-28 08:38:35,280 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [agroal, cdi, hibernate-orm, hibernate-orm-panache, jdbc-postgresql, narayana-jta, resteasy, resteasy-jackson, smallrye-context-propagation, vertx]

--
Tests paused
Press [e] to edit command line args (currently ''), [r] to resume testing, [o] Toggle test output, [:] for the terminal, [h] for more options>

アプリケーションをテストするには、cURL を使用します。

別のターミナルで、次のコマンドを使用して、データベースに新しい to-do 項目を作成します。 Quarkus コンソールにログが表示されます。

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"Take Quarkus MS Learn","details":"Take the MS Learn on deploying Quarkus to Azure Container Apps","done": "true"}' \
    http://127.0.0.1:8080/api/todos

このコマンドは、(識別子を持つ) 作成された項目を返す必要があります。

{"id":1,"description":"Take Quarkus MS Learn","details":"Take the MS Learn on deploying Quarkus to Azure Container Apps","done":true,"createdAt":"2025-02-26T07:27:30.093447Z"}

次の cURL コマンドを使用して、2 つ目の to-do を作成します。

curl --header "Content-Type: application/json" \
    --request POST \
    --data '{"description":"Take Azure Container Apps MS Learn","details":"Take the ACA Learn module","done": "false"}' \
    http://127.0.0.1:8080/api/todos

次に、新しい cURL 要求を使用してデータを取得します。

curl http://127.0.0.1:8080/api/todos

このコマンドは、作成した項目を含む to-do 項目の一覧を返します。

[ 
  {"id":1,"description":"Take Quarkus MS Learn","details":"Take the MS Learn on deploying Quarkus to Azure Container Apps","done":true},
  {"id":2,"description":"Take Azure Container Apps MS Learn","details":"Take the ACA Learn module","done":false}
]

アプリケーションをテストする

アプリケーションをテストするには、既存の TodoResourceTest クラスを使用できます。 REST エンドポイントをテストする必要があります。 エンドポイントをテストするには、RESTAssured 使用します。 TodoResourceTest クラスのコードを次のコードに置き換えます。

package com.example.demo;

import io.quarkus.test.junit.QuarkusTest;
import static io.restassured.RestAssured.given;
import static jakarta.ws.rs.core.HttpHeaders.CONTENT_TYPE;
import static jakarta.ws.rs.core.MediaType.APPLICATION_JSON;
import org.junit.jupiter.api.Test;

@QuarkusTest
class TodoResourceTest {

    @Test
    void shouldGetAllTodos() {
        given()
                .when().get("/api/todos")
                .then()
                .statusCode(200);
    }

    @Test
    void shouldCreateATodo() {
        Todo todo = new Todo();
        todo.description = "Take Quarkus MS Learn";
        todo.details = "Take the MS Learn on deploying Quarkus to Azure Container Apps";
        todo.done = true;

        given().body(todo)
                .header(CONTENT_TYPE, APPLICATION_JSON)
                .when().post("/api/todos")
                .then()
                .statusCode(201);
    }
}

アプリケーションをテストするときは、Quarkus が PostgreSQL データベースをテストする必要があることを検出するため、Docker Desktop が実行されている必要があります。 次のコマンドを使用してアプリケーションをテストします。

./mvnw clean test    # On Mac or Linux
mvnw.cmd clean test  # On Windows

次のような出力が表示されます。

[INFO] -------------------------------------------------------
[INFO]  T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.demo.TodoResourceTest
[INFO] 
[INFO] Results:
[INFO] 
[INFO] Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------