<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: dino</title>
    <description>The latest articles on DEV Community by dino (@dinobaggio).</description>
    <link>https://dev.to/dinobaggio</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F77619%2F613db99c-48f5-4b36-8f3e-04397d4b1aa8.jpeg</url>
      <title>DEV Community: dino</title>
      <link>https://dev.to/dinobaggio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/dinobaggio"/>
    <language>en</language>
    <item>
      <title>Membuat starter pack project dan sistem autentikasi secara singkat menggunakan AI</title>
      <dc:creator>dino</dc:creator>
      <pubDate>Tue, 01 Apr 2025 01:17:00 +0000</pubDate>
      <link>https://dev.to/dinobaggio/membuat-starter-pack-project-dan-sistem-autentikasi-secara-singkat-menggunakan-ai-1laa</link>
      <guid>https://dev.to/dinobaggio/membuat-starter-pack-project-dan-sistem-autentikasi-secara-singkat-menggunakan-ai-1laa</guid>
      <description>&lt;p&gt;Dalam era teknologi saat ini, perkembangan AI berlangsung sangat pesat dan telah menjadi salah satu tren terbesar di dunia programming. Beberapa AI, seperti ChatGPT dan GitHub Copilot, telah menjadi pendamping yang sangat baik bagi programmer/developer. Teknologi ini dapat membantu dalam berbagai tugas sehari-hari, seperti merancang struktur database, memperbaiki bug, membuat fungsi yang lebih efisien, dan masih banyak lagi.&lt;/p&gt;

&lt;p&gt;Kali ini, saya mencoba membuat sistem autentikasi dan proyek awal dengan bantuan dua tools AI, yaitu ChatGPT dan GitHub Copilot. Dengan kedua tools tersebut, proses pembuatan proyek awal dan sistem autentikasi menjadi jauh lebih cepat. Bahkan, dalam waktu singkat, saya sudah dapat membuatnya beserta unit test.&lt;/p&gt;

&lt;p&gt;Sejauh ini, saya menggunakan TypeScript sebagai bahasa utama dalam pengembangan sistem autentikasi ini.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tahap awal pembuatan project menggunakan github copilot
&lt;/h2&gt;

&lt;p&gt;Pada tahap awal pembuatan proyek, saya menggunakan GitHub Copilot dengan prompt &lt;strong&gt;"buatkan starter pack untuk project Express.js dengan TypeScript."&lt;/strong&gt; Tidak lama setelah itu, GitHub Copilot langsung membuat struktur direktori untuk proyek Express.js dengan TypeScript.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniP_MlaEAAZ16m%3Fformat%3Dpng%26name%3D900x900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniP_MlaEAAZ16m%3Fformat%3Dpng%26name%3D900x900" alt="generate awal typescript" width="731" height="690"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selanjutnya, saya mengimplementasikan hasilnya ke dalam folder proyek. Beberapa folder beserta file yang diperlukan berhasil ter-generate dengan baik. Setelah itu, saya mencoba menjalankan server, dan semuanya berjalan dengan lancar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniQa-wa8AAPk4e%3Fformat%3Dpng%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniQa-wa8AAPk4e%3Fformat%3Dpng%26name%3Dsmall" alt="run server awal typescript" width="520" height="164"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Saya kemudian melakukan beberapa penyesuaian agar struktur proyek sesuai dengan kebutuhan.&lt;/p&gt;

&lt;p&gt;Dengan bantuan GitHub Copilot, dalam waktu singkat saya sudah memiliki starter pack yang proper untuk membangun sistem autentikasi. Ini menghemat banyak waktu karena saya tidak perlu lagi mencari starter pack yang sesuai secara manual di GitHub—cukup dengan satu kali generate, hasilnya sudah bisa langsung digunakan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Membuat struktur database untuk sistem autentikasi menggunakan chatgpt
&lt;/h2&gt;

&lt;p&gt;Untuk membuat struktur database sistem autentikasi, saya menggunakan ChatGPT. Kenapa memilih ChatGPT? Karena saya sudah lebih terbiasa menggunakannya untuk menghasilkan struktur database. Meskipun sebenarnya, GitHub Copilot juga bisa digunakan untuk keperluan ini, jadi pemilihannya tergantung selera masing-masing.&lt;/p&gt;

&lt;p&gt;Saya menggunakan prompt &lt;strong&gt;"struktur database untuk membuat API authentication,"&lt;/strong&gt; dan ChatGPT langsung menghasilkan struktur database yang dibutuhkan. Beberapa tabel yang tergenerate antara lain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;users&lt;/li&gt;
&lt;li&gt;password_resets&lt;/li&gt;
&lt;li&gt;roles&lt;/li&gt;
&lt;li&gt;permissions&lt;/li&gt;
&lt;li&gt;role_user&lt;/li&gt;
&lt;li&gt;permission_role&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniRQVTbgAABU2l%3Fformat%3Dpng%26name%3D900x900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniRQVTbgAABU2l%3Fformat%3Dpng%26name%3D900x900" alt="schema database autentikasi" width="692" height="777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dengan struktur database ini, kita sudah memiliki dasar yang cukup untuk membangun sistem autentikasi dengan fitur-fitur seperti:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login user&lt;/li&gt;
&lt;li&gt;Registrasi&lt;/li&gt;
&lt;li&gt;Reset password&lt;/li&gt;
&lt;li&gt;RBAC (Role-Based Access Control) untuk mengatur hak akses pengguna&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Menambahkan konfigurasi database menggunakan sqlite3
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniRqfja8AAglNm%3Fformat%3Dpng%26name%3D900x900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniRqfja8AAglNm%3Fformat%3Dpng%26name%3D900x900" alt="sqlite database" width="807" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Untuk konfigurasi database, saya menggunakan SQLite3 karena proyek ini masih sederhana. SQLite3 cukup praktis karena disimpan secara lokal, dan jika nantinya ingin dikembangkan lebih lanjut, konfigurasi database ini bisa dengan mudah dipindahkan ke sistem yang lebih proper, seperti MySQL atau PostgreSQL.&lt;/p&gt;

