Episode ini membedah arsitektur Quarkus dari dalam: build-time augmentation, live coding dan Dev UI, model extension yang extensible, cara kerja GraalVM native dan JIT, serta alur lifecycle aplikasi dan CDI container.

Pada episode 1 kita sudah memahami mengapa Quarkus lahir. Sekarang saatnya melihat apa yang terjadi di balik layar. Quarkus bukan sekadar framework yang lebih cepat — ia mengubah fundamental cara aplikasi Java dibangun dan dijalankan.
Episode 2 membedah konsep dasar dan arsitektur utama Quarkus: build-time augmentation, live coding dengan Dev UI, model extension yang extensible, penggunaan GraalVM native dan JIT, serta alur lifecycle aplikasi dan CDI container. Dengan memahami fondasi ini, episode-episode praktik berikutnya akan terasa lebih masuk akal.
Sebagian besar framework Java melakukan classpath scanning saat runtime: memindai semua class, membaca annotation, lalu membangun konteks aplikasi. Ini penyebab utama startup lambat. Quarkus membalik pendekatannya: semua analisis metadata dan pembentukan struktur aplikasi dilakukan saat build time.
Hasilnya adalah bytecode yang sudah siap dioptimalkan dan di-dead code elimination. Runtime Quarkus hanya melakukan inisialisasi minimal, sehingga aplikasi menyala dalam waktu sangat singkat.
Pendekatan ini punya konsekuensi penting: kode yang bergantung pada nilai runtime saat boot (seperti System.getProperty untuk keperluan build-time) harus dipisahkan dengan jelas. Quarkus menyediakan mekanisme seperti @ConfigProperty dan config mappings untuk menangani ini secara aman.
Salah satu fitur favorit developer adalah live coding. Saat kalian menjalankan aplikasi dengan mode dev dan mengubah kode, Quarkus melakukan hot reload — mengganti sebagian besar aplikasi tanpa restart penuh. Hanya perubahan yang memaksa JVM restart yang membutuhkan proses ulang penuh.
./mvnw quarkus:dev
# Saat kode diubah, lihat output seperti:
# Restarting Quarkus application due to changed source
# Quarkus started in 0.321sSaat mode dev aktif, buka http://localhost:8080/q/dev di browser. Dev UI menyediakan dashboard interaktif: melihat bean yang terdaftar, memeriksa config, mengeksekusi query, melihat OpenAPI, dan masih banyak lagi. Ini alat diagnostik yang sangat berharga selama pengembangan.
http://localhost:8080/q/dev # Dev UI
http://localhost:8080/q/openapi # Spesifikasi OpenAPI
http://localhost:8080/q/health # Health checkQuarkus dibangun sebagai platform extensible. Setiap integrasi — database, messaging, observability, security — adalah sebuah extension yang menambahkan build step ke proses augmentation. Semakin sedikit extension, semakin ringan aplikasi kalian.
quarkus extension list # daftar extension terinstall
quarkus extension add "resteasy-reactive-jackson"
quarkus extension add "hibernate-orm-panache,jdbc-postgresql"
./mvnw quarkus:add-extension -Dextensions=cachePerintah quarkus extension add akan menambahkan dependency ke pom.xml dan secara otomatis menyesuaikan konfigurasi build. Model ini membuat aplikasi hanya memuat apa yang dipakai — prinsip pay for what you use.
./mvnw package -Pnative
./mvnw package -Pnative -Dquarkus.native.container-build=trueFlag -Dquarkus.native.container-build=true menjalankan kompilasi native di dalam container, sehingga tidak perlu menginstall GraalVM secara lokal. Detail lengkap akan kita bahas di episode 16.
Quarkus menggunakan ArC — implementasi CDI yang dioptimalkan untuk build-time processing. Container ArC mengenali bean pada saat build, sehingga tidak perlu scanning classpath saat runtime.
Bean CDI memiliki scope yang menentukan siklus hidupnya:
@Singleton: satu instance selama aplikasi hidup.@ApplicationScoped: satu instance per aplikasi, thread-safe.@RequestScoped: satu instance per request HTTP.@SessionScoped: satu instance per sesi pengguna.Pola yang paling sering dipakai di Quarkus adalah @ApplicationScoped untuk service dan repository, dan @RequestScoped untuk data yang khusus per request.
Saat aplikasi Quarkus dimulai, urutannya adalah: pemuatan config, inisialisasi runtime, pembuatan CDI container, deklarasi semua bean, lalu menjalankan endpoint HTTP. Kalian bisa menyuntikkan logika saat startup dan shutdown memakai event lifecycle:
import jakarta.enterprise.context.ApplicationScoped;
import io.quarkus.runtime.StartupEvent;
import io.quarkus.runtime.ShutdownEvent;
import jakarta.enterprise.event.Observes;
@ApplicationScoped
public class AppLifecycleBean {
void onStart(@Observes StartupEvent ev) {
System.out.println("Aplikasi siap menerima request");
}
void onStop(@Observes ShutdownEvent ev) {
System.out.println("Aplikasi sedang ditutup");
}
}Metode void onStart(@Observes StartupEvent ev) dijalankan saat aplikasi selesai bootstrap — tempat yang tepat untuk inisialisasi koneksi, pemuatan cache awal, atau seeding data.
Episode ini membuka kotak hitam Quarkus: kalian kini memahami build-time augmentation yang memindahkan kerja dari runtime ke fase build, live coding dan Dev UI yang mempercepat development, model extension yang membuat aplikasi ringan, dua mode eksekusi JVM dan native, serta cara kerja CDI container ArC dan lifecycle aplikasi.
Inti yang harus dibawa pulang:
/q/dev hanya saat mode dev.@Singleton, @ApplicationScoped, @RequestScoped.StartupEvent dan ShutdownEvent.Di episode 3 selanjutnya kita akan membuat aplikasi Quarkus pertama — dari inisialisasi project dengan Quarkus CLI atau Maven, memahami struktur direktori, menjalankan dev mode dengan live reload, hingga mengatur konfigurasi dasar dan dependency. Ini episode praktik pertama, jadi siapkan terminal kalian!