Backend Developer


 

Pengenalan ke Back-End

Berikut adalah rangkuman dari modul Pengenalan ke Back-End.

Pengertian Back-End

Dalam pengembangan sistem aplikasi, pernahkah mendengar istilah Front-End dan Back-End? Istilah tersebut terasa familier, apalagi bila Anda baru terjun dalam bidang pemrograman. Faktanya, Front-End dan Back-End merupakan opsi bidang dalam profesi Software Developer. Anda perlu menentukan yang harus difokuskan. Lalu, apa arti dari istilah-istilah itu dalam pengembangan aplikasi? Oke, kita bahas dari Front-End terlebih dahulu.

Front-End merupakan bagian dari aplikasi yang terlihat dan digunakan langsung oleh pengguna (end-user). Orang yang menggeluti bidang ini disebut Front-End Developer. Aplikasi yang dibuat oleh seorang Front-End Developer dapat berupa web, mobile nativedesktop, atau platform lainnya. Di mana pun aplikasi berjalan, fokus utama seorang Front-End Developer adalah membangun aplikasi yang memiliki performa baik, mudah diakses, serta memiliki tampilan yang menarik.

Sementara itu, Back-End merupakan bagian dari aplikasi yang bertanggung jawab untuk menyediakan kebutuhan yang tak terlihat oleh pengguna (tidak berinteraksi langsung dengan pengguna), seperti bagaimana data disimpan, diolah, serta ditransaksikan secara aman. Itu semua bertujuan untuk mendukung aplikasi Front-End bekerja sesuai dengan fungsinya. Sosok yang menggeluti bidang ini disebut Back-End Developer.

Server

Server merupakan sebuah sistem yang dapat menyediakan sumber daya berupa data, layanan, atau program untuk disajikan ke komputer lain[1].  Ingat! Pengertian dari server bukanlah sebuah perangkat keras ataupun komputer, namun server sendiri lebih merujuk kepada sistem yang dapat membuat perangkat (termasuk komputer) dapat melayani sebuah permintaan dari perangkat lain. Jika diterjemahkan ke dalam Bahasa Indonesia, server memang berarti penyaji, atau pelayan. 

Berikut beberapa tipe server sesuai dengan layanan yang baik untuk Anda ketahui.

  • File Server : melayani penyimpanan dan pendistribusian berkas.
  • Application Server : melayani hosting sebuah program atau aplikasi.
  • DNS Server : mengubah nama domain (contoh: dicoding.com) ke dalam bentuk IP Address (contoh: 75.2.21.170).
  • Web Server : melayani hosting sebuah program atau aplikasi (seperti Application Server) yang dapat diakses oleh client melalui internet maupun intranet.
  • Database Server : melayani penyimpanan dan pendistribusian data terstruktur.

Web Server dan Web Service

Kita perlu membuat dan menjalankan program (mirip seperti SOP) agar dapat menentukan logika bisnis sesuai dengan kebutuhan. Program tersebut perlu disimpan di server dan dapat diakses secara remote melalui internet atau intranet agar aplikasi Front-End dan Back-End dapat saling terhubung. Jadi, untuk membuat sistem aplikasi, setidaknya kita membutuhkan:

  • Web Server: Server yang dapat menjalankan program dan dapat diakses melalui internet atau intranet. 
  • Web Service: Program yang dijalankan di web server agar kebutuhan bisnis terpenuhi.

Web service berjalan di dalam web server sehingga ia dapat diakses melalui internet. Melalui web service inilah aplikasi Front-End (client) dan Back-End dapat bertransaksi.

Komunikasi Client-Server

Pada protokol HTTP, request yang diajukan client harus memiliki informasi yang cukup agar dapat dieksekusi oleh server. Informasi pada request dapat mengandung poin-poin berikut:

  • Request line: berisikan method/verb seperti GET (mengambil data), POST (menambahkan/mengirim data), PUT (memperbaharui data), atau DELETE (menghapus data); path atau alamat yang diminta; dan versi HTTP yang digunakan.
  • Header: memuat informasi yang dilampirkan terkait request seperti format dokumen (contoh: application/json, text/html, dsb), kunci akses, dll.
  • Body (opsional): mengandung data yang dibutuhkan oleh server, bisa dalam bentuk teks, JSON, dll. Body tidak wajib dilampirkan bila server tidak membutuhkan data apa pun.

Setiap request yang dilakukan, baik dengan informasi yang sesuai maupun tidak, akan mendapatkan respons. Respons atau tanggapan yang dikirimkan dari server untuk client juga mengandung informasi. Berikut beberapa informasi yang dilampirkan oleh respons:

  • Status line: berisikan HTTP versi yang digunakan; status code berupa tiga digit angka yang menandakan keberhasilan dari permintaan; reason phrase atau status text yang merupakan pesan berdasarkan status code dalam bentuk teks sehingga lebih mudah dimengerti.
  • Header: mengandung informasi yang dilampirkan terkait response seperti format dokumen.
  • Body (opsional, tetapi biasanya selalu dilampirkan): memuat data yang dikirimkan oleh server. Data dapat berupa HTML, JSON, gambar, dsb.

REST Web Service

REST atau REpresentational State Transfer adalah salah satu gaya arsitektur yang dapat diadaptasi ketika membangun web service. Berikut beberapa sifat yang menjadi kunci pada REST API:

  • Client-Server: Ini merupakan hal yang paling mendasar dalam membangun REST API. Server harus bisa merespons permintaan yang dilakukan client, baik itu respons berhasil maupun gagal. Komunikasi client dan server dilakukan melalui protokol HTTP.
  • Stateless: REST API tidak boleh menyimpan keadaan (state) apa pun terkait client. Seluruh state harus tetap disimpan di client. Artinya, tidak ada session di REST API. Permintaan yang dilakukan client harus mengandung informasi yang jelas. Jangan berharap RESTful API akan menyimpan informasi dari permintaan sebelumnya untuk digunakan di permintaan selanjutnya.
  • Cacheable: Agar dapat merespons permintaan dengan cepat, sebaiknya REST API menerapkan prinsip cache sehingga setiap permintaan tidak melulu mengambil dari database.
  • Layered: Ketika REST API server memiliki arsitektur yang kompleks, client seharusnya tidak perlu tahu bagaimana server melayaninya.

