Menggunakan Kotlin untuk Pengembangan Back-end: Tinjauan Singkat

Diterbitkan: 2022-03-11

Saya tidak perlu memperkenalkan Kotlin kepada pengembang Android asli, karena pada Mei 2017, Google mengumumkan bahwa itu akan menjadi bahasa resmi untuk pengembangan Android. Sejak itu, ia mendapatkan banyak daya tarik sebagai pilihan bahasa utama untuk mengembangkan aplikasi Android baru dan mengkilap. Ini memecahkan banyak masalah Java, jadi aplikasi baru sebagian besar ditulis di dalamnya, dan yang lama ditulis ulang di dalamnya.

Tidak diragukan lagi bahwa ini sangat bagus di sisi front-end aplikasi, dan ketika Anda pertama kali menyebut Kotlin, kebanyakan orang mengaitkannya dengan OS Android. Namun, dalam artikel ini, saya akan berbicara tentang Kotlin sebagai bahasa back-end dan saya ingin berbagi cerita tentang membuat back end Kotlin yang cepat, andal, dan asinkron untuk proyek hobi Android saya. Saya tidak akan membahas tentang apa proyek itu, karena itu di luar cakupan artikel ini; alih-alih, saya akan fokus untuk menjelaskan mengapa saya memilih Kotlin dan mengapa menurut saya ini adalah bahasa yang bagus untuk menulis aplikasi sisi server atau REST API.

Mengapa Kotlin?

Biarkan saya kembali ke awal perjalanan saya. Saya selalu memiliki ambisi wirausaha, dan saya pikir langkah pertama di jalan ini adalah menciptakan sesuatu sendiri. Tidak ada yang besar, tidak ada yang mengubah dunia, hanya sesuatu yang kecil yang saya dan mungkin keluarga dan teman saya dapat gunakan. Setelah memiliki ide yang masuk akal, saya langsung terjun ke dalamnya dan mulai menerapkannya. Hal pertama yang Anda lakukan di awal proyek apa pun adalah memilih alat Anda. Bagaimanapun, seperangkat alat yang tepat dapat menghemat banyak waktu dan uang Anda dalam jangka panjang. Jadi inilah yang saya lakukan.

Saya terutama seorang pengembang Java. Saya telah menulis beberapa sistem back-end dan REST API menggunakan Java dan Spring, dan saya pikir keduanya adalah alat yang hebat untuk melakukan hal-hal seperti itu. Java sendiri adalah bahasa yang komprehensif, tetapi dikombinasikan dengan Spring, tidak ada yang tidak dapat Anda terapkan.

Namun, hanya ada satu rambut kecil di dalam sup. Verbositas. Meskipun Spring dan Java versi terbaru sangat membantu, Anda tetap harus menangani banyak kode boilerplate. Dan seperti yang pernah dikatakan seorang pria hebat kepada saya - kode yang paling aman, paling andal, dan bebas bug adalah kode yang tidak ditulis. Ambil, misalnya, kelas Java sepele ini:

 public class Person { private final String name; private final int age; public Person(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } }

Menurut pendapat saya, ini adalah banyak kode untuk sekadar mengatakan, "Saya ingin kelas dengan dua bidang hanya-baca." Bagian terburuknya adalah konstruktor dan metodenya dibuat secara otomatis. Namun, ketika Anda meninjau permintaan tarik, Anda selalu melakukannya karena, yah, Anda tidak pernah tahu apakah itu yang Anda butuhkan atau tidak. Tentu, ini dapat dipersingkat dengan perpustakaan pihak ketiga seperti Lombok, tetapi bukankah lebih baik jika kita bisa melakukan ini di luar kebiasaan? Mari kita lihat kelas yang sama persis ini di Kotlin:

 class Person( val name: String, val age: Int )

Ini pasti lebih pendek dan sederhana. Variabel bersifat final karena kami menggunakan kata kunci val ; konstruktor dan getter dihasilkan pada waktu kompilasi. Jika kita memilih untuk tidak memiliki objek person yang tidak dapat diubah, kita cukup mengubah val menjadi var , dan voila, kita memiliki person yang dapat berubah, dan yang harus kita lakukan hanyalah mengubah satu huruf.

Bagian favorit kedua saya di kelas Java POJO sederhana adalah equals() dan hashCode() yang diganti. Ini lagi-lagi dibuat secara otomatis sebagian besar waktu, namun Anda selalu harus memeriksanya, hanya untuk memastikan. Kabar baiknya adalah bahwa Kotlin dapat menangani ini juga. Cukup ubah class Anda menjadi data class , dan Anda mendapatkan equals() dan hashCode() di luar kotak.

 data class Person( val name: String, val age: Int )

