Setelah membangun beberapa aplikasi CLI dan berbasis file, kita naik ke arsitektur client-server: REST API Manajemen Tugas. API ini menyediakan endpoint HTTP untuk membuat, membaca, memperbarui, dan menghapus tugas (operasi CRUD), dengan database SQLite untuk persistensi dan JWT untuk authentication. Kita memakai framework Ktor sebagai server HTTP. Proyek ini memperkenalkan konsep penting pengembangan backend: desain endpoint yang konsisten, status code HTTP yang tepat, validasi request, dan keamanan authentication. Setiap Bagian menghasilkan API yang dapat diuji dengan curl atau test HTTP, sehingga kita mendapat umpan balik konkret sebelum menambah lapisan berikutnya.
Tujuan Proyek #
REST API yang akan kita bangun menyediakan endpoint berikut:
GET /tasks— daftar semua tugas.POST /tasks— buat tugas baru.GET /tasks/{id}— ambil tugas berdasarkan ID.PUT /tasks/{id}— perbarui tugas berdasarkan ID.DELETE /tasks/{id}— hapus tugas berdasarkan ID.POST /auth/login— login dan dapatkan JWT.
Setiap endpoint mengembalikan status code HTTP yang sesuai: 200 OK, 201 Created, 204 No Content, 400 Bad Request, 404 Not Found, atau 401 Unauthorized. Body response dalam format JSON yang konsisten sehingga klien dapat mengandalkan kontrak untuk parsing otomatis.
Perilaku yang Diharapkan #
Contoh sesi pemakaian dengan curl:
curl -X POST http://localhost:8080/tasks -H "Content-Type: application/json" -d '{"judul":"Belajar Ktor"}'
curl http://localhost:8080/tasksOutput yang Dihasilkan:
{"id":1,"judul":"Belajar Ktor","selesai":false}
[{"id":1,"judul":"Belajar Ktor","selesai":false}]Response pertama mengembalikan tugas yang baru dibuat dengan status 201 Created. Response kedua mengembalikan array berisi seluruh tugas dengan status 200 OK. Setiap request yang gagal divalidasi mengembalikan pesan JSON yang menjelaskan field mana yang bermasalah.
Teknologi dan Stack #
Proyek ini menggunakan peranti berikut:
| Komponen | Versi | Tujuan |
|---|---|---|
| Bahasa | Kotlin 2.0.21 | Coroutines, type-safe DSL |
| Web framework | Ktor 2.3 | Native Kotlin, ringan, async |
| Database | SQLite via JDBC | Tanpa server, mudah dipelajari |
| Serialization | kotlinx.serialization | Standar resmi Kotlin untuk JSON |
| Authentication | JWT (HS256) | Stateless, cocok untuk REST |
| Build tool | Gradle 8.x dengan Kotlin DSL | Plugin Ktor, fat JAR |
| Pengujian | kotlin.test + Ktor Test Engine | Test integration tanpa server nyata |
Proyek ini memanfaatkan ekosistem Kotlin secara penuh. Ktor menyediakan DSL yang ringkas; kotlinx.serialization menangani JSON otomatis; JDBC mengakses SQLite tanpa konfigurasi server.
Prasyarat #
Pembaca diharapkan telah menyelesaikan chapter berikut:
- Section Coroutines:
suspend,runBlocking, danDispatchers, - Section Error Handling:
Result<T>dantry/catch, - Section Object-Oriented Programming:
data classdaninterface, - Konsep dasar HTTP method (
GET,POST,PUT,DELETE) dan status code, - Konsep dasar database (tabel, kolom, primary key),
- Proyek Aplikasi Keuangan Pribadi: serialisasi JSON dan validasi input.
Tanpa prasyarat tersebut, sebaiknya pelajari dahulu section atau proyek terkait sebelum melanjutkan.
Arsitektur #
Aplikasi disusun mengikuti pola berlapis yang khas untuk backend REST. Request masuk melalui Ktor Application yang menjalankan pipeline middleware (logging, content negotiation, authentication). Setelah itu, request dirutekan ke Route yang sesuai, yang mendelegasikan pekerjaan ke Repository. Repository menjadi satu-satunya tempat yang menyentuh database via JDBC, sehingga lapisan routing tetap fokus pada HTTP dan tidak terkontaminasi SQL.
Pemisahan Repository dari Routing memungkinkan kita mengganti implementasi persistensi (misalnya dari SQLite ke PostgreSQL) tanpa mengubah kode routing. Invariant seperti “judul tidak boleh kosong” dipasang di lapisan validasi sebelum mencapai repository, sehingga database tidak perlu menangani data yang tidak lengkap.
Struktur Bagian #
Proyek ini dikerjakan dalam empat bagian berurutan:
| Bagian | Yang Dikerjakan | Hasil yang Diharapkan |
|---|---|---|
| 1. Desain API | Daftar endpoint, request/response body, status code, skema JSON | Kontrak API terdokumentasi sebelum implementasi dimulai |
| 2. Implementasi Endpoint | Routing Ktor, simulasi data di memori tanpa server nyata | Endpoint CRUD dapat dipanggil dengan curl pada port lokal |
| 3. Database dan Validasi | JDBC SQLite, skema tabel, validasi request body | Data tersimpan persisten; request invalid ditolak dengan 400 |
| 4. Authentication dan Testing | JWT issuance dan verifikasi, Ktor Test Engine | Endpoint terproteksi memerlukan Bearer token; test berjalan tanpa server TCP |
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 Inventaris yang memperluas penggunaan SQLite dengan transaksi stok dan pencarian berbasis SQL LIKE.
Referensi Lanjutan #
- Ktor welcome — halaman pengenalan Ktor sebagai kerangka backend REST API proyek ini
- Ktor routing — panduan resmi routing Ktor yang menjadi kerangka endpoint REST API proyek
Desain REST API: endpoint, request/response, dan status code sebelum implementasi.
Buka → # Bagian 2: Implementasi EndpointImplementasikan endpoint dengan routing Ktor: parsing path parameter, response JSON, dan status code.
Buka → # Bagian 3: Database dan ValidasiTambahkan database SQLite via JDBC dan validasi request sebelum menyimpan ke database.
Buka → # Bagian 4: Authentication dan TestingTambahkan authentication JWT dan tulis unit test untuk seluruh endpoint API.
Buka →