Selain itu, sebelum membangun REST API, kita perlu mengenal dahulu bagaimana konsep-konsep penting yang harus diterapkan dalam membangun arsitektur ini. Apa saja?

Singkatnya, ketika membangun REST API, kita harus memperhatikan empat poin berikut:

  • Format Request dan Response.
  • HTTP Verbs/Methods.
  • HTTP Response code.
  • URL Design.

Format Request dan Response

REST API seringnya menggunakan JavaScript Object Notation atau JSON sebagai format data baik itu pada request ataupun response. JSON merupakan salah satu format standar dalam transaksi data. Bahkan, saat ini JSON menjadi format terpopuler mengalahkan pendahulunya yaitu XML.

Sebenarnya Anda bisa menggunakan XML pada REST API, namun sebaiknya gunakan JSON agar lebih mudah dibaca dan efisien dalam transaksi data.

Agar REST API selalu merespons dengan format JSON, pastikan setiap respons terdapat properti Content-Type dengan nilai application/json.

HTTP Verbs dan Response Code

Karena REST API menggunakan protokol HTTP, kita dapat memanfaatkan HTTP verbs untuk menentukan aksi.

GET untuk mendapatkan data, POST untuk mengirimkan data baru, PUT untuk memperbarui data yang ada, dan DELETE untuk menghapus data. Verbs tersebutlah yang umum digunakan dalam operasi CRUD.

Status-Line merupakan salah satu bagian dari HTTP Response. Di dalam status line terdapat response code yang mengindikasikan bahwa permintaan yang client lakukan berhasil atau tidak. Karena itu, ketika membangun REST API kita perlu memperhatikan dan menetapkan response code secara benar.

Status code bernilai 3 digit angka. Pada REST API, berikut nilai-nilai status code yang sering digunakan:

  • 200 (OK) - Permintaan client berhasil dijalankan oleh server.
  • 201 (Created) - Server berhasil membuat/menambahkan resource yang diminta client.
  • 400 (Bad Request) - Permintaan client gagal dijalankan karena proses validasi input dari client gagal.
  • 401 (Unauthorized) - Permintaan client gagal dijalankan. Biasanya ini disebabkan karena pengguna belum melakukan proses autentikasi.
  • 403 (Forbidden) - Permintaan client gagal dijalankan karena ia tidak memiliki hak akses ke resource yang diminta.
  • 404 (Not Found) - Permintaan client gagal dijalankan karena resource yang diminta tidak ditemukan.
  • 500 (Internal Server Error) - Permintaan client gagal dijalankan karena server mengalami eror (membangkitkan Exception).
  • 503 (Service Unavailable) - Permintaan client gagal dijalankan karena server tidak dapat menangani permintaan. 

URL Design

URL, Path, atau Endpoint merupakan salah satu bagian terpenting yang harus diperhatikan ketika membangun REST API. Dengan merancang endpoint yang baik, penggunaan API akan lebih mudah dipahami. Dalam merancang endpoint, ikutilah aturan umum atau convention agar penggunaan API kita memiliki standar yang diharapkan oleh banyak developer. Lalu, seperti apa standar dalam merancang endpoint? 

  1. Gunakan Kata Benda daripada Kata Kerja pada Endpoint Path
  2. Gunakan Kata Jamak pada Endpoint untuk Resource Collection
  3. Gunakan Endpoint berantai untuk resource yang memiliki hirarki/relasi


Dasar-Dasar Node.js untuk Back-End

Berikut adalah rangkuman dari modul Dasar-Dasar Node.js untuk Back-End

Pengenalan Node.js

Dari dulu hingga kini, browser menjadi tempat satu-satunya yang dapat mengeksekusi kode JavaScript. Karenanya, Web Developer perlu mempelajari bahasa pemrograman yang berbeda untuk mengembangkan aplikasi Front-End dan Back-End. Meskipun secanggih dan sekuat apa pun JavaScript berkembang, ia hanya akan digunakan di sisi Front-End saja.

Sebenarnya banyak developer yang mencoba membuat teknologi agar JavaScript dapat dijalankan di luar browser. Namun, belum ada yang berhasil. Hingga pada tahun 2009, Ryan Dahl berhasil menciptakan Node.js, teknologi yang diharapkan oleh banyak web developer. Tak disangka, saat ini teknologi yang diciptakannya menuai popularitas tinggi. Node.js banyak digunakan oleh perusahaan besar sekelas Netflix, Uber, Paypal, dan eBay.

Node.js berhasil menjadi JavaScript Runtime yang dapat mengeksekusi kode JavaScript di luar browser.

Menjalankan JavaScript Menggunakan Node.js

Terdapat dua cara dalam menjalankan kode JavaScript menggunakan Node.js, yakni Node.js REPL dan berkas javascript.

  • Node.js REPL
    Node.js memiliki fitur REPL atau Read-Eval-Print Loop. Sesuai namanya, fitur ini berfungsi untuk membaca kode JavaScript, mengevaluasi kode tersebut, kemudian mencetak hasil evaluasinya ke console. Nah, untuk loop, berarti proses tersebut selalu berulang.

    Jika Anda mengeksekusi console.log(‘Hello NodeJS REPL’), selain pesan “Hello NodeJS REPL”, nilai undefined juga akan tercetak. Hal tersebut terjadi karena REPL selalu menampilkan nilai evaluasi pada console. Karena method console.log() tidak mengembalikan nilai, teks undefined-lah yang tercetak pada console.

  • Berkas JavaScript
    Cara lain untuk mengeksekusi kode JavaScript menggunakan Node.js adalah melalui berkas berekstensi .js. Caranya mudah, tinggal buat berkas JavaScript pada proyek Node.js, tulis kode JavaScript di berkas tersebut, lalu eksekusi dengan perintah node namafile.js.