Singkatnya, meskipun saya menyukai Java, saya ingin membuat produk minimum yang layak untuk proyek saya sesegera mungkin dalam waktu singkat. Dan dalam hal pengembangan perangkat lunak, cara paling sederhana untuk mencapainya adalah dengan menulis lebih sedikit kode. Dengan demikian, pencarian saya untuk bahasa yang lebih baik untuk pengembangan back-end terus berlanjut. Dengan pemikiran ini, saya pertama kali beralih ke Node.js. Ini memiliki beberapa keuntungan signifikan—beberapa baris dan server Express Anda aktif dan berjalan, mendengarkan pada port 8080, dan merespons dengan Hello World! setiap kali Anda mengirim permintaan get.

 let express = require('express') let app = express(); app.get('/', (req, res) => res.send('Hello World!')); app.listen(8080);

Mudah, sederhana, dan cepat. Persis seperti yang Anda harapkan dari salah satu bahasa pemrograman paling populer di luar sana. Saya menikmati bekerja dengan JavaScript, dan untuk sesaat, saya pikir saya telah menemukan alat yang tepat, tetapi kemudian saya dihantui oleh fakta bahwa JavaScript diketik secara dinamis. Jangan salah paham, saya pikir pengetikan dinamis bagus di bagian depan, tetapi menurut pengalaman saya, memiliki bagian belakang yang diketik secara statis hanya memberi Anda keyakinan ekstra bahwa server Anda cenderung tidak mogok saat runtime karena ketidakcocokan jenis . Dan jujur ​​​​saja di sini, ketika backend Anda melayani beberapa ratus ribu pengguna, Anda benar-benar tidak ingin itu terjadi. Node.js, bagaimanapun, menawarkan satu fitur hebat yang ingin saya pertahankan, yaitu dapat dengan mudah menulis kode dan layanan asinkron.

Dengan mempertimbangkan persyaratan ini, saya memilih untuk menulis bagian belakang Android Kotlin saya juga di Kotlin.

Kotlin: Ikhtisar Singkat

Bagi Anda yang belum pernah mendengarnya sebelumnya, Kotlin adalah bahasa pemrograman open-source yang diketik secara statis yang mendukung pemrograman berorientasi objek dan fungsional. Ini menyediakan sintaks dan konsep yang mirip dengan C#, Java, atau Scala dan terutama menargetkan JVM tetapi juga memiliki varian yang menargetkan JavaScript atau kode asli. Ini sangat mirip dengan Java dalam hal Kotlin/JVM mengkompilasi ke bytecode Java, jadi bagi para insinyur back-end yang memiliki latar belakang JVM, Kotlin akan mudah dipahami.

Seperti yang dinyatakan oleh halaman resminya, tujuan Kotlin bukanlah untuk menjadi unik tetapi untuk menarik inspirasi dan praktik terbaik dari pengembangan bahasa selama beberapa dekade. Ini dapat digunakan dengan IDE Java apa pun atau dari baris perintah, tetapi saya pribadi lebih suka dan merekomendasikan menggunakannya dengan IntelliJ. Ini dipelihara dan ditingkatkan secara aktif oleh tim JetBrains, dan jangan khawatir untuk membeli versi berbayar—jika Anda baru memulai dengan Kotlin, IntelliJ versi komunitas akan melayani setiap kebutuhan Anda. Tiga aspek terpenting dari Kotlin yang ingin saya tunjukkan adalah: a) ringkas (secara drastis mengurangi kode boilerplate), b) aman (untuk satu hal, ini dibuat untuk menghindari pengecualian penunjuk nol), dan c ) dapat dioperasikan (Anda dapat memanfaatkan perpustakaan yang ada untuk JVM, Android, atau browser).

Coroutine Kotlin

Semua orang ingin memiliki layanan yang melayani pengguna dengan cepat. Untuk mencapai kapasitas maksimum server Anda, hal pertama yang dapat Anda lakukan adalah memiliki aplikasi multithreaded. Java cukup rumit dengan itu. Saat mempelajari Java, pertama-tama Anda mengetahui bahwa jika Anda menginginkan aplikasi multithread, Anda harus memperluas kelas Thread atau mengimplementasikan antarmuka Runnable. Pemula tidak pernah benar-benar mengerti apa perbedaannya (jika ada), tetapi untuk menambah kebingungan, mereka juga disuruh untuk selalu memulai thread dengan metode run, jangan pernah menggunakan metode start. Atau tunggu, apakah sebaliknya? Lagi pula, tidak masalah, Anda tidak boleh memulai utas secara manual, itu terlalu mahal, lebih baik gunakan kumpulan utas. Sederhana, kecuali bahwa itu tidak.

Untungnya, Kotlin memiliki solusi yang lebih sederhana yang disebut coroutine. Sederhananya, coroutine memungkinkan untuk menulis kode non-pemblokiran asinkron dengan cara yang sangat lancar. Ide intinya adalah memiliki fungsi yang dapat ditangguhkan; dengan kata lain, perhitungan dapat ditangguhkan di beberapa titik dan dilanjutkan nanti. Bagian terbaiknya adalah ketika menulis kode non-blocking, model pemrograman tidak benar-benar berubah sehingga menulis kode non-blocking pada dasarnya sama dengan menulis kode blocking. Mari kita lihat dua contoh:

 fun sendRequest(): Int { /* do some heavy work */ return 1; }