&lt;p&gt;Saya menggunakan GitHub Copilot dengan prompt &lt;strong&gt;"tambahkan pada project ini konfigurasi database dengan SQLite3,"&lt;/strong&gt; dan secara otomatis, Copilot menghasilkan file konfigurasi serta panduan instalasi library yang dibutuhkan.&lt;/p&gt;

&lt;p&gt;Pada tahap ini, saya diminta untuk memilih metode ORM antara Knex dan Sequelize di Node.js. Jika melihat popularitasnya di npm, Knex tampaknya lebih banyak digunakan, jadi saya memutuskan untuk memakai Knex sebagai ORM.&lt;/p&gt;

&lt;p&gt;Selanjutnya, saya menggunakan GitHub Copilot untuk mengenerate konfigurasi migration dan seeder dengan prompt &lt;strong&gt;"buatkan konfigurasi migration dan seeder pada Knex."&lt;/strong&gt; Hasilnya, file knexfile.js otomatis tergenerate dan siap diimplementasikan ke dalam folder proyek.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniSBXJacAA53CC%3Fformat%3Dpng%26name%3D900x900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniSBXJacAA53CC%3Fformat%3Dpng%26name%3D900x900" alt="knex config file" width="809" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Membuat migration menggunakan github copilot berdasarkan struktur database yang telah di generate
&lt;/h2&gt;

&lt;p&gt;Selanjutnya, kita membuat migration menggunakan GitHub Copilot untuk mengenerate migration berdasarkan struktur database yang telah dibuat sebelumnya.&lt;/p&gt;

&lt;p&gt;Dari hasil generate sebelumnya, ChatGPT telah menghasilkan query SQL yang bisa digunakan untuk membuat tabel-tabel yang diperlukan. Query tersebut kemudian digunakan sebagai dasar dalam prompt untuk mengenerate migration untuk setiap tabel.&lt;/p&gt;

&lt;p&gt;Sebagai contoh, saya menggunakan prompt berikut untuk membuat migration tabel users:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;buatkan migration untuk table 
--- 
CREATE TABLE users (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    email_verified_at TIMESTAMP NULL DEFAULT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan prompt ini, GitHub Copilot berhasil mengenerate file migration untuk tabel users dengan baik. Setelah itu, saya cukup menjalankan perintah &lt;strong&gt;knex migrate:latest&lt;/strong&gt;, dan tabel users otomatis dibuat di database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniSfMNaMAAVq4M%3Fformat%3Dpng%26name%3D900x900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniSfMNaMAAVq4M%3Fformat%3Dpng%26name%3D900x900" alt="migration knex" width="801" height="608"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selanjutnya, saya mengimplementasikan semua query untuk dijadikan file migration. Namun, ada beberapa error yang terjadi dalam proses ini, sehingga saya perlu menyesuaikan kembali file migration agar semuanya berjalan dengan lancar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Membuat seeder user admin
&lt;/h2&gt;

&lt;p&gt;Untuk dapat login ke aplikasi, kita membutuhkan user pertama sebagai admin. Oleh karena itu, kita perlu membuat seeder menggunakan GitHub Copilot.&lt;/p&gt;

&lt;p&gt;Proses pembuatan seeder ini mirip dengan pembuatan migration, tetapi saya ingin menambahkan role admin pada user yang dibuat. Oleh karena itu, saya menggunakan prompt berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;buatkan seeder untuk user dengan role admin dengan sekema sebagai berikut:
--- 
CREATE TABLE users (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL,
    email_verified_at TIMESTAMP NULL DEFAULT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);  

CREATE TABLE roles (
    id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) UNIQUE NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);  