Node.js Global Object

Dilansir dari website Node.js, sebenarnya mereka hanya menambahkan beberapa objek saja. Objek tersebut dinamakan dengan ‘true globals’. Berikut adalah daftarnya:

  • global: Global namespace. Member apa pun yang ada di dalam object ini dapat diakses pada cakupan global.
  • process: menyediakan interaksi dengan proses Node.js yang berjalan.
  • console: menyediakan berbagai fungsionalitas STDIO.
  • setTimeoutclearTimeoutsetIntervalclearInterval: berkaitan dengan waktu.

Ada juga objek yang merupakan ‘pseudo-globals’ atau objek global semu. Objek ini tidak terlihat bila dicetak menggunakan Object.getOwnPropertyName(global) sebab ia bukan member langsung dari objek global, melainkan diturunkan dari cakupan module. Karena pada Node.js semua berkas JavaScript adalah module [3], objek pseudo-globals dapat diakses layaknya global objek. Berikut adalah daftarnya:

  • module: digunakan untuk sistem modularisasi pada Node.js.
  • __filename: keyword untuk mendapatkan lokasi berkas JavaScript yang dieksekusi. Keyword ini tidak tersedia pada Node.js REPL.
  • __dirname: keyword untuk mendapatkan root directory dari berkas JavaScript yang dieksekusi.
  • require: digunakan untuk mengimpor module JavaScript.

Process Object

Pada Node.js, global objek process memiliki fungsi dan properti yang dapat memberikan informasi mengenai proses yang sedang berjalan.

Salah satu yang sering digunakan adalah properti process.env. Melalui properti ini, kita dapat menyimpan nilai atau mendapatkan informasi mengenai environment yang digunakan selama proses sedang berlangsung. Contoh, process.env memiliki properti process.env.PWD yang menyediakan informasi mengenai lokasi di mana proses dijalankan; properti process.env.USER menyimpan informasi nama user pada komputer Anda; dan masih banyak properti lainnya. Anda bisa lihat daftar lengkap properti yang ada pada halaman dokumentasi Node.js mengenai process.env.

Anda juga bisa secara manual menyimpan nilai di dalam process.env. Hal ini berguna untuk menentukan alur code seperti if-else dalam program berdasarkan environment yang Anda berikan. Contohnya, ketika Anda ingin nilai variabel host berbeda di kala pengembangan (development) dan produksi (production), Anda bisa membuat properti NODE_ENV pada process.env. Jadi, Anda bisa menentukan nilai host berdasarkan kondisi NODE_ENV.

Modularization

Makin kompleks program yang dikembangkan, Makin kompleks pula kode yang dituliskan. Jika kode aplikasi hanya ditulis dalam satu berkas saja, tentu itu akan menyulitkan kita atau developer lain untuk membaca dan memelihara aplikasi. Idealnya, satu berkas JavaScript hanya memiliki satu tanggung jawab saja. Bila lebih dari satu, itu berarti Anda perlu berkenalan dengan modularization atau modularisasi.

Modularisasi dalam pemrograman merupakan teknik pemisahan kode menjadi modul-modul yang bersifat independen, tetapi bisa saling digunakan untuk membentuk suatu program yang kompleks. Pemisahan kode menjadi modul-modul terpisah inilah yang dapat membuat kode JavaScript lebih mudah dikelola.

Pada Node.js, setiap berkas JavaScript adalah module. Anda bisa membagikan nilai variabel, objek, class, atau apa pun antar module. Untuk melakukannya, Anda perlu mengekspor nilai pada module tersebut.

Untuk mengekspornya, simpanlah nilai tersebut pada properti module.exports.

Node Package Manager

Dalam pengembangan aplikasi saat ini, industri gencar memanfaatkan module atau package luar agar proses pengembangan dapat lebih cepat. Semakin kompleks aplikasi tersebut, semakin banyak pula module/package yang digunakan. Di sinilah kita memerlukan sebuah package Manager.

Node Package Manager (NPM) merupakan pengelola package untuk JavaScript yang dapat memudahkan kita dalam mengelola package yang tersedia pada https://www.npmjs.com/. NPM merupakan standard package manager yang disediakan oleh Node.js dan sudah otomatis terpasang ketika memasang Node.js pada komputer kita. NPM dapat dioperasikan melalui CMD atau Terminal, Anda pun sudah mencobanya ketika membuat proyek JavaScript.

Selain untuk membuat proyek JavaScript, NPM dapat digunakan untuk memasang atau menghapus third party module (modul pihak ketiga). Modul yang dipasang melalui NPM akan disimpan pada folder node_modules.

Terdapat dua tipe pemasangan module melalui NPM: global dan lokal. 

  • Bila dipasang secara global, module akan bersifat layaknya core module dan dapat digunakan di mana pun. 
  • Bila dipasang secara lokal, module hanya dapat digunakan pada cakupan proyek Node.js saja.

Namun, saat ini kami sangat menyarankan Anda untuk memasang modul pihak ketiga secara lokal saja. Hindari pemasangan modul secara global karena akan menyebabkan banyak masalah. Sebaiknya gunakan npx bila Anda ingin menjalankan Node.js package di mana pun yang Anda inginkan. 

Events

Aplikasi Node.js biasanya dikenal memiliki pola event-driven atau memiliki alur berdasarkan suatu kejadian. Apa maksudnya itu? Mari kita jelajahi lebih dalam lagi.

