Latihan - Membuat aplikasi Quarkus

Selesai

Di unit ini, Anda membuat aplikasi Quarkus dasar. Anda menggunakan Maven untuk bootstrap aplikasi dan lingkungan pengembangan terintegrasi (IDE) pilihan Anda untuk mengedit kode. Gunakan terminal pilihan Anda untuk menjalankan kode. Anda menggunakan Docker untuk memulai database PostgreSQL lokal sehingga Anda dapat menjalankan dan menguji aplikasi secara lokal.

Hasilkan aplikasi Quarkus dengan menggunakan Maven

Ada beberapa cara untuk menghasilkan struktur proyek Quarkus. Anda dapat menggunakan antarmuka web Quarkus, plugin IDE, atau plugin Quarkus Maven. Mari kita gunakan plugin Maven untuk menghasilkan struktur proyek.

Anda membuat aplikasi dengan beberapa dependensi:

  • Dependensi resteasy untuk mengekspos titik akhir REST
  • Dependensi jackson untuk serialisasi dan deserialisasi JSON
  • Dependensi hibernate untuk berinteraksi dengan database
  • Dependensi postgresql untuk menyambungkan ke database PostgreSQL
  • Dependensi docker untuk membangun gambar Docker

Anda tidak perlu menentukan dependensi Azure karena Anda menjalankan aplikasi Anda secara lokal terlebih dahulu lalu menyebarkan versi kontainernya ke Azure Container Apps.

Di jendela prompt perintah, buat aplikasi 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"

Perintah ini membuat proyek Quarkus baru. Ini menghasilkan struktur direktori Maven (src/main/java untuk kode sumber dan src/test/java untuk pengujian). Ini membuat beberapa kelas Java, beberapa pengujian, dan beberapa Dockerfiles. Ini juga menghasilkan file pom.xml dengan semua dependensi yang diperlukan (Hibernate, RESTEasy, Jackson, PostgreSQL, dan Docker):

  <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>

Nota

Semua dependensi dalam file pom.xml didefinisikan dalam Quarkus BOM (tagihan bahan) io.quarkus.platform:quarkus-bom.

Kode aplikasi

Selanjutnya, ganti nama kelas MyEntity.java yang dihasilkan menjadi Todo.java (terletak di folder yang sama dengan file TodoResource.java ). Ganti kode yang ada dengan kode Java berikut. Ini menggunakan Java Persistence API (paketjakarta.persistence.*) untuk menyimpan dan mengambil data dari server PostgreSQL Anda. Ini juga menggunakan Hibernate ORM dengan Panache (mewarisi dari io.quarkus.hibernate.orm.panache.PanacheEntity) untuk menyederhanakan lapisan persistensi.

Anda menggunakan entitas JPA (@Entity) untuk memetakan objek Java Todo langsung ke tabel Todo PostgreSQL. Titik akhir REST TodoResource kemudian membuat kelas entitas Todo baru dan mempertahankannya. Kelas ini adalah model domain yang dipetakan pada tabel Todo. Tabel secara otomatis dibuat oleh JPA.

Memperpanjang PanacheEntity akan menyediakan sejumlah metode buat, baca, perbarui, dan hapus (CRUD) generik untuk tipe Anda. Jadi Anda dapat melakukan hal-hal seperti menyimpan dan menghapus objek Todo hanya dalam satu baris kode Java.

Tambahkan kode berikut ke entitas 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 +
                '}';
    }
}

Untuk mengelola kelas tersebut, perbarui TodoResource sehingga dapat menerbitkan antarmuka REST untuk menyimpan dan mengambil data dengan menggunakan HTTP. Buka kelas TodoResource dan ganti kode dengan yang berikut:

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();
    }
}

Jalankan aplikasi

Saat Anda menjalankan aplikasi dalam mode pengembangan, Docker perlu berjalan. Itu karena Quarkus mendeteksi bahwa Anda memerlukan database PostgreSQL (karena dependensi quarkus-jdbc-postgresql PostgreSQL yang dideklarasikan dalam file pom.xml ), mengunduh gambar PostgreSQL Docker, dan memulai kontainer dengan database. Kemudian secara otomatis membuat tabel Todo dalam database.

Pastikan Docker berjalan secara lokal di komputer Anda dan jalankan aplikasi to-do dengan menggunakan perintah ini:

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

Aplikasi Quarkus harus memulai dan menyambungkan ke database Anda. Anda akan melihat output berikut:

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>

Untuk menguji aplikasi, Anda dapat menggunakan cURL.

Di terminal terpisah, buat item to-do baru di database dengan perintah berikut. Anda akan melihat log di konsol 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

Perintah ini harus mengembalikan item yang dibuat (dengan pengidentifikasi):

{"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"}

Buat to-do kedua dengan menggunakan perintah cURL berikut:

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

Selanjutnya, ambil data dengan menggunakan permintaan cURL baru:

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

Perintah ini mengembalikan daftar item to-do, termasuk item yang Anda buat:

[ 
  {"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}
]

Menguji aplikasi

Untuk menguji aplikasi, Anda dapat menggunakan kelas TodoResourceTest yang ada. Ini perlu menguji titik akhir REST. Untuk menguji titik akhir, digunakan RESTAssured. Ganti kode di kelas TodoResourceTest dengan kode berikut:

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);
    }
}

Saat Anda menguji aplikasi, Docker Desktop perlu berjalan karena Quarkus mendeteksi bahwa ia membutuhkan database PostgreSQL untuk pengujian. Uji aplikasi dengan menggunakan perintah ini:

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

Anda akan melihat output yang terlihat mirip dengan ini:

[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] ------------------------------------------------------------------------