CREATE TABLE role_user (
    user_id BIGINT UNSIGNED NOT NULL,
    role_id BIGINT UNSIGNED NOT NULL,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
    FOREIGN KEY (role_id) REFERENCES roles(id) ON DELETE CASCADE
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dengan menyertakan tabel users, roles, dan role_user dalam prompt, GitHub Copilot dapat mengenerate seeder sesuai dengan kebutuhan kita.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniS-BnbIAEU-gp%3Fformat%3Dpng%26name%3D900x900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniS-BnbIAEU-gp%3Fformat%3Dpng%26name%3D900x900" alt="seeder knex" width="813" height="820"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah file seeder berhasil tergenerate, saya mengimplementasikannya ke dalam folder proyek dan menjalankan perintah berikut &lt;strong&gt;knex seed:run&lt;/strong&gt;. Setelah perintah dieksekusi, seeder berhasil dijalankan, dan kini kita sudah memiliki user awal dengan role admin untuk login ke sistem autentikasi.&lt;/p&gt;

&lt;h2&gt;
  
  
  Implementasi sistem autentikasi menggunakan github copilot
&lt;/h2&gt;

&lt;p&gt;Setelah database dan seeder siap, kita lanjut ke implementasi sistem autentikasi pada proyek. Untuk menjaga struktur kode yang bersih dan terorganisir, saya memutuskan untuk menggunakan &lt;em&gt;repository pattern&lt;/em&gt;. Dengan cara ini, kita dapat memisahkan &lt;em&gt;persistence logic&lt;/em&gt; dari controller.&lt;/p&gt;

&lt;p&gt;Langkah pertama adalah membuat file &lt;strong&gt;AuthRepository&lt;/strong&gt; di dalam folder repositories. Di dalam file &lt;strong&gt;AuthRepository&lt;/strong&gt;, saya membuat fungsi login. Saya menggunakan GitHub Copilot dengan prompt "buatkan fungsi login menggunakan JWT," dan Copilot secara otomatis menghasilkan fungsi login di file &lt;strong&gt;AuthRepository&lt;/strong&gt;, lengkap dengan fungsi untuk &lt;strong&gt;AuthController&lt;/strong&gt; dan route.&lt;/p&gt;

&lt;p&gt;Sebelum itu, kita perlu menginstall library JWT dan bcrypt sesuai dengan petunjuk dari GitHub Copilot.&lt;/p&gt;

&lt;p&gt;Setelah itu, saya mengimplementasikan kode tersebut ke dalam folder proyek dan menjalankan endpoint login. Saya mencoba login menggunakan email dan password yang telah disediakan dalam seeder. Hasilnya, login berhasil dengan response token JWT yang diterima.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniTYHqboAAJLzZ%3Fformat%3Dpng%26name%3D900x900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniTYHqboAAJLzZ%3Fformat%3Dpng%26name%3D900x900" alt="fungsi login repository auth" width="821" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniTYHtboAAr2Ol%3Fformat%3Dpng%26name%3Dmedium" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniTYHtboAAr2Ol%3Fformat%3Dpng%26name%3Dmedium" alt="fungsi login controller auth" width="935" height="602"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dengan keberhasilan login ini, kita sudah tahu pola dasar untuk membuat fungsi lainnya, seperti reset password dan registrasi. Kita hanya perlu menggunakan prompt otomatis dari GitHub Copilot untuk menghasilkan fungsi-fungsi tersebut.&lt;/p&gt;

&lt;p&gt;Contoh prompt untuk fitur-fitur lain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Registrasi:
&lt;strong&gt;"buatkan fungsi registrasi"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Reset Password:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;implement reset password dengan mekanisme tabel ini
---
CREATE TABLE password_resets (
email VARCHAR(255) NOT NULL,
token VARCHAR(255) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniUCzzaEAAZ0gg%3Fformat%3Dpng%26name%3D900x900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniUCzzaEAAZ0gg%3Fformat%3Dpng%26name%3D900x900" alt="registrasi dan reset password fungsi" width="626" height="745"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniUC0IbIAAzSFc%3Fformat%3Dpng%26name%3D900x900" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniUC0IbIAAzSFc%3Fformat%3Dpng%26name%3D900x900" alt="registrasi dan reset password fungsi reposory" width="815" height="844"&gt;&lt;/a&gt;   &lt;/p&gt;

&lt;h2&gt;
  
  
  Membuat unittest
&lt;/h2&gt;

&lt;p&gt;Untuk memastikan bahwa kode yang kita tulis berjalan sesuai harapan dan tetap bekerja dengan benar setelah dilakukan perubahan atau pengembangan lebih lanjut, kita perlu membuat unit test.&lt;/p&gt;

&lt;p&gt;Langkah pertama adalah menginstal library dan melakukan konfigurasi unit test pada proyek. Saya menggunakan GitHub Copilot dengan prompt &lt;strong&gt;"tambahkan unittest,"&lt;/strong&gt; dan Copilot menyarankan untuk menginstal library Jest. Setelah itu, Copilot juga otomatis mengenerate file &lt;strong&gt;jest.config.js&lt;/strong&gt; yang bisa langsung kita implementasikan ke dalam folder proyek.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniU9asbUAA0s4E%3Fformat%3Dpng%26name%3Dsmall" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniU9asbUAA0s4E%3Fformat%3Dpng%26name%3Dsmall" alt="jest config file" width="388" height="220"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setelah konfigurasi Jest selesai, kita bisa mulai membuat unit test. Untuk membuat unit test pertama, saya menggunakan prompt "Buatkan unittest untuk fungsi login." GitHub Copilot langsung menggenerate file unit test yang sesuai dengan yang kita inginkan. Kemudian, saya mengimplementasikan file tersebut ke dalam folder proyek.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniU9anbgAAZcUu%3Fformat%3Djpg%26name%3D4096x4096" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpbs.twimg.com%2Fmedia%2FGniU9anbgAAZcUu%3Fformat%3Djpg%26name%3D4096x4096" alt="unittest fungsi login" width="2218" height="902"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Untuk menjalankan unit test, kita cukup menggunakan perintah &lt;code&gt;jest&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Jika ada error, saya sesuaikan kembali kode unit testnya dengan bantuan GitHub Copilot untuk memperbaiki masalah yang muncul. Setelah berhasil menjalankan unit test untuk fungsi login, kita dapat melanjutkan untuk membuat unit test bagi fungsi lainnya, seperti registrasi dan reset password.&lt;/p&gt;

&lt;p&gt;Jika terjadi masalah lagi, kita bisa menggunakan file test yang sudah berhasil untuk referensi. Cukup sesuaikan dengan file test pertama dan jalankan kembali unit test-nya, seharusnya semuanya sudah berjalan dengan baik.&lt;/p&gt;

&lt;h2&gt;
  
  
  Kesimpulan
&lt;/h2&gt;

&lt;p&gt;Pada era ini, AI sangat membantu dalam proses pengembangan sebuah proyek. Yang sebelumnya, tanpa AI, kita mungkin membutuhkan waktu berjam-jam atau bahkan berhari-hari untuk menyelesaikannya. Dengan bantuan AI, kita bisa membuat aplikasi yang proper dan dapat digunakan dalam waktu yang sangat singkat.&lt;/p&gt;

&lt;p&gt;Namun, ada baiknya jika kita juga mengerti secara teknis mengenai kode yang dibuat oleh AI. Dengan pemahaman tersebut, kita bisa lebih mudah mengidentifikasi dan memperbaiki masalah yang mungkin muncul, sehingga proses pengembangan dapat berjalan lebih lancar dan efektif.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>typescript</category>
      <category>chatgpt</category>
      <category>githubcopilot</category>
    </item>
    <item>
      <title>Cara membuat migrations dengan Goose pada Golang</title>
      <dc:creator>dino</dc:creator>
      <pubDate>Thu, 01 Feb 2024 03:36:12 +0000</pubDate>
      <link>https://dev.to/dinobaggio/cara-membuat-migrations-dengan-goose-pada-golang-268c</link>
      <guid>https://dev.to/dinobaggio/cara-membuat-migrations-dengan-goose-pada-golang-268c</guid>
      <description>&lt;p&gt;Migration adalah salah satu aspek yang penting dalam pengembangan perangkat lunak. Ini memungkinkan developer untuk mengelola perubahan struktural dalam database, seperti menambahkan kolom baru, mengubah nama tabel, atau membuat indeks baru dengan cara yang terkelola dan dapat direplikasi dengan mudah.&lt;/p&gt;

&lt;p&gt;Goose adalah sebuah alat yang membantu dalam mengelola migration database dengan mudah dan efisien, terutama dalam proyek yang menggunakan bahasa pemrograman Go. Dalam artikel ini, kita akan membahas penggunaan Goose untuk melakukan migration database dalam proyek Go.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apa itu Goose?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Goose adalah sebuah alat yang terinspirasi dari alat migration database Rails, yaitu ActiveRecord. Ini memungkinkan developer untuk mendefinisikan migration database sebagai file Go yang dapat dijalankan untuk memperbarui schema database. Goose menyediakan alat bantu yang efektif untuk melakukan perubahan struktural pada database dengan aman.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 1: Install Goose&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Pertama-tama, Anda perlu menginstal Goose. Anda dapat melakukannya dengan perintah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;install &lt;/span&gt;github.com/pressly/goose/v3/cmd/goose@latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Hal ini akan menginstall binary &lt;code&gt;goose&lt;/code&gt; kedalam directory &lt;code&gt;$GOPATH/bin&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Untuk pengguna macOS Anda bisa lakukannya dengan perintah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;brew &lt;span class="nb"&gt;install &lt;/span&gt;goose
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Lebih lengkap bisa baca dokumentasi &lt;a href="https://pressly.github.io/goose/installation/"&gt;installation instructions&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 2: Inisialisasi Struktur Project&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Buatlah folder &lt;code&gt;goose-migration&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;goose-migration &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;cd &lt;/span&gt;goose-migration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian inisiasi mod module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go mod init goose-migration
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya buat folder &lt;code&gt;config&lt;/code&gt; dan file &lt;code&gt;database.go&lt;/code&gt; untuk menyimpan konfigurasi koneksi ke database.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;config &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;cd &lt;/span&gt;config &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;touch &lt;/span&gt;database.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy script konfig dibawah ini ke dalam &lt;code&gt;database.go&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"database/sql"&lt;/span&gt;
    &lt;span class="s"&gt;"flag"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;

    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="s"&gt;"github.com/go-sql-driver/mysql"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;DBConfig&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;hostname&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;port&lt;/span&gt;       &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;user&lt;/span&gt;       &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;password&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;database&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;dbConfig&lt;/span&gt; &lt;span class="n"&gt;DBConfig&lt;/span&gt;

    &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"127.0.0.1"&lt;/span&gt;
    &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"3307"&lt;/span&gt;
    &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"root"&lt;/span&gt;
    &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"password"&lt;/span&gt;
    &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"goose-migration"&lt;/span&gt;
    &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mysql"&lt;/span&gt;

    &lt;span class="n"&gt;consStr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;":"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"@tcp("&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;":"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;")/"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"?parseTime=true"&lt;/span&gt;
    &lt;span class="n"&gt;dsn&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;String&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"dsn"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;consStr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"connection data source name"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Parse&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"missing dsn flag"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;
    &lt;span class="n"&gt;pool&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;dsn&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"unable to use data source name"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;SQLDBConn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;pool&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sesuiakan nilai-nilai dibawah ini, menyesuaikan dengan konfigurasi koneksi yang Anda miliki.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hostname&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"127.0.0.1"&lt;/span&gt;
&lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"3307"&lt;/span&gt;
&lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"root"&lt;/span&gt;
&lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"password"&lt;/span&gt;
&lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;database&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"goose-migration"&lt;/span&gt;
&lt;span class="n"&gt;dbConfig&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connection&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"mysql"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasan singkat terkait script konfigurasi diatas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;pool&lt;/code&gt; adalah variabel global yang akan menyimpan koneksi database.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;DBConfig&lt;/code&gt; adalah struktur data yang menyimpan konfigurasi database seperti &lt;code&gt;hostname&lt;/code&gt;, &lt;code&gt;port&lt;/code&gt;, &lt;code&gt;user&lt;/code&gt;, &lt;code&gt;password&lt;/code&gt;, dan &lt;code&gt;database&lt;/code&gt; yang akan digunakan.&lt;/li&gt;
&lt;li&gt;Fungsi &lt;code&gt;init()&lt;/code&gt; dijalankan secara otomatis ketika package di-load.&lt;/li&gt;
&lt;li&gt;Di dalamnya, kita membuat sebuah variabel &lt;code&gt;dbConfig&lt;/code&gt; yang merupakan instans dari &lt;code&gt;DBConfig&lt;/code&gt; dan menginisialisasikan nilainya.&lt;/li&gt;
&lt;li&gt;Kemudian kita membentuk connection string menggunakan nilai-nilai dari &lt;code&gt;dbConfig&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Flag &lt;code&gt;dsn&lt;/code&gt; digunakan untuk menerima data source name dari command line.&lt;/li&gt;
&lt;li&gt;Selanjutnya, kita membuka koneksi database menggunakan &lt;code&gt;sql.Open()&lt;/code&gt;, dan menyimpan hasilnya ke dalam variabel &lt;code&gt;pool&lt;/code&gt;. Jika terjadi error saat membuka koneksi, program akan keluar dengan pesan error.&lt;/li&gt;
&lt;li&gt;Fungsi &lt;code&gt;SQLDBConn()&lt;/code&gt; digunakan untuk mengembalikan pool koneksi database yang telah dibuat. Hal ini memungkinkan penggunaan koneksi database tersebut di berbagai tempat dalam aplikasi.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Secara keseluruhan, script diatas bertujuan untuk mengatur koneksi ke database MySQL menggunakan Go, dengan memanfaatkan package &lt;code&gt;database/sql&lt;/code&gt; dan driver MySQL yang disediakan oleh &lt;code&gt;github.com/go-sql-driver/mysql&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Selanjutnya buatlah folder &lt;code&gt;migrations&lt;/code&gt; untuk menyimpan file-file migrations.&lt;/p&gt;

&lt;p&gt;Jika masih dalam folder config maka kita kembali ke root folder &lt;code&gt;cd ../&lt;/code&gt; kemudian buat folder &lt;code&gt;migrations&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;migrations
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya buatlah file &lt;code&gt;main.go&lt;/code&gt; untuk menjalankan migration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy script dibawah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"goose-migration/config"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/pressly/goose"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;sqlDB&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SQLDBConn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;goose&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetDialect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"mysql"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;goose&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Up&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sqlDB&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"migrations"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c"&gt;// err := goose.Down(sqlDB, "migrations")&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nb"&gt;panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Penjelasan terkait script &lt;code&gt;main.go&lt;/code&gt; diatas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pertama-tama, kita memperoleh koneksi database dengan memanggil fungsi &lt;code&gt;SQLDBConn()&lt;/code&gt; dari package &lt;code&gt;config&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Selanjutnya, kita memanggil fungsi &lt;code&gt;goose.SetDialect("mysql")&lt;/code&gt; untuk menetapkan dialek SQL yang digunakan, dalam hal ini MySQL.&lt;/li&gt;
&lt;li&gt;Kemudian, kita melakukan migration database ke versi terbaru menggunakan fungsi &lt;code&gt;goose.Up(sqlDB, "migrations")&lt;/code&gt;. Fungsi ini akan mencari file migration di direktori "migrations" dan menjalankan migration tersebut untuk membawa database ke versi terbaru.&lt;/li&gt;
&lt;li&gt;Pilihan lain adalah melakukan rollback migration menggunakan &lt;code&gt;goose.Down(sqlDB, "migrations")&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Secara keseluruhan, script diatas bertujuan untuk menjalankan migration database ke versi terbaru menggunakan package &lt;code&gt;goose&lt;/code&gt;, dengan memanfaatkan koneksi database yang telah dikonfigurasi sebelumnya.&lt;/p&gt;

&lt;p&gt;Setelah kita melakukan inisialisasi awal untuk migration menggunakan goose, maka diharapkan struktur folder akan seperti ini.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;goose-migration
├─── config
│    └─── databse.go
├─── migrations
└─── main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 3: Membuat file migration&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Gunakan perintah &lt;code&gt;goose&lt;/code&gt; untuk membuat file migration baru:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;goose &lt;span class="nt"&gt;-dir&lt;/span&gt; migrations create create_users_table sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy query migration ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="c1"&gt;-- +goose Up&lt;/span&gt;
&lt;span class="c1"&gt;-- +goose StatementBegin&lt;/span&gt;
&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INT&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt; &lt;span class="n"&gt;AUTO_INCREMENT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;uuid&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="nb"&gt;VARCHAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;255&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;updated_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;DEFAULT&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="k"&gt;CURRENT_TIMESTAMP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;deleted_at&lt;/span&gt; &lt;span class="nb"&gt;TIMESTAMP&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- +goose StatementEnd&lt;/span&gt;

&lt;span class="c1"&gt;-- +goose StatementBegin&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;`uuid`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`name`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`email`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;`password`&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;"3d6ebd8d-6a04-449d-b232-bd1ca3ead0bf"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"ADMIN"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"admin@admin.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nv"&gt;"$2a$12$eHHwhkiE6/IEE37g1SLHRe5qcj1bTd26JMqRTdMonrY0hpiYSNJEe"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="c1"&gt;-- +goose StatementEnd&lt;/span&gt;

&lt;span class="c1"&gt;-- +goose Down&lt;/span&gt;
&lt;span class="c1"&gt;-- +goose StatementBegin&lt;/span&gt;
&lt;span class="k"&gt;DROP&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="c1"&gt;-- +goose StatementEnd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ketika menjalankan migration untuk menaikkan versi schema dan rollback kembali, dapat dipisahkan dengan pernyataan &lt;code&gt;+goose Up&lt;/code&gt; dan &lt;code&gt;+goose Down&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Kita juga dapat menjalankan lebih dari satu query SQL saat melakukan migration up, dengan memisahkannya menggunakan &lt;code&gt;StatementBegin&lt;/code&gt; dan mengakhiri dengan &lt;code&gt;StatementEnd&lt;/code&gt;, begitu juga sama pada migration rollback. Pada script di atas, kita melakukan dua eksekusi query. Yang pertama adalah untuk membuat tabel "users", sementara yang kedua adalah untuk menyisipkan data user ke dalam tabel "users".&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 4: Menjalankan Migration&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Selanjutnya kita bisa menjalankan migrations dengan meng-eksekusi file &lt;code&gt;main.go&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Maka jika berhasil outputnya akan seperti ini.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;2024/01/31 06:55:12 OK    20240131052901_create_users_table.sql
2024/01/31 06:55:12 goose: no migrations to run. current version: 20240131052901
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Kesimpulan&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Membuat script fungsi untuk menjalankan migration bertujuan untuk memudahkan konfigurasi koneksi database yang kita miliki, dalam hal ini yang telah kita buat adalah dalam file &lt;code&gt;main.go&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Goose adalah alat migration database yang bermanfaat dalam pengembangan aplikasi berbasis Golang. Dengan menggunakan Goose, developer dapat mengelola perubahan schema database dengan lebih terstruktur dan mudah diikuti. Ini membantu memastikan integritas data dan kompatibilitas aplikasi seiring waktu.&lt;/p&gt;

&lt;p&gt;Dengan mengikuti langkah-langkah di atas, Anda dapat mulai menggunakan Goose dalam proyek Golang Anda untuk mengelola perubahan schema database dengan efisien. Selamat mencoba!&lt;/p&gt;

&lt;p&gt;Check full source code disini: &lt;a href="https://github.com/dinobaggio/goose-migration"&gt;dinobaggio/goose-migration&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>goose</category>
      <category>backend</category>
      <category>developer</category>
    </item>
    <item>
      <title>Cara menggunakan Cobra untuk menjalankan server Golang Gin</title>
      <dc:creator>dino</dc:creator>
      <pubDate>Mon, 29 Jan 2024 01:58:31 +0000</pubDate>
      <link>https://dev.to/dinobaggio/cara-menggunakan-cobra-untuk-menjalankan-server-golang-gin-1ai3</link>
      <guid>https://dev.to/dinobaggio/cara-menggunakan-cobra-untuk-menjalankan-server-golang-gin-1ai3</guid>
      <description>&lt;p&gt;Gin dan Cobra adalah dua alat yang populer dalam ekosistem Go (atau Golang) yang dapat digunakan untuk membuat aplikasi CLI (Command Line Interface) dan aplikasi web secara efisien. Dalam artikel ini, kita akan membahas cara menggunakan keduanya untuk membuat aplikasi CLI sederhana dan aplikasi web dengan Go.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 1: Instalasi Gin dan Cobra&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Langkah pertama adalah instalasi Gin dan Cobra, sebelum instalasi Gin dan Cobra buatlah sebuah root folder project kita yang diberi nama &lt;code&gt;gin-cobra&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;gin-cobra
&lt;span class="nb"&gt;cd &lt;/span&gt;gin-cobra
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Kemudian inisiasi mod module.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;mod&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya instalasi Gin dan Cobra, jalankan perintah dibawah ini untuk intalasi Gin dan Cobra.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get &lt;span class="se"&gt;\&lt;/span&gt;
    github.com/gin-gonic/gin &lt;span class="se"&gt;\&lt;/span&gt;
    github.com/spf13/cobra/cobra
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Setelah proses instalasi selesai, library Gin dan Cobra akan tersedia kedalam aplikasi.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 2: Membuat Directory dan File-File yang dibutuhkan&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Sebelumnya anda telah membuat root folder untuk project yang akan digunakan untuk membuat aplikasi Gin dengan Cobra, tahapan ini adalah untuk membuat directory dan file-file yang akan dibutuhkan untuk menjalankan aplikasi Gin dan Cobra.&lt;/p&gt;

&lt;p&gt;Selanjutnya buatlah file &lt;code&gt;main.go&lt;/code&gt; file ini adalah entry point untuk menjalankan aplikasi Gin dan Cobra.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isian awal untuk file &lt;code&gt;main.go&lt;/code&gt; adalah sebagai berikut:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya buatlah folder &lt;code&gt;bin&lt;/code&gt; dan &lt;code&gt;cmd&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Folder &lt;code&gt;bin&lt;/code&gt; berguna untuk minyimpan syntax aplikasi Gin dimana isinya adalah sebuah code untuk menjalankanserver http dengan host &lt;code&gt;localhost&lt;/code&gt; dan default port &lt;code&gt;3000&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Folder &lt;code&gt;cmd&lt;/code&gt; berguna untuk menyimpan syntax command line Cobra untuk menjalankan code yang telah dibuat pada folder &lt;code&gt;bin&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Jalankanlah perintah dibawah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;bin &lt;span class="se"&gt;\&lt;/span&gt;
    cmd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya buatlah file &lt;code&gt;app.go&lt;/code&gt; pada folder &lt;code&gt;bin&lt;/code&gt; dan file &lt;code&gt;root.go&lt;/code&gt; pada folder &lt;code&gt;cmd&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Dimana telah disebutkan sebelumnya file &lt;code&gt;app.go&lt;/code&gt; pada folder &lt;code&gt;bin&lt;/code&gt; digunakan untuk menyimpan sebuah code untuk menjalankan aplikasi server Gin.&lt;/p&gt;

&lt;p&gt;Dan file &lt;code&gt;root.go&lt;/code&gt; pada folder &lt;code&gt;cmd&lt;/code&gt; untuk menyimpan sebuah code inisiasi awal untuk kebutuhan command line Cobra.&lt;/p&gt;

&lt;p&gt;Maka struktur folder akan seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gin-cobra
├── bin
│   └── app.go
├── cmd
│   └── root.go
└── main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 3: Membuat Aplikasi Web Gin&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Selanjutnya pada file &lt;code&gt;bin/app.go&lt;/code&gt; copy code dibawah ini, script ini nantinya bertujuan untuk menjalankan aplikasi server web Gin&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;
    &lt;span class="s"&gt;"net/http"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/gin-gonic/gin"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Router&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Engine&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;setRoutes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// setRoutes sets up the routes for the application.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;setRoutes&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;router&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Router&lt;/span&gt;
    &lt;span class="n"&gt;router&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GET&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/healthcheck"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;gin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;StatusOK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"It's work"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Run starts the application.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"running"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Panic&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Failed to start the server:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NewApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Initialize&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Berikut adalah penjelasan singkat dari setiap bagian code diatas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;type App struct&lt;/code&gt;: Ini adalah sebuah struktur yang mendefinisikan aplikasi. Struktur ini memiliki satu properti yaitu Router yang bertipe &lt;code&gt;*gin.Engine&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;func (a *App) Initialize()&lt;/code&gt;: Ini adalah method untuk menginisialisasi aplikasi. Method ini membuat router menggunakan &lt;code&gt;gin.Default()&lt;/code&gt; dan memanggil method &lt;code&gt;setRoutes()&lt;/code&gt; untuk menetapkan rute-rute aplikasi.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;func (a *App) setRoutes()&lt;/code&gt;: Ini adalah method untuk menetapkan rute-rute aplikasi. Dalam contoh ini, hanya ada satu rute yaitu &lt;code&gt;/healthcheck&lt;/code&gt; yang akan merespons dengan pesan &lt;strong&gt;"It's work"&lt;/strong&gt; jika diakses.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;func (a *App) Run(addr string)&lt;/code&gt;: Ini adalah method untuk menjalankan server. Method ini mencetak pesan "running" diikuti dengan alamat server yang sedang berjalan, kemudian memulai server HTTP menggunakan &lt;code&gt;http.ListenAndServe()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;func NewApp() *App&lt;/code&gt;: Ini adalah fungsi pembuat (constructor) untuk membuat instance baru dari aplikasi. Fungsi ini membuat instance dari &lt;code&gt;App&lt;/code&gt;, memanggil method &lt;code&gt;Initialize()&lt;/code&gt; untuk menginisialisasinya, dan mengembalikan pointer ke instance tersebut.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dengan demikian, code diatas membuat sebuah aplikasi web sederhana yang dapat menjalankan server HTTP dengan satu rute &lt;code&gt;/healthcheck&lt;/code&gt; yang akan merespons dengan pesan &lt;strong&gt;"It's work"&lt;/strong&gt; jika diakses.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Lankah 4: Membuat Command Line untuk menjalankan server menggunakan Cobra&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Kemudian pada file &lt;code&gt;cmd/root.go&lt;/code&gt; buatlah sebuah inisiasi awal untuk menjalankan aplikasi command line Cobra, pada file ini kita tidak akan menggunakannya untuk menjalankan server, melainkan file ini hanya bertujuan untuk root awal command line saja.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;cmd &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nb"&gt;touch &lt;/span&gt;root.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/spf13/cobra"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rootCmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;"gin-cobra"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Short&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"gin-cobra menjalankan sebuah aplikasi server dengan command line"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// some code&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rootCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Whoops. There was an error while executing your CLI '%s'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya buatlah file &lt;code&gt;serve.go&lt;/code&gt; di dalam file ini kita akan membuat sebuah script untuk menjalankan aplikasi web server yang telah kita buat sebelumnya pada file &lt;code&gt;bin/app.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;serve.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy code dibawah ini kedalam file &lt;code&gt;cmd/serve.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"gin-cobra/bin"&lt;/span&gt;

    &lt;span class="s"&gt;"github.com/spf13/cobra"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;serveCmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;"serve"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Short&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"command untuk menjalankan aplikasi server gin-cobra"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewApp&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"3000"&lt;/span&gt;
        &lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;rootCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;serveCmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Berikut adalah penjelasan singkat tentang setiap bagian code diatas:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;code&gt;var serveCmd = &amp;amp;cobra.Command{...}&lt;/code&gt;: Ini adalah definisi dari command &lt;code&gt;serve&lt;/code&gt; menggunakan library Cobra. Command ini digunakan untuk menjalankan aplikasi server &lt;code&gt;gin-cobra&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;func init() {...}&lt;/code&gt;: Ini adalah fungsi &lt;code&gt;init()&lt;/code&gt; yang digunakan untuk melakukan inisialisasi pada package. Di sini, command &lt;code&gt;serveCmd&lt;/code&gt; ditambahkan ke root command (&lt;code&gt;rootCmd&lt;/code&gt;) pada file &lt;code&gt;cmd/root.go&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Selanjutnya pada root folder tambahkan script dibawah ini pada file &lt;code&gt;main.go&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"gin-cobra/cmd"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Lankah 5: Menjalankan aplikasi server dengan command line&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Pada tahapan ini kita sudah bisa menjalankan sebuah aplikasi server menggunakan command line, cukup jalankan perintah dibawah ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run &lt;span class="nb"&gt;.&lt;/span&gt; serve
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Selanjutnya akan muncul log seperti dibawah ini, maka aplikasi server kita sudah berhasil dijalankan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.

[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] GET    /healthcheck              --&amp;gt; gin-cobra/bin.(*App).setRoutes.func1 (3 handlers)
running :3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Kesimpulan&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Dengan menggunakan Cobra dan Gin, Anda dapat dengan mudah membuat aplikasi CLI dan aplikasi web menggunakan Go. Kedua alat ini menyediakan abstraksi yang kuat untuk mempercepat pengembangan dan memungkinkan Anda fokus pada logika bisnis aplikasi Anda.&lt;/p&gt;

&lt;p&gt;check full source code disini: &lt;a href="https://github.com/dinobaggio/gin-cobra"&gt;dinobaggio/gin-cobra&lt;/a&gt;&lt;/p&gt;

</description>
      <category>go</category>
      <category>gin</category>
      <category>cobra</category>
      <category>backend</category>
    </item>
    <item>
      <title>Cara menggunakan cobra pada golang &amp; membangun aplikasi basis command line</title>
      <dc:creator>dino</dc:creator>
      <pubDate>Sat, 27 Jan 2024 10:40:17 +0000</pubDate>
      <link>https://dev.to/dinobaggio/cara-menggunakan-cobra-pada-golang-membangun-aplikasi-basis-command-line-4i7m</link>
      <guid>https://dev.to/dinobaggio/cara-menggunakan-cobra-pada-golang-membangun-aplikasi-basis-command-line-4i7m</guid>
      <description>&lt;p&gt;Cobra adalah sebuah library di Golang yang digunakan untuk membuat aplikasi command line (command-line applications) dengan fitur-fitur yang kuat dan ekstensibel. Dengan Cobra, Anda dapat dengan mudah membuat perintah, sub-perintah, dan opsi pada aplikasi command line Golang Anda. Dalam artikel ini, kita akan membahas langkah-langkah dasar dalam menggunakan Cobra untuk mengembangkan aplikasi command line.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 1: Instalasi Cobra&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Langkah pertama adalah menginstal library Cobra. Anda dapat melakukannya dengan menjalankan perintah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get &lt;span class="nt"&gt;-u&lt;/span&gt; github.com/spf13/cobra/cobra
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 2: Membuat Folder cmd dan command&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Buatlah sebuah folder bernama &lt;code&gt;cmd&lt;/code&gt; dan create file dengan nama &lt;code&gt;root.go&lt;/code&gt; file tersebut akan menajadi file basis perintah yang akan di eksekusi di awal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;cmd 
&lt;span class="nb"&gt;cd &lt;/span&gt;cmd
&lt;span class="nb"&gt;touch &lt;/span&gt;root.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;maka struktur folder akan seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;cobra-app
├── cmd
│   └── root.go
└── main.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 3: Membuat command pertama&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Buatlah sebuah perintah pertama dan import package Cobra:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/spf13/cobra"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gunakan fungsi &lt;code&gt;cobra.Command&lt;/code&gt; untuk membuat perintah utama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rootCmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;"cobra-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Short&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Aplikasi command line sederhana dengan Cobra"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;`Ini adalah contoh aplikasi command line sederhana yang dikembangkan dengan menggunakan Cobra di Golang.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Kode yang akan dijalankan ketika perintah utama dijalankan&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Halo dari aplikasi command line!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Buatlah fungsi &lt;code&gt;Execute&lt;/code&gt; untuk menjalankan perintah pertama yang akan di letakan pada file utama &lt;code&gt;main.go&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rootCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Whoops. There was an error while executing your CLI '%s'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;maka full of code pada file &lt;code&gt;root.go&lt;/code&gt; akan seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/spf13/cobra"&lt;/span&gt;
    &lt;span class="s"&gt;"os"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;rootCmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;"cobra-app"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Short&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Aplikasi command line sederhana dengan Cobra"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Long&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="s"&gt;`Ini adalah contoh aplikasi command line sederhana yang dikembangkan dengan menggunakan Cobra di Golang.`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c"&gt;// Kode yang akan dijalankan ketika perintah utama dijalankan&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Halo dari aplikasi command line!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rootCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Stderr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Whoops. There was an error while executing your CLI '%s'"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 4: Membuat sub command&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Buatlah sebuah file &lt;code&gt;greet.go&lt;/code&gt; untuk menjalan sub command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;touch &lt;/span&gt;greet.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;buatlah perintah&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/spf13/cobra"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;greetCmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;"greet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Short&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Sapa pengguna"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Halo! Selamat datang di aplikasi command line."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;buatlah fungsi &lt;code&gt;init&lt;/code&gt; dan tambahkan sub-command greet kedalam root command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NOTE: fungsi init digunakan untuk menjalankan kode inisialisasi sebelum program utama dimulai.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;rootCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greetCmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;maka full of code pada file &lt;code&gt;greet.go&lt;/code&gt; akan seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;cmd&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
    &lt;span class="s"&gt;"github.com/spf13/cobra"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;greetCmd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;Use&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="s"&gt;"greet"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Short&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s"&gt;"Sapa pengguna"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;Run&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmd&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;cobra&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Command&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Halo! Selamat datang di aplikasi command line."&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;init&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;rootCmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AddCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;greetCmd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 5: Tambahkan root command kedalam main package&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Panggilang fungsi &lt;code&gt;Execute&lt;/code&gt; pada root command kedalam &lt;code&gt;main.go&lt;/code&gt; seperti ini:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"cobra-app/cmd"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;cmd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Execute&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Langkah 6: Menjalankan aplikasi&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Anda bisa menjalankan aplikasi menggunakan perintah:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Halo dari aplikasi command line!
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;dan&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go run &lt;span class="nb"&gt;.&lt;/span&gt; greet
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Halo! Selamat datang di aplikasi command line.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  &lt;strong&gt;Kesimpulan&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Dengan menggunakan Cobra, Anda dapat dengan mudah membuat aplikasi command line yang terstruktur dan mudah di-maintain. Library ini menyediakan banyak fitur tambahan seperti penanganan sub command, validasi input, dan dokumentasi otomatis. Jadi, mulailah mengintegrasikan Cobra dalam proyek Golang Anda untuk membangun aplikasi command line yang kuat dan bersih.&lt;/p&gt;

</description>
      <category>go</category>
      <category>cobra</category>
    </item>
  </channel>
</rss>