Dunia nyata penuh dengan kejadian. Alarm berbunyi, ponsel berdering, turun hujan, ataupun kejadian lainnya. Sebagai manusia, kita membuat keputusan, lantas bertindak berdasarkan kejadian yang ada. Contohnya:

  • Ketika berjalan dan tetiba turun hujan, kita bergegas menggunakan payung.
  • Ketika ponsel berdering, kita bereaksi dengan mengangkat panggilan.
  • Ketika merasa lapar, kita makan. 

Seperti inilah pola yang terjadi di kehidupan nyata, sudah sejak lama kita bertahan hidup dengan pola seperti ini. Inilah yang dimaksud dengan pola event-driven.

Kita kembali ke dunia komputer. Tradisionalnya, programming dilakukan dengan cara yang imperatif. Agar komputer dapat melakukan sesuatu hal, kita perlu banyak menuliskan instruksi secara runtut beserta langkah-langkahnya. Komputer akan membaca kode dari atas ke bawah sesuai dengan urutan yang kita definisikan.

Dengan pola yang kaku seperti itu, kita akan sulit membangun program yang dapat menangani suatu kejadian. Karena kita saja tidak tahu kapan suatu kejadian akan terjadi, lantas bagaimana cara memberikan instruksi pada komputer? Lalu, bagaimana solusinya? Berkaca dari dunia nyata, program komputer juga harus bekerja dengan pola event-driven. Syukurlah dengan Node.js kita dapat menerapkan pola tersebut dengan mudah.

Node.js menyediakan EventEmitter class yang merupakan member dari events core module.

Filesystem

Ketahuilah bahwa seluruh data di komputer dikelola dan diakses melalui filesystem. Ketika kita menjalankan kode JavaScript pada browser, sangat penting untuk melimitasi JavaScript dalam mengakses filesystem. Teknik ini dinamakan dengan sandboxing. Sandboxing melindungi kita dari program jahat serta tindakan pencurian yang dapat merampas privasi penggunanya.

Bagaimana dengan JavaScript yang dijalankan di back-end? Limitasi tentu tetap ada, tetapi tidak seketat ketika JavaScript dieksekusi pada browser. Di back-end, justru filesystem menjadi fitur esensial karena dalam pengembangan back-end akan sering sekali mengakses atau menulis sebuah berkas di dalam komputer. 

Node.js menyediakan core modules fs yang dapat mempermudah kita dalam mengakses filesystem. Setiap method yang ada di module fs tersedia dalam dua versi, yakni versi asynchronous (default) dan versi synchronous. 

Tentu Anda sudah tahu apa itu asynchronous dan synchronous 'kan? Jika belum, pelajari kedua hal tersebut pada kelas Belajar Dasar Pemrograman JavaScript.

Untuk mengakses berkas pada komputer, kita dapat menggunakan method fs.readFile(). Method ini menerima tiga argumen: lokasi berkas, encoding, dan callback function yang akan terpanggil bila berkas berhasil/gagal diakses.

Readable Stream

Fungsi readFile, baik versi asynchronous maupun synchronous, bekerja dengan membaca berkas hingga selesai sebelum mengembalikan data. Itu berarti, bila Anda menggunakannya untuk mengakses berkas yang besar, proses tersebut akan membutuhkan waktu lama dan memori yang besar untuk mendapatkan hasilnya. Hal ini sungguh tidak efektif!

Lantas, bagaimana? Solusinya adalah dengan menggunakan teknik stream. Teknik ini tidak membaca berkas secara sekaligus, melainkan dengan mengirim bagian demi bagian. Cara inilah yang digunakan oleh YouTube agar video dapat ditampilkan seketika kepada pengguna.

Teknik stream merupakan salah satu konsep fundamental yang mendukung aplikasi Node.js bekerja. Teknik ini dapat menangani kasus baca tulis berkas, komunikasi jaringan, atau beban kerja apa pun agar dapat berjalan dengan lebih efisien. Sabar dulu ya, kasus yang disebutkan tadi terlalu kompleks untuk kita pelajari sekarang. Untuk memahami bagaimana stream bekerja, kita akan gunakan kasus paling sederhana, yakni membaca teks pada berkas secara bagian-per-bagian.

Kita dapat membuat readable stream dengan menggunakan method createReadStream() dari core module fs.

Writable Stream

Apakah Anda tahu bahwa teknik stream juga dapat digunakan untuk menulis berkas? Teknik ini disebut writable stream. Untuk membuat writable stream dalam menulis berkas, gunakanlah method createWriteStream() dari core module fs.

Fungsi ini menerima satu argumen yakni alamat berkas untuk menyimpan hasil data yang dituliskan. Berkas output akan dibuat secara otomatis jika tidak ada. Namun, bila berkas tersebut sudah ada, data sebelumnya akan tertimpa!


Membangun Web Service Menggunakan Node.js

Berikut adalah rangkuman dari modul Membangun Web Service Menggunakan Node.js

Membuat HTTP Server secara Native

Pengembangan back-end adalah hal prioritas untuk Node.js. Ia andal dalam membangun aplikasi back-end, salah satunya web server alias sebuah komputer yang dapat menangani dan menanggapi permintaan dari client. Node.js menyediakan core modules http untuk membangun web server.

HTTP module memiliki banyak member seperti objek, properti, atau method yang berguna untuk melakukan hal-hal terkait protokol HTTP. Salah satu member yang penting untuk kita ketahui sekarang adalah method http.createServer().

Sesuai namanya, method ini berfungsi untuk membuat HTTP server yang merupakan instance dari http.server. Method ini menerima satu parameter custom callback yang digunakan sebagai request listener. Di dalam request listener inilah logika untuk menangani dan menanggapi sebuah request dituliskan.

Request listener memiliki 2 parameter, yakni request dan response. Seperti yang tertulis pada contoh kode di atas, request merupakan objek yang menyimpan informasi terkait permintaan yang dikirimkan oleh client. Di dalam objek ini kita bisa melihat alamat yang diminta, data yang dikirim, ataupun HTTP metode yang digunakan oleh client.

