Episode ini membangun backend dengan Kotlin: memilih antara Ktor, Spring Boot, dan Micronaut, routing dan request handling, serialization JSON, dependency injection dan configuration, serta menulis REST API dengan middleware lengkap.

Setelah menguasai Android, episode 11 mengarahkan Kotlin ke arah lain yang sama populernya: backend development. Kotlin menjadi pilihan utama untuk layanan server modern karena kombinasi keamanan tipe, coroutines, dan interoperabilitas dengan seluruh ekosistem JVM.
Ada tiga framework utama: Ktor yang ringan dan idiomatis Kotlin, Spring Boot dengan ekosistem terbesar, dan Micronaut yang cepat startup dan hemat memori. Episode ini membangun REST API dengan Ktor, lalu menyinggung pola yang sama di framework lain.
Di akhir episode ini kalian akan menjalankan API sederhana yang menangani request, melakukan serialization, dan menyuntikkan dependency.
Ktor dibangun oleh JetBrains khusus untuk Kotlin: sepenuhnya memakai suspending functions dan idiomatis. Ringan dan fleksibel — kalian mengaktifkan fitur sesuai kebutuhan. Mulai project dengan plugin Gradle:
curl -L -o ktor.zip https://start.ktor.io/zip/ktor-server-netty
unzip ktor.zip -d app-api
cd app-api
./gradlew runhttps://start.ktor.io adalah generator project resmi Ktor. Perintah ./gradlew run menjalankan server pada port default 8080. Ktor ideal untuk API kecil, microservices, dan project yang ingin minim magic.
Spring Boot menyediakan ekosistem terbesar: Spring Data, Spring Security, dan banyak lagi, dengan dukungan Kotlin kelas satu. Micronaut menonjol di startup cepat dan footprint kecil karena dependency injection dan AOP dikompilasi saat build, bukan dievaluasi saat runtime. Pilih Spring Boot untuk kematangan ekosistem, Micronaut untuk performa serverless.
Routing di Ktor dideklarasikan dengan DSL yang terbaca. Setiap route memakai suspending function untuk menangani request:
import io.ktor.server.application.*
import io.ktor.server.response.*
import io.ktor.server.routing.*
fun Application.module() {
routing {
get("/") {
call.respondText("Selamat datang di API")
}
get("/pengguna/{id}") {
val id = call.parameters["id"]
call.respond(mapOf("id" to id))
}
}
}get("/pengguna/{id}") menangkap path parameter dan membacanya lewat call.parameters["id"]. Seluruh handler berjalan sebagai coroutine, jadi delay atau pemanggilan I/O tidak memblokir thread server.
Ktor menyediakan helper untuk setiap method HTTP: get, post, put, delete, dan patch. Response bisa berupa teks, JSON, atau file. Mengirim status dan header yang benar adalah bagian dari kontrak REST yang akan kita lengkapi di bagian serialization.
Untuk mengirim dan menerima JSON, aktifkan ContentNegotiation dengan kotlinx.serialization:
import io.ktor.serialization.kotlinx.json.*
import io.ktor.server.plugins.contentnegotiation.*
install(ContentNegotiation) {
json(Json { ignoreUnknownKeys = true })
}
@Serializable
data class RequestBuat(val judul: String, val isi: String)Class RequestBuat dengan anotasi @Serializable otomatis dipetakan dari dan ke JSON request body. Opsi ignoreUnknownKeys = true membuat API toleran terhadap field tambahan dari klien.
Handler POST membaca body dengan call.receive:
post("/artikel") {
val req = call.receive<RequestBuat>()
val artikel = simpan(req)
call.respond(artikel)
}call.receive<RequestBuat>() memetakan JSON body ke objek, dan call.respond(artikel) mengirim kembali objek sebagai JSON. Seluruh proses serialization dan deserialization ditangani framework.
Untuk API Ktor kecil, dependency injection bisa dilakukan secara manual dengan membangun service di awal aplikasi. Untuk skala lebih besar, gunakan library seperti Koin atau framework dengan DI bawaan:
class ArtikelRepository {
private val items = mutableListOf<RequestBuat>()
fun simpan(a: RequestBuat): RequestBuat {
items.add(a)
return a
}
}Membungkus repository dan service dalam constructor memberikan testability yang sama dengan framework DI, tanpa dependency tambahan. Saat kebutuhan tumbuh, Koin atau Spring DI menggantikan pola manual ini dengan mulus.
Konfigurasi seperti port dan kredensial database dibaca dari environment:
export PORT=8080
export DATABASE_URL=jdbc:postgresql://localhost:5432/app
./gradlew runPerintah export PORT=8080 menyetel variabel lingkungan yang dibaca aplikasi saat startup. Mengikat konfigurasi ke environment — bukan hardcode — adalah praktik wajib untuk deployment yang sama di beberapa environment, seperti yang akan dibahas di episode 19.
Ktor memakai plugin sebagai middleware. Middleware kustom bisa mencatat waktu request dan mengukur latensi:
fun Application.installMonitoring() {
intercept(ApplicationCallPipeline.Monitoring) {
val mulai = System.currentTimeMillis()
proceed()
val selesai = System.currentTimeMillis()
call.application.environment.log.info(
"Lama request: ${selesai - mulai} ms"
)
}
}intercept menyisipkan logika sebelum dan sesudah pemrosesan request. proceed() melanjutkan ke handler berikutnya. Middleware seperti ini adalah tempat yang tepat untuk logging, autentikasi, dan rate limiting — disusun berlapis di pipeline.
Episode 11 membangun backend dengan Kotlin: memilih Ktor, Spring Boot, atau Micronaut, mendefinisikan route dengan DSL Ktor, menangani JSON via ContentNegotiation, mengelola dependency dan configuration, serta menyusun middleware dan REST API lengkap.
Inti yang harus dibawa pulang:
call.receive untuk request body, call.respond untuk response.Di episode 12 selanjutnya kita akan membahas Kotlin multiplatform dan cross-platform — arsitektur Kotlin Multiplatform, shared module untuk JVM, Android, JS, dan Native, deklarasi expect dan actual, serta use case untuk mobile, desktop, dan web.