Contoh ini menunjukkan fungsi pemblokiran. Utas yang mengeksekusi cuplikan kode ini tidak akan melakukan pekerjaan lain hingga fungsi tersebut kembali, yang dalam kasus panggilan API atau database bisa memakan waktu beberapa detik. Kami benar-benar tidak ingin memblokir utas kami sambil menunggu layanan lain jadi mari kita ubah fungsi ini menjadi yang tidak memblokir.

 suspend fun sendRequest(): Int { /* do some heavy work */ return 1; }

Contoh ini menunjukkan bagaimana kita dapat mengubah metode kita menjadi fungsi non-blocking yang dapat ditangguhkan. Ini berarti bahwa jika, untuk kesederhanaan, pekerjaan berat adalah panggilan fungsi delay() sederhana selama 10 detik, utas pelaksana akan terus mengerjakan tugas lain untuk waktu itu dan akan melanjutkan eksekusi fungsi setelah 10 detik berlalu. Bagus, kode non-pemblokiran dicapai dengan satu kata kunci.

Layanan Asinkron dengan Ktor

Saat menulis REST API, ada beberapa langkah tambahan yang harus dilakukan, seperti memulai server tertanam atau menguraikan permintaan, dan tentu saja, tidak ada yang mau melakukannya secara manual. Java memiliki Spring Boot, yang membuat segalanya menjadi sangat mudah, dan untungnya, Kotlin memiliki kerangka kerja yang disebut Ktor. Ktor adalah kerangka kerja web untuk membangun server asinkron. Seperti yang dinyatakan situs webnya, Ktor “mudah digunakan, menyenangkan, dan tidak sinkron.” Sekarang, kesenangan itu subjektif, jadi saya tidak ingin membuktikan bahwa, bagaimanapun, mari kita lihat cuplikan yang terbukti mudah digunakan dan asinkron.

 fun main() { embeddedServer(Tomcat, 8080) { routing { get { call.respond("Hello world!") } } }.start(wait = true) }

Contoh di atas menyajikan server Kotlin Ktor yang berfungsi penuh yang berjalan pada server Tomcat tertanam, mendengarkan pada port 8080, dan akan merespons secara asinkron dengan "Halo dunia!" untuk mendapatkan permintaan. Semua ini dalam waktu kurang dari 10 baris kode.

Ktor jelas bisa melakukan lebih dari ini. Menyajikan semua fitur Ktor membutuhkan artikelnya sendiri, tetapi di antara banyak hal, itu membuat login dan otentikasi semudah pie. Baca lebih lanjut tentang apa yang dapat dilakukan Ktor di sisi server dan cara mengonfigurasinya di sini.

Manfaat Lain Kotlin di Bagian Belakang

Manfaat pertama yang ingin saya tunjukkan adalah Anda dapat menggunakan perpustakaan Java di Kotlin, dan percayalah, ada banyak perpustakaan pihak ketiga yang luar biasa untuk Java yang dapat membuat hidup Anda lebih mudah. Mengapa Anda menulis implementasi Anda sendiri ketika ada perpustakaan open-source, siap pakai yang melakukan pekerjaan dengan sempurna? Menggunakan ini dengan Kotlin bekerja dengan sempurna.

Keuntungan utama lainnya dari Kotlin dan Ktor adalah pustaka dan kerangka kerja pengujian ekstensif yang dapat Anda gunakan. Kerangka kerja Junit bekerja seperti pesona dengan Kotlin, dan Ktor menambahkan di atas pustaka pengujiannya sendiri yang memungkinkan Anda menulis pengujian ujung ke ujung dan pengujian integrasi dalam waktu singkat. Anda dapat menggunakan mesin uji khusus yang akan menjalankan seluruh aplikasi Anda dan dapat menangani permintaan seperti yang akan dilakukan oleh aplikasi langsung.

Kesimpulan

Seperti yang saya sebutkan sebelumnya, saya pada dasarnya adalah pengembang back-end Java yang memiliki beberapa aplikasi sisi server dan REST API di belakang saya. Meskipun saya menyukai pemrograman di Java, saya pikir tidak ada satu bahasa atau kerangka kerja terbaik yang sempurna untuk pekerjaan apa pun dan dapat menyelesaikan masalah apa pun. Pendekatan saya adalah membiasakan diri dengan sebanyak mungkin alat, dan ketika masalah datang, pilih alat terbaik yang dapat menyelesaikan masalah tersebut dengan sempurna.

Seperti yang dinyatakan situs Kotlin, tujuan Kotlin bukanlah untuk menjadi unik; alih-alih, ini menarik inspirasi dan praktik terbaik dari dekade pengembangan bahasa, dan saya percaya bahwa dalam hal pengembangan back-end, Kotlin, Coroutines, dan Ktor membuat trio yang luar biasa untuk melakukan pekerjaan itu. Anda dapat membaca lebih lanjut tentang Kotlin dan kegunaannya sebagai bahasa pemrograman di sini.