Sementara itu, response merupakan objek yang digunakan untuk menanggapi permintaan. Melalui objek ini kita bisa menentukan data yang diberikan, format dokumen yang digunakan, kode status, atau informasi response lainnya.

Setiap instance dari http.server juga memiliki method listen(). Method inilah yang membuat http.server selalu standby untuk menangani permintaan yang masuk dari client. Setiap kali ada permintaan yang masuk, request listener akan tereksekusi.

Method listen() dapat menerima 4 parameter, berikut detailnya:

  • port (number): jalur yang digunakan untuk mengakses HTTP server.
  • hostname (string): nama domain yang digunakan oleh HTTP server.
  • backlog (number): maksimal koneksi yang dapat ditunda (pending) pada HTTP server.
  • listeningListener (function): callback yang akan terpanggil ketika HTTP server sedang bekerja (listening).

Namun, keempat parameter di atas bersifat opsional. Kita bisa memberikan nilai port saja atau kombinasi apa pun dari keempatnya. Hal itu tergantung terhadap kebutuhan Anda. Lazimnya, ketika memanggil method listen(), kita memberikan nilai port, hostname, dan listeningListener. 

Web Framework

Web Framework adalah sebuah kerangka yang dapat membantu mempermudah pengembangan web, termasuk dalam membuat web server. Dengan menggunakan framework, penulisan kode akan lebih terstruktur, mudah dipelihara, dan gampang dikembangkan.  

Web Framework menyediakan sekumpulan tools dan library yang dapat menyederhanakan hal-hal yang sering dilakukan dalam pengembangan web, seperti pembuatan server, routing, menangani permintaan, interaksi dengan database, otorisasi, hingga meningkatkan ketahanan web dari serangan luar.

Web Framework di Node.js

Di kelas ini kita menggunakan Hapi framework. Framework seperti Hapi menyediakan environment yang lengkap untuk mengembangkan web server yang kompleks. Bila menggunakan Hapi, kita tak perlu tools lain untuk menerapkan layer authenticationtokenizecors, dan lain sebagainya. 

Kelemahan Hapi adalah abstraksinya yang terlalu jauh dari Node.js native. Kita perlu belajar secara dalam untuk menguasai framework ini.

Penggunaan framework menjadi pilihan personal. Salah satu faktornya adalah kasus yang hendak Anda hadapi. Ketika ingin membangun server yang sederhana, katakanlah untuk mendukung aplikasi front-end di-render di sisi server, express adalah pilihan yang tepat. 

Namun, bila Anda ingin membangun web server yang kompleks tanpa membutuhkan effort yang besar, Hapi adalah pilihan yang tepat.

Kita akan membangun web server dengan arsitektur REST yang kompleks ke depannya. Agar Anda selalu “Hapi” ketika mengikuti alur belajar, kita akan gunakan framework Hapi dalam membangun web server.

Ketahuilah bahwa Hapi memiliki environment yang cukup luas. Kelas ini tidak akan mengajarkan secara dalam tentang API yang ada di Hapi, melainkan hanya fitur-fitur yang menjadi dasar pembuatan REST API. Jadi, bila Anda ingin mendalami terkait framework Hapi, sempatkan waktu untuk eksplorasi di dokumentasi Hapi yang disediakan ya. 

Membuat HTTP Server Menggunakan Hapi

Untuk membuat HTTP server menggunakan Hapi, kita tidak lagi menggunakan core module http secara langsung. Kita akan membuat server melalui modul pihak ketiga @hapi/hapi. Untuk menggunakan modul tersebut, kita perlu memasang terlebih dahulu melalui NPM.

HTTP server sendiri dibuat melalui method Hapi.server(). Method ini menerima satu parameter, yakni ServerOptions. ServerOptions merupakan objek yang menampung konfigurasi dari server yang hendak dibuat, salah satunya kita bisa menetapkan properti port dan host.

Proses menjalankan server (server.start()) dilakukan secara asynchronous. Karena itu, kita perlu menjalankannya di dalam fungsi async dan memanggil server.start() menggunakan await.

Setelah server berhasil berjalan, Anda bisa melihat alamat lengkap dan port di mana server dijalankan melalui properti server.info.uri.

ESLint

ESLint adalah tools yang dapat membantu atau membimbing Anda untuk selalu menuliskan kode JavaScript dengan gaya yang konsisten. Seperti yang Anda tahu, JavaScript tidak memiliki aturan yang baku untuk gaya penulisan kode, bahkan penggunaan semicolon. Karena itu, terkadang kita jadi tidak konsisten dalam menuliskannya.

ESLint dapat mengevaluasi kode yang dituliskan berdasarkan aturan yang Anda terapkan. Anda bisa menuliskan aturannya secara mandiri atau menggunakan gaya penulisan yang sudah ada seperti AirBnb JavaScript Code StyleGoogle JavaScript Code Style, dan StandardJS Code Style. Kami sarankan Anda untuk mengikuti salah satu code style yang ada. Mengapa begitu? Jawabannya karena code style tersebut sudah banyak digunakan oleh JavaScript Developer di luar sana.

Same-Origin Policy

Server dapat menampung sebuah website, aplikasi, gambar, video, dan masih banyak lagi. Ketika server menampung website, mungkin beberapa data gambar, video, stylesheet biasanya diambil dari alamat server lain atau origin yang berbeda. Contohnya, stylesheet yang diambil dari Bootstrap CDN ataupun gambar yang diperoleh dari server Unsplash. Hal ini wajar dan biasa dilakukan.

Namun, apakah Anda tahu bahwa tidak semua data bisa diambil dari origin yang berbeda? Contohnya, data JSON yang didapatkan melalui teknik XMLHTTPRequest atau fetch. Jika website meminta sesuatu menggunakan teknik tersebut dari luar origin-nya, permintaan tersebut akan ditolak. Itu disebabkan oleh kebijakan same-origin. Kasus ini terjadi pada aplikasi client dan web server yang kita buat.

