Setelah membangun REST API Manajemen Tugas dengan Ktor di proyek sebelumnya, kita kini membangun aplikasi web yang lebih lengkap: Aplikasi Web Ktor. Proyek ini menggabungkan REST API, database relasional via Exposed, authentication berbasis JWT, pengujian dengan Ktor Test Engine, hingga deployment dengan Docker. Tujuannya adalah menghasilkan layanan web yang siap produksi, bukan sekadar demo. Proyek ini memperluas pemahaman pembaca tentang Ktor: struktur modular dengan feature installation, pipeline middleware, validasi request terstruktur, transaksi database, dan praktik deployment yang repeatable. Setiap Bagian menghasilkan server yang dapat dijalankan dan diuji dengan curl atau HTTP client, sehingga kita dapat memverifikasi setiap kemampuan baru sebelum menambah lapisan keamanan atau deployment.

Tujuan Proyek #

Aplikasi web Ktor yang akan kita bangun menyediakan fitur berikut:

  • REST API untuk manajemen tugas dengan operasi CRUD lengkap.
  • Validasi request body dengan pesan galat terstruktur JSON.
  • Database PostgreSQL atau SQLite via Exposed dengan transaksi aman.
  • Authentication JWT: endpoint /auth/login mengeluarkan token, endpoint lain memerlukan Bearer token.
  • Pengujian dengan Ktor Test Engine (tanpa server nyata) dan deployment via Docker.

Setiap endpoint mengembalikan status code HTTP yang sesuai (200, 201, 204, 400, 401, 404) dan body JSON yang konsisten. Klien dapat mengandalkan kontrak ini untuk membangun integrasi yang stabil.

Perilaku yang Diharapkan #

Contoh sesi pemakaian dengan curl:

bash
curl -X POST http://localhost:8080/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"budi","password":"rahasia"}'

curl http://localhost:8080/api/tasks \
  -H "Authorization: Bearer <token>"

Output yang Dihasilkan:

text
{"token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."}
{"tasks":[{"id":1,"judul":"Belajar Ktor","selesai":false}]}

Endpoint /api/auth/login mengembalikan JWT yang ditandatangani dengan secret server. Endpoint berikutnya menyertakan JWT di header Authorization untuk autentikasi. Token kedaluwarsa akan ditolak dengan status 401 Unauthorized.

Teknologi dan Stack #

Proyek ini menggunakan peranti berikut:

KomponenVersiTujuan
BahasaKotlin 2.0.21Coroutines, DSL, type safety
Web frameworkKtor 2.3Native Kotlin, async, ringan
Serializationkotlinx.serializationStandar resmi, cepat, aman dari tipe
DatabaseSQLite via JDBCTanpa server, mudah dipelajari
Database layerExposedDSL Kotlin untuk SQL, type-safe
Connection poolHikariCPPooling performant untuk JDBC
AuthenticationJWT (HS256)Stateless, cocok untuk REST
PengujianKtor Test EngineTest tanpa server nyata
DeploymentDocker + fat JARRepeatable, mudah diskalakan

Proyek ini menggunakan ekosistem Kotlin secara penuh. Exposed adalah DSL Kotlin untuk SQL yang menggantikan JDBC manual dengan tipe yang aman; HikariCP mengelola pool koneksi agar tidak membuka koneksi baru untuk setiap request; Ktor Test Engine memungkinkan pengujian routing tanpa benar-benar memulai server TCP.

Prasyarat #

Pembaca diharapkan telah menyelesaikan chapter berikut:

  • Section Coroutines: suspend dan struktur async di Ktor,
  • Section Error Handling: try/catch dan Result<T>,
  • Konsep dasar HTTP method dan status code,
  • SQL dasar (proyek REST API Manajemen Tugas),
  • Pengujian unit dengan kotlin.test (proyek Aplikasi Inventaris).

Karena kode contoh berjalan di terminal dengan kotlinc, kita tidak membutuhkan Ktor runtime untuk mempelajari struktur. Saat membangun aplikasi nyata, gunakan Gradle dengan plugin Ktor untuk menjalankan server.

Arsitektur #

Ktor menganjurkan struktur modular: setiap fitur dipasang sebagai extension function pada Application. Setiap fungsi configureX() menginstall satu feature: ContentNegotiation untuk JSON, Routing untuk endpoint, Authentication untuk JWT, Databases untuk HikariCP. Pemisahan ini membuat kode mudah dibaca dan feature dapat ditukar (misalnya, mengganti JWT dengan OAuth2 hanya di satu modul).

Lapisan Repository Exposed menjadi satu-satunya tempat yang menyentuh SQL melalui DSL type-safe. Handler memanggil repository di dalam transaction { } block agar koneksi dari pool digunakan kembali. Modularitas ini memungkinkan pengujian setiap feature secara terpisah dan deployment dapat memilih feature yang aktif sesuai kebutuhan.

Struktur Bagian #

Proyek ini dikerjakan dalam empat bagian berurutan:

BagianYang DikerjakanHasil yang Diharapkan
1. Struktur BackendProyek Gradle, Application.module(), install feature dasarServer dapat dijalankan dan merespons GET /health dengan 200 OK
2. REST API dan ValidasiRouting CRUD, validasi body dengan pesan terstrukturEndpoint POST/GET/PUT/DELETE /tasks berfungsi dengan pesan galat JSON
3. Database dan AuthenticationExposed schema, HikariCP, JWT issuance dan verifikasiData tersimpan persisten; endpoint terproteksi memerlukan Bearer token
4. Testing dan DeploymentKtor Test Engine, Dockerfile, build fat JARTest berjalan tanpa server TCP; image Docker dapat dijalankan

Mulailah dari Bagian 1 dan ikuti urutannya karena setiap Bagian dibangun di atas Bagian sebelumnya. Setelah Bagian 4 selesai, kita siap melangkah ke proyek Aplikasi Multiplatform yang membawa logika bisnis ke banyak platform target dengan satu basis kode bersama.

Referensi Lanjutan #