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/loginmengeluarkan 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:
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:
{"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:
| Komponen | Versi | Tujuan |
|---|---|---|
| Bahasa | Kotlin 2.0.21 | Coroutines, DSL, type safety |
| Web framework | Ktor 2.3 | Native Kotlin, async, ringan |
| Serialization | kotlinx.serialization | Standar resmi, cepat, aman dari tipe |
| Database | SQLite via JDBC | Tanpa server, mudah dipelajari |
| Database layer | Exposed | DSL Kotlin untuk SQL, type-safe |
| Connection pool | HikariCP | Pooling performant untuk JDBC |
| Authentication | JWT (HS256) | Stateless, cocok untuk REST |
| Pengujian | Ktor Test Engine | Test tanpa server nyata |
| Deployment | Docker + fat JAR | Repeatable, 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:
suspenddan strukturasyncdi Ktor, - Section Error Handling:
try/catchdanResult<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:
| Bagian | Yang Dikerjakan | Hasil yang Diharapkan |
|---|---|---|
| 1. Struktur Backend | Proyek Gradle, Application.module(), install feature dasar | Server dapat dijalankan dan merespons GET /health dengan 200 OK |
| 2. REST API dan Validasi | Routing CRUD, validasi body dengan pesan terstruktur | Endpoint POST/GET/PUT/DELETE /tasks berfungsi dengan pesan galat JSON |
| 3. Database dan Authentication | Exposed schema, HikariCP, JWT issuance dan verifikasi | Data tersimpan persisten; endpoint terproteksi memerlukan Bearer token |
| 4. Testing dan Deployment | Ktor Test Engine, Dockerfile, build fat JAR | Test 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 #
- Ktor welcome — halaman pengenalan Ktor sebagai kerangka utama proyek web ini
- Create and configure Ktor server
— panduan resmi membuat
EmbeddedServerdan modul Ktor yang menjadi struktur proyek
Bangun struktur backend Ktor: Application module, feature installation, routing table, dan pipeline middleware.
Buka → # Bagian 2: REST API dan ValidasiImplementasi endpoint REST CRUD dengan parsing body JSON dan validasi request yang menghasilkan pesan error terstruktur.
Buka → # Bagian 3: Database dan AuthenticationHubungkan API ke database SQLite via JDBC dengan foreign key, dan tambahkan authentication JWT HS256 dengan sign dan verify.
Buka → # Bagian 4: Testing dan DeploymentTulis pengujian dengan Ktor Test Engine untuk seluruh endpoint, lalu bangun image Docker multi-stage untuk deployment.
Buka →