Origin terdiri dari tiga hal: protokol, host, dan port number.

Selama aplikasi client mengakses data dari origin yang sama, hal itu dapat dilakukan. Namun, bila ada salah satu saja yang berbeda (misal port 8001), permintaan itu akan ditolak.

Lantas, apa solusi agar keduanya dapat berinteraksi? Tenang, untungnya ada mekanisme yang dapat membuat mereka saling berinteraksi. Mekanisme tersebut disebut Cross-Origin Resource Sharing (CORS).

Mengonsumsi dan Menggabungkan Data di Node.js

Banyak aplikasi yang kita gunakan di belakang layar sebenarnya tidak hanya berasal dari satu layanan, melainkan berasal dari berbagai layanan yang saling berkomunikasi. Aplikasi yang kita gunakan di belakang layar mengonsumsi data yang berasal dari berbagai sumber, kemudian datanya digabungkan sesuai dengan kebutuhan.

Bagaimana cara satu layanan menemukan dan berkomunikasi dengan layanan lainnya? 

Supaya layanan bisa saling berkomunikasi, kita harus menemukan IP address, DNS, atau Port yang ada di server terlebih dahulu. Setelah itu, barulah ia dapat berkomunikasi antar layanan menggunakan protokol HTTP, RPC, dan AMQP.


Deploy Web Services

Berikut adalah rangkuman dari modul Deploy Web Services

Amazon Elastic Compute Cloud

Amazon Elastic Compute Cloud atau Amazon EC2 merupakan salah satu layanan komputasi elastis di cloud yang ditawarkan oleh AWS (Amazon Web Services). Tunggu, apa maksudnya? Komputasi elastis? Cloud? Apa itu? Oke, mari kita mulai secara perlahan.

Sederhananya, EC2 merupakan sebuah komputer server yang dapat Anda miliki namun tidak dapat Anda lihat fisiknya. Walaupun tak tampak secara fisik, komputer ini tetap bisa Anda operasikan di mana saja karena ia disimpan di awan (cloud) yang secara harfiah awan dapat dilihat di mana saja. 

Namun, jangan salah kaprah karena, cloud di sini hanya sebatas istilah. Sebenarnya, EC2 disimpan di Data Center AWS dengan infrastruktur jaringan yang sangat kuat sehingga server dapat diakses secara global dengan sangat cepat.

Mengunggah Proyek Web Server ke GitHub

Sebelum bermain dengan instance yang sudah dibuat, kita perlu mengunggah proyek web server ke internet agar nantinya dapat diunduh dan dijalankan oleh instance.

Dalam proses tersebut, kita memanfaatkan teknologi Git dan GitHub. Banyak developer yang sudah familier dengan dua hal ini. Namun, bila Anda baru mendengarnya, jangan khawatir ya karena kita akan mulai dari awal.

Git merupakan sebuah sistem yang membantu developer dalam melakukan versioning atau source code management terhadap aplikasi yang dikembangkan. Melalui Git, kita dapat menelusuri perubahan kode, siapa yang melakukan perubahannya, hingga mengelola code versioning (branching). Tools ini kerap digunakan sebagai tools berkolaborasi antar-developer. Git bisa dipasang di Windows, Linux, dan juga macOS.

Tenang, jangan terlalu pusing mendalami tentang git sekarang. Kita tidak akan menggunakan seluruh fungsi yang ada di git, melainkan fokus mengunggah proyek (atau repository dalam istilah git) kita ke internet.

Ketahuilah bahwa sistem git ini hanya berjalan di lokal komputer Anda saja. Agar repository git dapat diakses di mana saja, oleh siapa saja, dan komputer mana saja (termasuk EC2 Instance), kita perlu menyimpan repository-nya di internet. Nah, di sinilah peran dari GitHub. Ia merupakan salah satu vendor yang bergerak di bidang source code hosting menggunakan teknologi git.

Menginisialisasi Local Repository pada Proyek Web Server

Git akan memantau setiap perubahan pada berkas yang ada. Namun, sebenarnya tidak semua berkas yang ada di dalam proyek harus dipantau oleh git. Contohnya, berkas node_modules.

Berkas yang ada di dalam node_modules tidak perlu dipantau perubahannya karena berkas tersebut memiliki ukuran yang sangat besar. Selain itu, berkas node_modules bisa kita peroleh kembali dengan cara menjalankan perintah npm install pada Terminal proyek. Jadi, kita tidak membutuhkan node_modules pada repository.

Agar git tidak memproses kedua berkas tersebut, buatlah berkas konfigurasi git dengan nama .gitignore.

Setelah menulis di .gitignore, kemudian kita jalankan perintah berikut:

  1. git add .
  2. git commit -m "initial commit"

Berikut fungsi dari kedua perintah tersebut:

  • git add . digunakan untuk memasukkan semua berkas ke stash, terkecuali berkas node_modules.
  • git commit -m “initial commit” digunakan untuk menyimpan perubahan pada local repository. Setiap perubahan pada sistem git dapat ditelusuri berdasarkan commit history.

Mengonfigurasi Kebutuhan pada EC2 Instance

Karena kini proyek web server sudah berada di internet, lebih tepatnya pada remote repository GitHub secara publik, sekarang kita bisa mengunduhnya pada EC2 instance.

Untuk mengunduh remote repository pada EC2 instance, tentu kita juga perlu memasang sistem git di instance tersebut. Good news! Image yang kita gunakan (Ubuntu) telah terpasang sistem git secara built-in sehingga kita tidak perlu instal git secara mandiri. 

Untuk memastikan hal tersebut, silakan akses kembali EC2 instance menggunakan SSH di PowerShell/CMD/Terminal.

Kemudian, tuliskan perintah git --version.

