演習 - 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-postgresql
pom.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] ------------------------------------------------------------------------