Pastikan versi git muncul ya. Jika gagal, berarti git belum terpasang. Anda dapat dengan mudah memasang sistem git pada Ubuntu dengan perintah sudo apt-get install git

Selanjutnya, unduh proyek web server kita pada instance. Proses unduh remote repository ke local repository dinamakan dengan cloning.

Silakan kunjungi halaman remote repository pada browser, kemudian klik tombol Code.

Setelah itu, salin URL HTTPS dari remote repository dengan menggunakan tombol clipboard berikut: 

Selepas itu, kembali lagi ke jendela SSH, tuliskan perintah berikut: git clone <remote repository URL>.

Ganti <remote repository URL> dengan URL yang Anda salin. Contohnya: git clone https://github.com/dimasmd/notes-app-back-end.git.

Untuk memastikan proyek tersimpan pada instance, Anda bisa tuliskan perintah ls, maka akan terdapat folder dengan nama notes-app-back-end. Masuk ke folder proyek tersebut dengan menggunakan perintah berikut: cd notes-app-back-end

Anda bisa tuliskan kembali perintah ls untuk melihat isi di dalam folder proyek.

Memasang Node.js dan Menjalankan Web Server di EC2 Instance

Karena untuk menjalankan web server yang kita buat membutuhkan Node.js, tentu kita perlu memasang Node.js pada EC2 instance juga.

Sebelum Anda mulai memasang Node.js, pastikan versi yang digunakan Node.js di komputer Anda sama dengan Node.js yang akan dipasang di EC2 instance. Ini berguna untuk mencegah terjadinya bugs yang ditimbulkan oleh perbedaan versi Node.js, apalagi bila perbedaan versi tersebut cukup jauh. Untuk itu, kita cek dulu yuk versi Node.js apa yang digunakan pada komputer kita.

Silakan buka Terminal/CMD/PowerShell pada komputer Anda, lalu jalankan perintah node -v.

Agar mudah mengatur versi Node.js yang digunakan pada EC2 instance, kita akan menggunakan tools yang bernama nvm. Melalui nvm, kita bisa dengan mudah mengubah versi Node.js yang ingin digunakan. Tools ini sangat membantu proses upgrade atau downgrade Node.js secara mudah.

Setelah proses instalasi nvm setelah, pasang seluruh module/package dependencies yang digunakan pada proyek kita dengan mengeksekusi perintah npm install.

Memperbaiki Masalah

Ternyata kita tidak bisa menggunakan host dengan nilai localhost untuk menjalankan Hapi server pada EC2 instance. Kita perlu menjelaskan secara eksplisit private IP yang digunakan oleh instance, di mana IP tersebut pada summary instance dijelaskan bernilai 172.31.36.19.

Tetapi menetapkan nilai host dengan alamat IP yang eksplisit seperti itu bukanlah hal yang baik. Pasalnya, nilai IP address dapat berubah-ubah. Perubahan bisa terjadi karena banyak hal, salah satunya instance kita pindah mesin fisik karena sempat di-restart. Kita tidak dapat menjamin kapan perubahan tersebut bisa terjadi. Apakah Anda mau setiap kali IP berubah, kode Anda juga harus diubah? Repot sekali, bukan? Lalu, bagaimana solusinya?

Solusinya adalah gunakan IP beralamat 0.0.0.0. Alamat tersebut merupakan alamat spesial yang digunakan agar komputer dapat diakses melalui seluruh alamat IP yang digunakan pada komputer tersebut. Misalnya begini, bila komputer Anda tersambung ke jaringan Wi-Fi dengan IP 192.168.100.25 dan LAN dengan IP 172.31.90.21, maka 0.0.0.0 dapat diakses melalui kedua alamat IP tersebut. Sudah paham?

Dengan begitu di production kita dapat menggunakan alamat spesial ini untuk menghindari masalah perubahan IP. Karena bila alamat IP berubah, nilai 0.0.0.0 tetap aman untuk digunakan.

Process Manager

Saat ini web server kita sudah bisa diakses secara publik melalui internet. Selama web server sedang digunakan, pastikan juga proses node pada instance selalu tetap berjalan ya.

Bila proses node tersebut terhenti, itu bisa dikarenakan Anda tak sengaja menghentikannya atau session SSH berakhir sehingga web server pun terhenti. Bila web server terhenti, maka otomatis aplikasi client tidak dapat digunakan.

Bayangkan bila ini terjadi pada implementasi di dunia nyata? Tentu akan merepotkan bisnis Anda. Karena agar server dapat berjalan kembali, kita perlu masuk ke SSH dan menjalankan kembali perintah npm run start-prod. Sungguh tahapan yang tidak praktis. Kita tidak ingin menghabiskan waktu dan tenaga untuk melakukan hal itu berulang kali.

Bila Anda tidak bersedia untuk menjaga server tetap hidup, berarti sebagai gantinya kita harus mencari seseorang (atau sesuatu) yang mau melakukannya. Pertanyaannya, siapa yang mau? Ada kok, terlebih lagi ia mau bekerja tanpa bayaran. Perkenalkan, Process Manager.

Process Manager dapat menangani permasalahan di atas. Dengan menggunakan Process Manager, Anda tidak perlu khawatir bila aplikasi Node.js terhenti disebabkan oleh crash, ia akan menjalankan ulang prosesnya secara otomatis hampir tanpa downtime. Selain itu, Process Manager dapat membantu menyeimbangkan muatan proses pada CPU yang tersedia di server atau biasa disebut sebagai load balancing. Dengan begitu, aplikasi server dapat diakses secara lebih cepat dibandingkan bila dijalankan menggunakan node process secara langsung.


Mengonsumsi dan Menguji RESTful API Menggunakan Postman

Postman

Postman merupakan tools yang sangat cocok untuk menguji sebuah API karena memiliki fungsi yang relatif lengkap sebagai API caller dalam melakukan HTTP Request. Bahkan untuk pengembangan API yang sudah kompleks, pengujian Postman dapat diintegrasikan ke dalam alur CI/CD.

Postman merupakan tools yang sangat powerful dan mudah untuk digunakan. Ia memiliki graphical user interface (GUI) sehingga dapat digunakan dan dipahami oleh kalangan pemula sekalipun. Sebab, kita tak lagi berhadapan dengan kode yang rumit hanya untuk membuat HTTP request seperti cURL.

Postman mendukung seluruh method yang ada di HTTP. Postman tersedia secara gratis dan dapat berjalan pada sistem operasi Windows, Linux, ataupun macOS.

Postman memiliki global object pm. Untuk membuat testing, gunakan method pm.test(). Method tersebut menerima dua parameter, yang pertama nama test dan yang kedua adalah spec function. Method test() mirip seperti method it() pada Jest (Anda sudah mempelajarinya di kelas Belajar Dasar Pemrograman JavaScript).

Komponen UI Postman

dos:87081822c9e737ab20d9787ff9b4c9fa20211019144808.jpeg

Selamat datang di Postman! Untuk membuat HTTP Request baru, Anda bisa klik tombol “+” (New Tab).

dos:10a305d967528b85b2847969fb469f1420211019144808.jpeg

Kemudian, Anda akan melihat halaman berikut:

dos:88fcdabae903077657c75478ecbbe29b20211019144808.jpeg

Di halaman inilah kita akan melakukan panggilan ke API. Sebelum itu, mari kita breakdown beberapa komponen yang penting untuk Anda ketahui saat ini. 

Di bagian atas aplikasi Postman, Anda bisa melihat komponen seperti gambar di bawah ini.

dos:a3397c9817791d9eb03eb76b1cc6b45420211019144808.png

Komponen ini merupakan tab dari halaman request. Seperti browser, ketika Anda hendak membuka halaman browser baru, Anda bisa membuka tab baru. Begitu juga dengan Postman, bila Anda ingin membuat request baru, Anda bisa membuka tab baru.

Lanjut, di bagian bawahnya kita bisa melihat komponen berikut ini:

dos:efbbbb20052ab0d1e6fb99008fcc61fd20211019144808.jpeg

Di sini kita menentukan method dan path dari request yang akan dilakukan. Tombol Send digunakan untuk mengirim permintaan pada path dan method yang sudah ditentukan. 

Postman mendukung seluruh method yang ada di HTTP. Secara mudah Anda bisa mengubah method yang digunakan dengan menekan opsi dropdown yang tersedia.

dos:43f2fcecb1985590e0281f9ec814773c20211019144808.jpeg

Kita beralih ke komponen di bawahnya.

dos:9c9ebe216c9bd02be806078d8f158f3a20211019144808.jpeg

Komponen ini digunakan untuk menyisipkan data dalam bentuk params URL, authorization, Headers, Body, dan lainnya. Anda dapat secara mudah menyisipkan data pada request melalui komponen ini.

Kita lanjut ke komponen di bawahnya.

dos:3332b08c2ad5c48a05ece9bce5b68e1820211019144808.jpeg

Ketika Anda mengirimkan request, response body akan tampak di sini. Response dari server akan ditampilkan secara terformat sesuai dengan Content-Type yang diberikan server. Jika responsnya HTML, ia akan di-render layaknya pada browser. Jika JSON, ia akan diformat dengan struktur JSON.

Pengujian Otomatis Menggunakan Postman

Ketahuilah bahwa dengan Postman Anda juga bisa melakukan pengujian secara otomatis sehingga tak perlu lagi melihat respons dari server secara manual untuk memastikan responsnya sesuai dengan harapan. Pengujian otomatis di Postman menggunakan kode JavaScript, serupa dengan unit dan integration testing yang sudah Anda pelajari di kelas Belajar Dasar Pemrograman JavaScript.

Melalui testing otomatis ini kita bisa menguji nilai dari status code, properti header, hingga body respons. Pengujian otomatis akan “pass” (berhasil) ketika semua variabel yang diuji sesuai ekspektasi. Bila ada salah satu yang tidak sesuai, pengujian akan “failed” (gagal).

Postman Collection

Postman collection merupakan tempat menyimpan kumpulan request. Kita bisa menganggap collection adalah sebuah folder yang menyimpan berkas, tetapi berkas itu adalah request.

Setiap request yang Anda kirim di Postman sebenarnya akan tampak pada tab History di sidebar.

Dalam penggunaan yang ringan, memilih dan menggunakan kembali request melalui History merupakan pengalaman yang cukup nyaman. Namun, bila Anda banyak melakukan request, history request akan menumpuk tak karuan. Dengan begitu, Anda akan membutuhkan waktu yang lama untuk memilah dan memilih request yang ingin digunakan kembali.

Dengan adanya collection, request bisa Anda kelompokkan sehingga lebih mudah untuk diakses. Melalui collection, Anda bisa menjalankan seluruh request yang ada di dalamnya sekaligus dengan urutan yang dapat disesuaikan.

Postman Environment

Environment merupakan kumpulan dari variabel yang dapat digunakan pada request di Postman. Ketika melakukan pengujian otomatis, terkadang kita perlu menyimpan nilai pada sebuah variabel. Contohnya, ketika melakukan request menambah catatan, kita akan mendapatkan id catatan tersebut dari server. Id tersebut perlu disimpan pada variabel agar dapat digunakan oleh request selanjutnya.

Variabel tak hanya digunakan untuk kasus tersebut saja, melainkan juga dapat untuk menyimpan nilai token, auth-key, atau nilai lainnya yang dipakai selama proses pengujian.

Environment dapat digunakan pada collection atau spesifik request. Untuk menggunakan variabel environment pada request, tuliskan nama variabelnya yang dibungkus dengan kurung kurawal ganda. 


Tidak ada komentar: