Sunday, February 23, 2025

Ekstensi Python untuk VS Code: Pendamping Coding Terbaik!

 Python

Jika Anda seorang pengembang Python, ada satu ekstensi VS Code yang tidak boleh Anda lewatkan—Python Extension for VS Code

Ekstensi ini meningkatkan pengalaman coding Anda dengan berbagai fitur canggih seperti IntelliSense, debugging, linting, dan dukungan lingkungan virtual, semuanya dalam satu paket ringan namun luar biasa. Ucapkan selamat tinggal pada pengaturan yang merepotkan dan nikmati pengembangan Python yang lebih lancar dan efisien! 

Mengapa Anda Membutuhkan Ekstensi Python untuk VS Code

Masih ragu mengapa ekstensi ini wajib dimiliki? Simak fitur-fitur luar biasa berikut! 

1. IntelliSense dan Autocomplete yang Canggih 

Bosankah Anda mengetik nama fungsi yang panjang? Ekstensi ini membawa IntelliSense ke VS Code, memberikan saran kode real-time, parameter fungsi, dan bahkan pratinjau docstring.

Contoh:

Mulai ketik import os, dan ekstensi ini akan menyarankan fungsi serta atribut yang tersedia dari modul os. Seperti memiliki asisten coding pribadi langsung di editor Anda! 

2. Debugging Terintegrasi: Selamat Tinggal Print Statements!

Lupakan kebiasaan menyebarkan print() di seluruh kode Anda! Dengan dukungan debugging bawaan, Anda bisa:  Menetapkan breakpoint  Melangkah melalui kode baris demi baris  Memeriksa variabel dan ekspresi 

Semua tanpa meninggalkan VS Code! Cukup tekan F5, dan Anda langsung menjadi ahli debugging. 

3. Linting dan Formatting untuk Kode yang Lebih Rapi 

Apakah kode yang berantakan membuat Anda stres? Ekstensi ini mendukung linter populer seperti Pylint, Flake8, dan Black, memastikan kode Anda selalu mengikuti praktik terbaik secara otomatis.

Contoh:

Alih-alih memperbaiki masalah spasi secara manual, cukup aktifkan Black, tekan Ctrl+S, dan lihat kode Anda diformat secara instan! 

4. Dukungan Lingkungan Virtual & Jupyter Notebook 

Sering beralih antar proyek dengan dependensi berbeda? Tidak masalah! Ekstensi ini secara otomatis mendeteksi dan mengaktifkan lingkungan virtual (venv, Conda, Poetry) untuk menjaga ketertiban dependensi Anda.

Jika Anda tertarik dengan data science, ekstensi ini juga mendukung Jupyter Notebooks di dalam VS Code. Analisis data, visualisasi grafik, dan jalankan kode Python secara interaktif—semuanya dalam satu tempat! 

5. Pengujian Cepat dan Mudah 

Menjalankan pengujian jadi lebih mudah dengan dukungan bawaan untuk pytest, unittest, dan nose2. Cukup konfigurasikan kerangka uji Anda, dan VS Code akan secara otomatis mendeteksi serta menjalankan pengujian hanya dengan satu klik. 

Kelebihan dan Kekurangan Ekstensi Python untuk VS Code

Inilah yang membuat ekstensi ini luar biasa (dan beberapa hal yang bisa ditingkatkan).

Kelebihan 

IntelliSense yang canggih untuk coding lebih cepat. Debugging bawaan tanpa pengaturan tambahan. Linting dan formatting kode secara otomatis. Manajemen lingkungan virtual yang mulus. Integrasi Jupyter Notebook untuk data science. Gratis dan terus diperbarui oleh Microsoft! 

Kekurangan 

Bisa terasa lambat saat menangani proyek besar.  Beberapa fitur memerlukan konfigurasi tambahan (misalnya, mengatur linter).  Terkadang bermasalah saat beralih antar lingkungan virtual.

Kesimpulan: Layak Dipasang atau Tidak?

Tentu saja layak!  Baik Anda pemula maupun ahli, Python Extension for VS Code adalah alat yang wajib dimiliki untuk meningkatkan produktivitas Anda dan membuat pengembangan Python jadi lebih mudah. Dari IntelliSense hingga debugging, dukungan Jupyter, dan pengujian yang praktis—ekstensi ini memiliki semuanya!

Jadi, tunggu apa lagi? Instal sekarang dan tingkatkan pengalaman coding Python Anda!

MongoDB for VS Code: Bikin Ngoding Database Jadi Makin Santai!

 MongoDB for VS Code

Kalau kamu sering pakai MongoDB dalam proyekmu dan capek bolak-balik antara terminal dan kode editor, ada kabar baik! Ekstensi MongoDB for VS Code hadir untuk membuat hidupmu lebih mudah!

Ekstensi ini memungkinkanmu mengelola database langsung dari VS Code tanpa harus membuka Compass atau mengetik perintah di terminal terus-menerus. Lebih praktis, lebih cepat, dan pastinya lebih santai!

Fitur Ajaib MongoDB for VS Code

Kenapa ekstensi ini wajib dicoba? Ini dia fitur-fiturnya!

1. Koneksi ke Database Super Gampang!

Cukup klik beberapa kali, kamu sudah bisa terhubung ke server MongoDB, baik lokal maupun di cloud (MongoDB Atlas). Bye-bye konfigurasi ribet!

Contoh Koneksi:

  1. Buka tab MongoDB Explorer di VS Code.
  2. Klik + Add Connection.
  3. Masukkan URI koneksi (contoh: mongodb+srv://username:password@cluster.mongodb.net/test).
  4. Boom! Sekarang kamu bisa mengakses database langsung dari VS Code! 

2. Jelajahi dan Kelola Koleksi dengan Mudah 

Dengan MongoDB Explorer, kamu bisa melihat database, koleksi, dan dokumen tanpa perlu menjalankan perintah manual di terminal.

Contoh:

  • Klik database yang ingin dibuka.
  • Klik koleksi untuk melihat dokumen di dalamnya.
  • Tambahkan, edit, atau hapus data langsung dari VS Code! 

3. Menjalankan Query Langsung di VS Code! 

Nggak perlu buka shell MongoDB, cukup tulis query di file .mongodb dan jalankan langsung!

Contoh Query:

// Menampilkan semua dokumen dalam koleksi 'users'
db.users.find({})
// Menampilkan user dengan usia di atas 25 tahun
db.users.find({ age: { $gt: 25 } })

Cukup tekan Ctrl + Enter, dan hasilnya langsung muncul! 

4. Autocompletion dan IntelliSense untuk Query

Sering lupa sintaks query MongoDB? Tenang! Ekstensi ini punya fitur autocompletion dan IntelliSense yang akan membantumu menulis query dengan lebih cepat dan akurat.

5. Eksport dan Import Data dengan Praktis

Ingin backup atau migrasi data? Dengan ekstensi ini, kamu bisa mengekspor data ke JSON atau CSV dan mengimpornya dengan sekali klik!

Kelebihan dan Kekurangan MongoDB for VS Code

Yuk, kita lihat plus dan minusnya!

Kelebihan 

Koneksi mudah ke MongoDB lokal maupun cloud.  Bisa menjelajahi dan mengelola database langsung dari VS Code.  Query langsung di editor tanpa buka terminal.  Autocompletion dan IntelliSense untuk query MongoDB.  Fitur export dan import data yang praktis.  Gratis dan open-source! 

Kekurangan 

Masih perlu konfigurasi tambahan untuk fitur advanced.  Belum mendukung semua fitur admin MongoDB seperti Compass.  Bisa sedikit lambat jika database sangat besar.

Kesimpulan: Wajib Coba atau Skip?

Jawabannya? Wajib Coba! Jika kamu sering bekerja dengan MongoDB dan menggunakan VS Code, ekstensi ini akan sangat membantu produktivitasmu. Dengan fitur koneksi yang mudah, query langsung di editor, serta pengelolaan data yang praktis, MongoDB for VS Code adalah alat yang wajib ada di toolkit-mu!

Jadi, tunggu apa lagi? Install sekarang dan rasakan kemudahannya!


Saturday, February 22, 2025

Rust-Analyzer: Sang Jenius yang Membuat Ngoding Rust Lebih Santai!

rust-analyzer

Jika kamu seorang programmer yang mencintai Rust, pasti pernah mengalami momen di mana otak terasa seperti overclock akibat error kompilasi yang super kompleks. Nah, kenalan dulu dengan Rust-Analyzer, sebuah ekstensi Visual Studio Code (VSCode) yang bakal jadi jimat keberuntunganmu dalam ngoding Rust! 

Rust-Analyzer ibarat asisten pribadi yang membantumu menulis kode Rust lebih efisien, lebih cepat, dan yang paling penting: lebih sedikit sakit kepala! 

Fitur Ajaib Rust-Analyzer

Apa yang membuat Rust-Analyzer menjadi senjata wajib bagi para Rustacean (programmer Rust)? Berikut beberapa fitur terbaiknya:

1. Autocompletion Lebih Pintar dari Dosenmu 

Rust-Analyzer menawarkan fitur autocompletion yang nggak asal-asalan. Beda dengan teman sok tahu, Rust-Analyzer benar-benar memahami kode yang kamu tulis! Misalnya, saat kamu mengetik dan butuh metode tertentu, Rust-Analyzer akan memberikan saran yang relevan tanpa bikin pusing.

Contoh:

struct Person {
    name: String,
    age: u8,
}

impl Person {
    fn new(name: &str, age: u8) -> Self {
        Self { name: name.to_string(), age }
    }

    fn greet(&self) {
        println!("Halo, nama saya {} dan saya berusia {} tahun!", self.name, self.age);
    }
}

fn main() {
    let person = Person::new("Alice", 30);
    person.greet(); // Rust-Analyzer membantu autocompletion di sini
}

2. Jump to Definition: Klub Anti Nyasar! 

Pernah merasa nyasar mencari di mana sebuah fungsi atau struct dideklarasikan? Tenang! Dengan Rust-Analyzer, cukup tekan Ctrl + Click dan langsung teleport ke lokasi yang benar. Nggak perlu lagi scrolling tanpa henti seperti orang yang cari jodoh di aplikasi kencan! 

3. Hover Info: Baca Dokumentasi Tanpa Ribet 

Kalau biasanya harus buka browser dan Googling setiap kali mau cek dokumentasi Rust, sekarang nggak perlu lagi! Cukup arahkan kursor ke kode yang bikin penasaran, dan Rust-Analyzer akan menampilkan dokumentasi lengkap dan jelas. Nggak ada alasan buat malas baca dokumentasi lagi! 

4. Inline Hints: Ngoding Rust Jadi Lebih Percaya Diri 

Rust terkenal dengan sistem tipe yang ketat, tapi Rust-Analyzer mengatasinya dengan inline hints. Kini kamu bisa melihat tipe variabel langsung di kode tanpa perlu menebak-nebak. Lebih percaya diri, lebih santai, lebih Rusty! 

Contoh:

fn add(a: i32, b: i32) -> i32 {
    a + b // Rust-Analyzer memberikan petunjuk tipe di sini
}

fn main() {
    let result = add(5, 10);
    println!("Jumlah: {}", result);
}

5. Refactoring yang Bikin Kode Makin Rapi 

Mau mengganti nama variabel? Mengubah fungsi jadi closure? Atau sekadar merapikan kode supaya lebih estetik? Rust-Analyzer menyediakan fitur refactoring yang mudah dan aman, menjaga kode tetap bersih dan mudah dibaca.

Kelebihan dan Kekurangan Rust-Analyzer

Seperti setiap superhero, Rust-Analyzer punya kelebihan dan kekurangan. Yuk, kita lihat!

Kelebihan 

 Gratis dan open-source!  Performa lebih cepat dibandingkan RLS (Rust Language Server).  Integrasi super mulus dengan VSCode.  Banyak fitur yang bikin ngoding lebih menyenangkan.  Aktif dikembangkan dengan pembaruan yang rutin.

Kekurangan 

 Masih dalam pengembangan, jadi kadang ada bug kecil.  Bisa sedikit berat jika digunakan di proyek Rust yang sangat besar.  Belum sepenuhnya mendukung semua fitur RLS (tapi makin lama makin bagus!).

Kesimpulan: Wajib Coba atau Skip?

Jawabannya? Wajib Coba!  Jika kamu seorang developer Rust yang sering menggunakan VSCode, Rust-Analyzer adalah ekstensi yang akan membuat hidupmu lebih mudah. Dari autocompletion pintar, jump-to-definition, hingga refactoring yang praktis, semuanya membantu meningkatkan produktivitas secara signifikan.

Jadi, tunggu apa lagi? Instal sekarang dan rasakan keajaibannya!

Thursday, February 20, 2025

Immediately Invoked Function Expression (IIFE) alias fungsi yang langsung ngebut jalan setelah ditulis

 


Apa yang Sebenarnya Terjadi di Kode Ini?

(async()=>{
    await db.sync();
})();

Nah, kode ini tuh ibarat seorang tukang bangunan yang tiap pagi ngecek rumah (database) sebelum mulai kerja. Kalau rumahnya belum ada temboknya, dia langsung bikin! 

Breakdown Kode Secara Santai

(async()=>{ ... })() → Fungsi Super Kilat 

Kode ini pake Immediately Invoked Function Expression (IIFE), alias fungsi yang langsung ngebut jalan setelah ditulis!

Ibarat orang habis bangun tidur langsung sikat kopi tanpa mikir!
Gak pake tombol "Start", langsung OTW kerja!

Biasanya kalau bikin fungsi kita harus manggil dulu kan? Nah, ini gak perlu! Langsung tancap gas! 

await db.sync(); → Tukang Database Lagi Ngecek Tembok! 

Nah, bagian ini ibarat tukang database yang lagi ngecek bangunan:

Kalau temboknya udah ada? Yaudah lanjut kerja
Kalau belum ada? Langsung disulap biar ada! 

"Bro, ini rumah kok belum ada atapnya? Sikat dulu dong!"

Makanya ada await, biar dia nunggu sampai bangunannya bener-bener siap, baru lanjut ke kerjaan berikutnya!

Kenapa Harus async dan await?

Nah, kalau gak pake await, ini bisa jadi bencana!

Bayangin tukangnya lari ke kamar mandi dulu sebelum ngecek bangunan!
Pas balik, ternyata temboknya belum ada! Wah, kacau!

Makanya await bikin dia SABAR nunggu sampai bangunan beres, baru lanjut ke step berikutnya!

Kenapa Harus Pake IIFE?

Karena kita gak mau ribet, langsung jalanin tanpa harus manggil manual.

Tanpa IIFE:

async function syncDatabase() {
    await db.sync();
}
syncDatabase(); // Harus dipanggil lagi

Ini kayak masak mie tapi lupa ngangkat dari kompor!
Udah ditulis, tapi gak dijalanin, ya percuma dong! 

Versi Lebih Aman (Pake Try-Catch)

Kalau tiba-tiba database mogok? Kita kasih helm ke tukangnya biar gak pingsan!

(async()=>{
    try {
        await db.sync();
        console.log("Database berhasil disinkronisasi! Siap gaspol!");
    } catch (error) {
        console.error("Waduh! Gagal sinkronisasi database!", error);
    }
})();

Tanpa try-catch, kalau error langsung mental!
Pake try-catch, kalau error kita bisa kasih solusi! 

Kesimpulan Singkat (Biar Makin Nyantol)

Kode Analogi Kocak
(async()=>{})() Tukang langsung OTW kerja tanpa harus dipanggil dulu! 
await db.sync(); Ngecek bangunan dulu sebelum lanjut! 
async Supaya bisa nunggu pekerjaan selesai dulu! 
await Jangan buru-buru, sabar dulu sampe database siap! 
try-catch Helm pengaman biar gak pingsan kalau ada error! 

Penutup

Jadi intinya, kode ini itu langsung jalan, nungguin database siap, dan bikin segalanya rapi. Kalau ada masalah, bisa dikasih error handling biar gak ambyar!

Semoga penjelasan ini bikin coding jadi lebih fun!

 

perbedaan export default dan export const dengan analogi sederhana dan contoh nyata

 


Analogi Sederhana

Bayangkan kamu punya restoran:

  • export default → Menu utama restoran
    → Setiap restoran punya satu hidangan andalan yang paling terkenal.
  • export const → Menu tambahan
    → Restoran juga punya beberapa hidangan lain yang bisa dipesan.

Misalnya, di restoran Jepang:

  • Hidangan utama (export default) → Sushi
  • Hidangan tambahan (export const) → Ramen, Takoyaki, Matcha Latte

Saat pelanggan datang:

  • Kalau mereka pesan “menu utama”, mereka akan otomatis dapat Sushi, tanpa harus menyebut nama spesifiknya.
  • Kalau mereka pesan hidangan tambahan, mereka harus menyebut nama makanannya dengan benar.

Perbedaan export default vs export const dalam Kode

Sekarang, kita buat contoh nyata dalam kode JavaScript.

File: restaurant.js

// Menu utama restoran (export default)
export default function sushi() {
    return "This is the best sushi in town!";
}

// Menu tambahan (export const)
export const ramen = () => "Enjoy your hot ramen!";
export const takoyaki = () => "Delicious Takoyaki!";

File: app.js

import sushi, { ramen, takoyaki } from "./restaurant.js"; 

console.log(sushi());     // Output: This is the best sushi in town!
console.log(ramen());     // Output: Enjoy your hot ramen!
console.log(takoyaki());  // Output: Delicious Takoyaki!

Perbedaan yang Terlihat

  1. Ekspor default (sushi) diimpor tanpa {} dan bisa dinamai apa saja saat diimpor.
    import sushiSpecial from "./restaurant.js";
    console.log(sushiSpecial()); // Output: This is the best sushi in town!
    
  2. Ekspor named (ramen, takoyaki) harus diimpor dengan {} dan namanya tidak bisa diubah.
    import { ramen as hotRamen } from "./restaurant.js"; 
    console.log(hotRamen()); // Output: Enjoy your hot ramen!
    
    (Kita bisa mengganti namanya dengan as, tetapi tetap harus pakai {}.)

Perbandingan Lebih Detail

Fitur export default export const
Jumlah ekspor per file Hanya satu Bisa lebih dari satu
Cara mengimpor import bebasNama from "file.js" import { namaAsli } from "file.js"
Bisa ganti nama? Ya, bebas diubah saat impor Tidak langsung, harus pakai as
Perlu {} saat impor? Tidak Ya

Kapan Menggunakan export default dan export const?

Situasi Gunakan export default Gunakan export const
Jika modul hanya memiliki satu fitur utama
Jika modul memiliki banyak fitur independen
Jika ingin bebas mengganti nama saat impor
Jika ingin impor beberapa fitur dari satu file

Contoh di Dunia Nyata

  1. Ekspor default cocok untuk satu fitur utama

    • React.js menggunakan export default untuk komponen utama:
      export default function Button() { return <button>Click me</button>; }
      
      import Button from "./Button.js"; // Bebas mengganti nama
      
  2. Ekspor named cocok untuk banyak fungsi

    • Lodash atau utility functions sering menggunakan export const:
      export const add = (a, b) => a + b;
      export const subtract = (a, b) => a - b;
      
      import { add, subtract } from "./math.js"; // Harus pakai nama yang sesuai
      

Kesimpulan

  • Gunakan export default jika modul hanya memiliki satu hal utama yang akan digunakan.
    (Misalnya: satu fungsi utama, satu class utama, satu komponen utama.)
  • Gunakan export const jika modul memiliki banyak hal yang bisa diekspor dan digunakan secara terpisah.
    (Misalnya: beberapa fungsi helper, beberapa variabel konfigurasi, beberapa kelas.)

Mudah dipahami kan? 

Monday, February 17, 2025

Penjelasan Lengkap Relasi Model Database di Sequelize

 


Sequelize adalah ORM (Object-Relational Mapping) untuk Node.js yang digunakan untuk berinteraksi dengan database SQL seperti MySQL, PostgreSQL, SQLite, dan MSSQL. Salah satu fitur penting dalam Sequelize adalah kemampuannya untuk mendefinisikan relasi antar model.

1. Jenis-Jenis Relasi dalam Sequelize

Sequelize mendukung beberapa jenis relasi dalam database:

  1. One-to-One (1:1) → Satu entitas hanya memiliki satu entitas lain yang terkait.
  2. One-to-Many (1:M) → Satu entitas bisa memiliki banyak entitas terkait.
  3. Many-to-Many (M:N) → Banyak entitas memiliki hubungan dengan banyak entitas lainnya.

2. Implementasi Relasi dalam Sequelize

a) One-to-One Relationship

Dalam relasi 1:1, satu baris dalam tabel A hanya terkait dengan satu baris dalam tabel B.

Contoh Kasus

Misalkan kita punya dua tabel:

  • User (Menyimpan informasi pengguna)
  • Profile (Menyimpan detail tambahan pengguna)

Implementasi di Sequelize

const { Sequelize, DataTypes } = require("sequelize");
const sequelize = new Sequelize("database", "username", "password", {
  dialect: "mysql",
});

// Definisi Model
const User = sequelize.define("User", {
  name: { type: DataTypes.STRING, allowNull: false },
});

const Profile = sequelize.define("Profile", {
  bio: { type: DataTypes.STRING },
});

// Relasi One-to-One
User.hasOne(Profile, {
  foreignKey: "userId",
  as: "profile",
});
Profile.belongsTo(User, {
  foreignKey: "userId",
  as: "user",
});

// Sinkronisasi
sequelize.sync({ force: true }).then(() => console.log("Database synced"));

Penjelasan

  • User.hasOne(Profile) → Menunjukkan bahwa satu user hanya memiliki satu profile.
  • Profile.belongsTo(User) → Menandakan bahwa profile tersebut milik satu user tertentu.
  • foreignKey: "userId" → Menentukan kolom kunci asing (userId) di tabel Profile.

b) One-to-Many Relationship

Dalam relasi 1:M, satu entitas di tabel A bisa memiliki banyak entitas di tabel B.

Contoh Kasus

Misalkan kita memiliki dua tabel:

  • User (Pengguna aplikasi)
  • Post (Postingan yang dibuat pengguna)

Implementasi di Sequelize

const Post = sequelize.define("Post", {
  title: { type: DataTypes.STRING, allowNull: false },
  content: { type: DataTypes.TEXT },
});

// Relasi One-to-Many
User.hasMany(Post, {
  foreignKey: "userId",
  as: "posts",
});
Post.belongsTo(User, {
  foreignKey: "userId",
  as: "author",
});

Penjelasan

  • User.hasMany(Post) → Menunjukkan bahwa satu user bisa memiliki banyak post.
  • Post.belongsTo(User) → Menunjukkan bahwa setiap post dimiliki oleh satu user.
  • foreignKey: "userId" → Menambahkan kolom userId pada tabel Post untuk menghubungkannya ke User.

c) Many-to-Many Relationship

Dalam relasi M:N, banyak entitas di tabel A dapat terkait dengan banyak entitas di tabel B.

Contoh Kasus

Misalkan kita memiliki dua tabel:

  • Student (Mahasiswa)
  • Course (Mata kuliah)

Karena satu mahasiswa bisa mengambil banyak mata kuliah dan satu mata kuliah bisa diikuti oleh banyak mahasiswa, maka kita perlu tabel perantara.

Implementasi di Sequelize

const Student = sequelize.define("Student", {
  name: { type: DataTypes.STRING, allowNull: false },
});

const Course = sequelize.define("Course", {
  title: { type: DataTypes.STRING, allowNull: false },
});

// Relasi Many-to-Many
Student.belongsToMany(Course, { through: "StudentCourses" });
Course.belongsToMany(Student, { through: "StudentCourses" });

Penjelasan

  • Student.belongsToMany(Course, { through: "StudentCourses" }) → Sequelize akan membuat tabel perantara (StudentCourses).
  • Course.belongsToMany(Student, { through: "StudentCourses" }) → Hubungan dua arah, satu mahasiswa bisa memiliki banyak mata kuliah dan sebaliknya.

3. Menggunakan Relasi dalam Query

Setelah mendefinisikan relasi, kita bisa menggunakannya dalam query menggunakan Sequelize.

a) Mengambil Data dengan Relasi (Include)

const getUsersWithProfile = async () => {
  const users = await User.findAll({
    include: [{ model: Profile, as: "profile" }],
  });
  console.log(JSON.stringify(users, null, 2));
};
getUsersWithProfile();

b) Menyimpan Data dengan Relasi

const createUserWithProfile = async () => {
  const user = await User.create(
    {
      name: "John Doe",
      profile: { bio: "Web Developer" },
    },
    { include: [{ model: Profile, as: "profile" }] }
  );
  console.log("User Created:", user.toJSON());
};
createUserWithProfile();

Kesimpulan

  • One-to-One (hasOne - belongsTo) → Contoh: User & Profile
  • One-to-Many (hasMany - belongsTo) → Contoh: User & Post
  • Many-to-Many (belongsToMany - belongsToMany) → Contoh: Student & Course
  • Gunakan include dalam query untuk mengambil data dengan relasi.

Dengan memahami konsep ini, kamu bisa membangun aplikasi berbasis database yang lebih kompleks menggunakan Sequelize! 

 

Penjelasan hasMany dan foreignKey dalam Sequelize


 

Berikut adalah penjelasan detail tentang kode Users.hasMany(Products); dan Products.belongsTo(Users, { foreignKey: 'userId' }); dalam Sequelize:

1. Relasi Antara Users dan Products

Dalam hal ini, kita memiliki dua entitas (model): Users dan Products. Kode ini mendefinisikan hubungan antara kedua model tersebut di mana satu User dapat memiliki banyak Product, dan setiap Product berhubungan dengan satu User.

2. Users.hasMany(Products);

Kode ini mendefinisikan relasi satu ke banyak (one-to-many) antara model Users dan model Products.

  • Users.hasMany(Products): Ini berarti bahwa User dapat memiliki banyak Product. Dalam konteks database, ini mengindikasikan bahwa ada relasi di mana satu entitas pengguna (User) dapat memiliki banyak produk (Products).
  • Relasi ini menyebabkan Sequelize untuk secara otomatis menambahkan kolom userId (sebagai foreign key) di model Products untuk menghubungkan produk dengan pengguna tertentu. Kolom ini akan menyimpan ID pengguna yang memiliki produk tersebut.

Contoh visual dari relasi ini:

  • User memiliki banyak Products.
  • Misalnya, User A memiliki produk Product 1, Product 2, dan Product 3.

3. Products.belongsTo(Users, { foreignKey: 'userId' });

Kode ini mendefinisikan relasi kebalikannya, yaitu Products "berhubungan dengan" atau "milik" User, dengan menambahkan foreign key di model Products.

  • Products.belongsTo(Users, { foreignKey: 'userId' }): Ini menunjukkan bahwa Product milik (belongs to) User. Dalam kata lain, setiap entitas Product berhubungan dengan tepat satu entitas User.
  • Argumen { foreignKey: 'userId' } menentukan bahwa kolom userId di model Products adalah foreign key yang menghubungkan produk dengan pengguna. Jadi, setiap produk akan memiliki kolom userId yang menyimpan ID pengguna yang memiliki produk tersebut.

Contoh visual relasi ini:

  • Product 1 milik User A, maka userId di Product 1 adalah ID milik User A.
  • Product 2 milik User B, maka userId di Product 2 adalah ID milik User B.

4. Ringkasan Relasi:

  • Users.hasMany(Products): Menyatakan bahwa satu User dapat memiliki banyak Product.
  • Products.belongsTo(Users, { foreignKey: 'userId' }): Menyatakan bahwa setiap Product berhubungan dengan satu User melalui kolom userId sebagai foreign key.

5. Struktur Database (Tabel):

  • Tabel Users akan memiliki kolom id sebagai primary key.
  • Tabel Products akan memiliki kolom id sebagai primary key dan userId sebagai foreign key yang mengarah ke id di tabel Users.

Contoh relasi antar tabel:

Users Table Products Table
id (PK) id (PK)
name name
email price
... ...

userId (FK -> Users.id)

6. Keuntungan Relasi Ini:

  • Konsistensi Data: Relasi ini memastikan bahwa setiap produk terhubung dengan pengguna yang valid, dan jika pengguna dihapus, produk yang terkait bisa dihapus secara otomatis (dengan opsi cascading).
  • Kemudahan Query: Dengan relasi ini, kita dapat dengan mudah mendapatkan semua produk yang dimiliki oleh pengguna tertentu, atau mengetahui pengguna siapa yang memiliki produk tertentu.

Misalnya, untuk mendapatkan semua produk milik seorang pengguna, kita dapat menggunakan query seperti ini:

User.findByPk(userId, {
    include: Product
}).then(user => {
    console.log(user.Products); // Menampilkan produk-produk milik user
});

Kesimpulan:

  • Users.hasMany(Products) mendefinisikan hubungan satu ke banyak antara Users dan Products, di mana satu pengguna bisa memiliki banyak produk.
  • Products.belongsTo(Users, { foreignKey: 'userId' }) mendefinisikan bahwa setiap produk hanya dimiliki oleh satu pengguna, dengan userId sebagai foreign key untuk menyimpan referensi ke pengguna tersebut.

 

Sunday, February 16, 2025

Penjelasan detail lengkap tentang DataTypes.UUIDV4 pada Sequelize

 


DataTypes.UUIDV4 adalah sebuah tipe data yang disediakan oleh Sequelize untuk menghasilkan dan menyimpan UUID (Universally Unique Identifier) versi 4 ke dalam kolom database. UUID adalah sebuah string yang secara efektif dapat digunakan untuk mengidentifikasi objek atau entitas secara unik dalam sistem terdistribusi, dan versi 4 dari UUID menggunakan angka acak untuk menghasilkan nilai yang unik.

Berikut adalah penjelasan lebih detail tentang DataTypes.UUIDV4:

1. Apa Itu UUID?

UUID adalah identifier yang digunakan untuk mengenali informasi tanpa harus bergantung pada pusat koordinasi atau entitas pengelola. UUID terdiri dari 32 karakter hexadesimal yang dipisahkan oleh tanda hubung, menghasilkan format yang seperti ini:

xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
  • x adalah angka atau huruf heksadesimal (0-9, a-f).
  • 4 menunjukkan bahwa ini adalah UUID versi 4.
  • y adalah angka heksadesimal dari range 8, 9, a, atau b, yang menunjukkan versi UUID tersebut.

2. UUID Versi 4 (UUIDV4)

UUID versi 4 (UUIDV4) adalah jenis UUID yang paling sering digunakan karena sifatnya yang acak. UUID versi ini tidak bergantung pada timestamp atau informasi jaringan (seperti pada UUID versi 1) sehingga menghasilkan nilai yang lebih sulit ditebak dan sangat unik.

UUIDV4 dibuat dengan cara menghasilkan angka acak (random number) yang mematuhi standar format UUID. Ada banyak algoritma atau pustaka untuk menghasilkan UUIDV4, salah satunya adalah melalui library seperti uuid yang digunakan dalam banyak proyek.

Contoh UUID versi 4:

a3c3e9b4-45f2-4d0a-a4c1-4f72b39c8d8b

3. Penggunaan DataTypes.UUIDV4 dalam Sequelize

Sequelize menyediakan DataTypes.UUIDV4 untuk membantu menghasilkan UUID versi 4 secara otomatis saat membuat model.

Contoh penggunaannya dalam model Sequelize:

import { Sequelize } from "sequelize";
import db from "../config/Database.js";

const { DataTypes } = Sequelize;

const Users = db.define('users', {
    uuid: {
        type: DataTypes.UUIDV4,
        defaultValue: DataTypes.UUIDV4, // Set default to UUIDV4
        allowNull: false,
        primaryKey: true
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    }
}, {
    freezeTableName: true
});

export default Users;
  • type: DataTypes.UUIDV4: Menentukan bahwa kolom uuid akan menggunakan tipe data UUID versi 4.
  • defaultValue: DataTypes.UUIDV4: Menentukan nilai default untuk kolom ini adalah UUID yang dihasilkan secara otomatis dengan versi 4 jika nilai tidak diberikan saat pembuatan entitas.
  • allowNull: false: Kolom ini tidak boleh bernilai null, yang berarti setiap entitas User harus memiliki UUID yang valid.

4. Kelebihan Menggunakan UUIDV4

  • Uniqueness: UUID sangat unik secara global, dan kemungkinan terjadinya duplikasi sangat kecil, bahkan dengan penggunaan skala besar.
  • Keamanan: UUID lebih aman untuk digunakan sebagai identifier karena bersifat acak dan tidak terkait dengan informasi sensitif (seperti waktu atau alamat IP).
  • Distribusi: UUID memungkinkan pembuatan entitas di berbagai sistem yang terdistribusi tanpa memerlukan koordinasi pusat, karena setiap UUID dijamin unik.
  • Portabilitas: UUID tidak terikat pada sistem atau perangkat tertentu, sehingga dapat digunakan di berbagai platform dan aplikasi.

5. Kekurangan UUIDV4

  • Panjang String: UUIDV4 lebih panjang (32 karakter) dibandingkan dengan integer biasa, sehingga bisa mempengaruhi performa database apabila digunakan dalam jumlah besar.
  • Tidak Terkait dengan Urutan Waktu: UUID versi 4 dihasilkan secara acak, jadi tidak ada urutan waktu atau tanggal dalam UUID itu sendiri. Jika urutan waktu diperlukan, UUID versi lain (misalnya UUID versi 1) mungkin lebih cocok.

6. Kapan Menggunakan UUIDV4?

UUIDV4 cocok digunakan ketika:

  • Anda membutuhkan identifier yang unik secara global.
  • Anda bekerja dengan sistem terdistribusi yang tidak ingin bergantung pada ID urutan yang dibangkitkan oleh satu server.
  • Anda ingin menghindari pengungkapan informasi tentang objek yang mungkin tersembunyi di balik ID yang lebih ramah (seperti ID numerik yang bisa diprediksi).

Namun, jika performa menjadi perhatian dan ID numerik lebih efisien, UUIDV4 mungkin bukan pilihan terbaik.

Kesimpulan

DataTypes.UUIDV4 dalam Sequelize memungkinkan Anda untuk menghasilkan dan menyimpan UUID versi 4, yang merupakan identifier unik yang acak. UUID versi 4 sering digunakan karena keunikannya yang sangat tinggi, cocok untuk aplikasi yang terdistribusi atau sistem yang membutuhkan identifikasi entitas secara global yang tidak mudah ditebak.

Membuat tabel user dengan sequelize


 

import {Sequelize} from "sequelize";
import db from "../config/Database.js";

const{DataTypes} = Sequelize;

const Users = db.define('users', {}, {
freezeTableName : true
});

export default Users;

 

Kode tersebut adalah bagian dari model dalam Sequelize, yaitu ORM (Object Relational Mapping) untuk Node.js yang digunakan untuk berinteraksi dengan database SQL seperti MySQL, PostgreSQL, SQLite, dan lainnya. Berikut adalah penjelasan secara rinci:

1. Import Module yang Diperlukan

import { Sequelize } from "sequelize";
import db from "../config/Database.js";
  • import { Sequelize } from "sequelize";
    • Mengimpor objek Sequelize dari modul sequelize, yang merupakan pustaka ORM untuk Node.js.
  • import db from "../config/Database.js";
    • Mengimpor konfigurasi database dari file Database.js. File ini biasanya berisi inisialisasi koneksi ke database menggunakan Sequelize.

2. Ekstraksi DataTypes dari Sequelize

const { DataTypes } = Sequelize;
  • DataTypes adalah objek bawaan dari Sequelize yang menyediakan berbagai tipe data yang bisa digunakan dalam model. Contoh tipe data yang sering digunakan adalah:
    • DataTypes.STRING → untuk menyimpan teks
    • DataTypes.INTEGER → untuk angka integer
    • DataTypes.BOOLEAN → untuk nilai true/false
    • DataTypes.DATE → untuk tanggal dan waktu

3. Mendefinisikan Model Users

const Users = db.define('users', {}, {
    freezeTableName : true
});
  • db.define('users', {}, {...}):

    • Digunakan untuk mendefinisikan model Users yang akan berhubungan dengan tabel users di database.
    • Argumen pertama 'users' adalah nama tabel yang akan digunakan dalam database.
    • Argumen kedua {} adalah objek kosong, yang seharusnya berisi skema kolom, tetapi dalam kode ini tidak ada definisi kolom.
    • Argumen ketiga adalah objek konfigurasi yang berisi opsi tambahan.
  • freezeTableName: true:

    • Opsional, tetapi sangat penting. Dengan mengaktifkan opsi ini, Sequelize tidak akan mengubah nama tabel secara otomatis (misalnya menambahkan huruf "s" secara default).
    • Contoh tanpa freezeTableName: true, jika kita menggunakan 'user', Sequelize akan mengubahnya menjadi 'users'.

4. Ekspor Model

export default Users;
  • Mengekspor model Users agar bisa digunakan di file lain dalam proyek.

Kesimpulan

Kode ini mendefinisikan model Users menggunakan Sequelize, tetapi tidak memiliki skema kolom yang jelas. Untuk membuat model yang lebih fungsional, sebaiknya tambahkan properti kolom seperti ini:

Kode yang lebih lengkap:

import { Sequelize } from "sequelize";
import db from "../config/Database.js";

const { DataTypes } = Sequelize;

const Users = db.define('users', {
    id: {
        type: DataTypes.INTEGER,
        primaryKey: true,
        autoIncrement: true
    },
    name: {
        type: DataTypes.STRING,
        allowNull: false
    },
    email: {
        type: DataTypes.STRING,
        allowNull: false,
        unique: true
    },
    password: {
        type: DataTypes.STRING,
        allowNull: false
    }
}, {
    freezeTableName: true
});

export default Users;

Penjelasan Tambahan

  • Menambahkan atribut ke model (id, name, email, password).
  • Menentukan primaryKey, autoIncrement, allowNull, dan unique untuk memastikan validasi yang lebih baik.
  • Menjadikan freezeTableName: true tetap aktif, agar nama tabel tidak diubah otomatis oleh Sequelize.

Friday, February 14, 2025

Panduan Lengkap Migration & Seeding di Database (Node.js & Sequelize)

 


Saat mengembangkan aplikasi dengan database, kamu pasti akan berurusan dengan struktur database dan data awal. Nah, di sinilah migration dan seeding berperan penting!

  • Migration membantu kamu mengelola perubahan struktur database.
  • Seeding memungkinkan kamu mengisi database dengan data awal (dummy data).

Dalam panduan ini, kita akan belajar:

  • Apa itu migration & seeding?
  • Kenapa penting?
  • Cara membuat migration di Sequelize
  • Cara membuat seeder di Sequelize 
  • Praktik terbaik dalam migration & seeding

Mari kita mulai! 

1. Apa itu Migration & Seeding?

Migration: Mengelola Struktur Database dengan Mudah

Migration di Sequelize adalah cara sistematis untuk membuat, mengubah, dan menghapus tabel database tanpa harus menulis SQL manual setiap kali ada perubahan.

  • Seperti Git untuk database! Kamu bisa membuat versi baru dan kembali ke versi sebelumnya jika ada kesalahan.
  • Otomatisasi perubahan struktur database seperti menambahkan atau menghapus kolom.
  • Memudahkan kolaborasi dalam tim karena semua perubahan tercatat dalam kode.

Tanpa Migration 

  • Menulis SQL manual untuk setiap perubahan.
  • Sulit rollback jika ada kesalahan.
  • Tidak standar antara developer yang berbeda.

Dengan Migration

  • Perubahan database tercatat dengan rapi.
  • Bisa diubah dan dikembalikan ke versi sebelumnya (rollback).
  • Memudahkan tim dalam sinkronisasi database.

Seeding: Mengisi Database dengan Data Dummy

Seeding adalah proses mengisi database dengan data awal secara otomatis.

Membantu testing & development tanpa harus input data manual.
Membuat dummy data untuk pengujian fitur CRUD.
Mempermudah deployment awal dengan data default yang dibutuhkan aplikasi.

2. Instalasi Sequelize CLI

Sebelum menggunakan migration dan seeding, pastikan Sequelize sudah diinstal.

Instal Sequelize dan Database Driver

npm install --save sequelize sequelize-cli
npm install --save pg pg-hstore  # Untuk PostgreSQL
npm install --save mysql2        # Untuk MySQL
npm install --save sqlite3       # Untuk SQLite

Kemudian, inisialisasi Sequelize dalam proyek:

npx sequelize-cli init

Ini akan membuat beberapa folder penting:

├── config
│   ├── config.json   // Konfigurasi database
├── models
│   ├── index.js      // Mengatur koneksi database
├── migrations        // Folder untuk migration
├── seeders           // Folder untuk seeder

3. Membuat dan Menjalankan Migration

Membuat Migration Baru

Gunakan perintah berikut untuk membuat migration:

npx sequelize-cli model:generate --name User --attributes name:string,email:string,age:integer

Ini akan menghasilkan file di folder migrations/, misalnya:

migrations/
└── 20250213084523-create-user.js

Menulis Migration Secara Manual

Buka file migration dan edit sesuai kebutuhan:

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.createTable("Users", {
      id: {
        type: Sequelize.INTEGER,
        autoIncrement: true,
        primaryKey: true,
        allowNull: false,
      },
      name: {
        type: Sequelize.STRING,
        allowNull: false,
      },
      email: {
        type: Sequelize.STRING,
        allowNull: false,
        unique: true,
      },
      age: {
        type: Sequelize.INTEGER,
        allowNull: true,
      },
      createdAt: {
        type: Sequelize.DATE,
        allowNull: false,
      },
      updatedAt: {
        type: Sequelize.DATE,
        allowNull: false,
      },
    });
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.dropTable("Users");
  },
};

Menjalankan Migration

Setelah menulis migration, jalankan perintah:

npx sequelize-cli db:migrate

Hasilnya, tabel Users akan dibuat di database!

4. Rollback Migration (Undo Perubahan)

Jika ingin membatalkan migration terakhir:

npx sequelize-cli db:migrate:undo

Jika ingin membatalkan semua migration:

npx sequelize-cli db:migrate:undo:all

5. Membuat dan Menjalankan Seeder

Membuat Seeder Baru

Gunakan perintah berikut:

npx sequelize-cli seed:generate --name demo-users

Ini akan membuat file di seeders/:

seeders/
└── 20250213085000-demo-users.js

Menulis Seeder

Buka file di seeders/ dan isi dengan data dummy:

module.exports = {
  up: async (queryInterface, Sequelize) => {
    await queryInterface.bulkInsert("Users", [
      {
        name: "John Doe",
        email: "john@example.com",
        age: 30,
        createdAt: new Date(),
        updatedAt: new Date(),
      },
      {
        name: "Jane Doe",
        email: "jane@example.com",
        age: 25,
        createdAt: new Date(),
        updatedAt: new Date(),
      },
    ]);
  },
  down: async (queryInterface, Sequelize) => {
    await queryInterface.bulkDelete("Users", null, {});
  },
};

Menjalankan Seeder

Jalankan perintah berikut untuk mengisi database:

npx sequelize-cli db:seed:all

Menghapus Data Seeder

Jika ingin menghapus data yang telah dimasukkan oleh seeder:

npx sequelize-cli db:seed:undo

Jika ingin menghapus semua seeder:

npx sequelize-cli db:seed:undo:all

6. Best Practices dalam Migration & Seeding

  • Jangan edit migration yang sudah dijalankan! Jika ada perubahan, buat migration baru.
  • Gunakan seeding hanya untuk development/testing, bukan untuk production data.
  • Pastikan seeder memiliki timestamp createdAt dan updatedAt.
  • Gunakan up() untuk menambahkan dan down() untuk menghapus data dengan benar.
  • Gunakan .env untuk mengelola konfigurasi database agar lebih fleksibel.

Kesimpulan: Jadi Master Migration & Seeding di Sequelize!

  • Migration membantu mengelola struktur database tanpa SQL manual.
  • Seeding memungkinkan pengisian database dengan data awal.
  • Sequelize CLI menyediakan perintah mudah untuk membuat migration & seeding.
  • Rollback tersedia untuk membatalkan perubahan jika ada kesalahan.

Dengan migration dan seeding, kamu bisa mengembangkan aplikasi dengan database yang lebih terstruktur, fleksibel, dan mudah dikelola

Sekarang, kamu sudah siap membangun aplikasi database dengan Sequelize seperti seorang profesional! 

Panduan Lengkap Sequelize: ORM Sakti untuk Node.js!

 


Apa Itu Sequelize? 

Sequelize adalah ORM (Object-Relational Mapping) untuk Node.js yang memungkinkan kita berinteraksi dengan database SQL seperti MySQL, PostgreSQL, SQLite, dan MSSQL menggunakan JavaScript. Dengan Sequelize, kamu bisa membuat, membaca, memperbarui, dan menghapus data (CRUD) tanpa harus menulis query SQL manual yang bikin pusing. 

"Dengan Sequelize, hidupmu jadi lebih mudah, seperti pakai cheat code di game! "

Kenapa Harus Pakai Sequelize? 

Lebih Mudah Dibanding SQL Manual

Tidak perlu nulis SELECT * FROM users WHERE age > 20, cukup pakai Sequelize dan semuanya jadi lebih ringkas!

Cross-Database Compatibility

Bisa dipakai untuk berbagai database SQL tanpa perlu ubah banyak kode.

Dukungan Migration dan Seeding

Bisa bikin struktur database tanpa harus bikin tabel manual.

Built-in Validation & Hooks

Bisa memvalidasi data sebelum masuk database dan menjalankan fungsi tertentu sebelum/ sesudah operasi database dilakukan.

Cara Install Sequelize di Node.js 

Sebelum bisa pakai Sequelize, pastikan kamu sudah punya Node.js dan database (MySQL, PostgreSQL, SQLite, dll.) yang siap dipakai.

npm install sequelize sequelize-cli mysql2

Jika pakai PostgreSQL, ganti mysql2 dengan pg pg-hstore. Jika pakai SQLite, ganti dengan sqlite3.

Setup Sequelize 

Kamu bisa menggunakan Sequelize dengan CommonJS (CJS) atau ECMAScript Module (ESM). Pilih yang sesuai dengan proyekmu! 

Setup Sequelize dengan CommonJS (CJS)

const { Sequelize } = require("sequelize");

const sequelize = new Sequelize("database_name", "username", "password", {
  host: "localhost",
  dialect: "mysql", // Bisa diganti dengan 'postgres', 'sqlite', atau 'mssql'
});

sequelize
  .authenticate()
  .then(() => console.log("Database connected!"))
  .catch((err) => console.error("Connection failed!", err));

Setup Sequelize dengan ECMAScript Module (ESM)

import { Sequelize } from "sequelize";

const sequelize = new Sequelize("database_name", "username", "password", {
  host: "localhost",
  dialect: "mysql", // Bisa diganti dengan 'postgres', 'sqlite', atau 'mssql'
});

try {
  await sequelize.authenticate();
  console.log("Database connected!");
} catch (err) {
  console.error("Connection failed!", err);
}

"Kalau koneksi gagal, coba cek ulang username, password, dan pastikan database-nya nyala!" 

Membuat Model Sequelize 

Model adalah representasi tabel di database. Contohnya, kita buat model User dengan kolom name, email, dan age.

Model dengan CommonJS (CJS)

const { DataTypes } = require("sequelize");
const sequelize = require("./database");

const User = sequelize.define("User", {
  name: {
    type: DataTypes.STRING,
    allowNull: false,
  },
  email: {
    type: DataTypes.STRING,
    unique: true,
    allowNull: false,
    validate: {
      isEmail: true,
    },
  },
  age: {
    type: DataTypes.INTEGER,
    allowNull: false,
  },
});

module.exports = User;

Model dengan ECMAScript Module (ESM)

import { DataTypes } from "sequelize";
import sequelize from "./database.js";

const User = sequelize.define("User", {
  name: {
    type: DataTypes.STRING,
    allowNull: false,
  },
  email: {
    type: DataTypes.STRING,
    unique: true,
    allowNull: false,
    validate: {
      isEmail: true,
    },
  },
  age: {
    type: DataTypes.INTEGER,
    allowNull: false,
  },
});

export default User;

CRUD dengan Sequelize 

CRUD bisa dilakukan baik dengan CJS maupun ESM dengan cara yang sama.

Kesimpulan 

Sequelize adalah pilihan terbaik untuk mengelola database dengan Node.js karena mudah digunakan, mendukung banyak database, dan punya fitur lengkap. Dengan ORM ini, kamu bisa menulis kode lebih rapi, cepat, dan efisien.

"Jadi, tunggu apa lagi? Yuk pakai Sequelize dan buat aplikasi Node.js-mu makin powerfull! 

Jangan lupa share artikel ini kalau bermanfaat! 

 

Wednesday, February 12, 2025

Panduan Lengkap Session di Node.js (CJS & ESM) – Biar Backend Kamu Ingat Pengunjungnya!

 


Pernah nggak sih, login ke sebuah situs, lalu setelah pindah halaman langsung disuruh login lagi? Rasanya kayak ketemu temen lama tapi dia lupa nama kita. 

Nah, biar backend Node.js kamu nggak pelupa, kita bisa pakai session

Session ini semacam kartu keanggotaan buat pengguna. Jadi, setelah mereka login, backend bakal mengingat mereka sampai session berakhir atau mereka logout.

Yuk, kita bahas bareng penggunaan session di Node.js dengan CommonJS (CJS) dan ES Module (ESM)! 

1. Apa Itu Session di Node.js?

Session adalah cara backend menyimpan data pengguna sementara di server.
Biasanya session dipakai buat:

  • Mengingat pengguna yang login tanpa harus kirim ulang token di setiap request.
  • Menyimpan preferensi pengguna selama sesi berlangsung.
  • Menghindari pencurian data (lebih aman daripada token di localStorage!).

Bagaimana session bekerja?

  1. Pengguna login → Backend buat session & kasih session ID.
  2. Session ID ini disimpan di cookie di browser pengguna.
  3. Setiap request berikutnya, session ID dikirim ke server.
  4. Backend cek session ID → Kalau valid, pengguna tetap login! 

2. Install Paket express-session

Sebelum mulai, kita perlu install library session di proyek Node.js kita:

npm install express-session

Ini bisa digunakan untuk CJS maupun ESM, jadi kita langsung lanjut ke implementasi!

3. Cara Menggunakan Session di Node.js (CommonJS - CJS)

Kalau proyek kamu masih pakai CommonJS (require), ikuti langkah berikut:

Setup Dasar Session di Node.js (CJS)

Buka atau buat file server.js, lalu tambahkan kode berikut:

const express = require("express");
const session = require("express-session");

const app = express();

// Middleware session
app.use(session({
  secret: "rahasia-super-aman", // Kunci rahasia untuk enkripsi session
  resave: false, // Jangan simpan ulang session kalau tidak berubah
  saveUninitialized: true, // Simpan session meskipun belum ada data
  cookie: { secure: false } // Set ke `true` kalau pakai HTTPS
}));

app.get("/", (req, res) => {
  res.send("Welcome! Session aktif!");
});

// Simpan data di session
app.get("/login", (req, res) => {
  req.session.user = "Oyen"; // Simpan nama pengguna di session
  res.send("Kamu sudah login sebagai Oyen!");
});

// Ambil data session
app.get("/profile", (req, res) => {
  if (req.session.user) {
    res.send(`Halo ${req.session.user}, ini profilmu!`);
  } else {
    res.send("Kamu belum login!");
  }
});

// Logout
app.get("/logout", (req, res) => {
  req.session.destroy(() => {
    res.send("Kamu sudah logout! Sampai jumpa!");
  });
});

app.listen(3000, () => {
  console.log("Server jalan di http://localhost:3000");
});

Bagaimana ini bekerja?

  1. Akses http://localhost:3000/login → Session dibuat dengan user "Oyen".
  2. Akses http://localhost:3000/profile → Backend ingat siapa kamu! 
  3. Akses http://localhost:3000/logout → Session dihapus, kamu jadi anonim lagi.

4. Cara Menggunakan Session di Node.js (ES Module - ESM)

Kalau kamu pakai ES Module (import), jangan lupa tambahkan "type": "module" di package.json:

{
  "type": "module"
}

Setup Session di Node.js (ESM)

Buat file server.mjs dan masukkan kode ini:

import express from "express";
import session from "express-session";

const app = express();

// Middleware session
app.use(session({
  secret: "rahasia-super-aman",
  resave: false,
  saveUninitialized: true,
  cookie: { secure: false }
}));

app.get("/", (req, res) => {
  res.send("Welcome! Session aktif!");
});

// Simpan data di session
app.get("/login", (req, res) => {
  req.session.user = "Oyen";
  res.send("Kamu sudah login sebagai Oyen!");
});

// Ambil data session
app.get("/profile", (req, res) => {
  if (req.session.user) {
    res.send(`Halo ${req.session.user}, ini profilmu!`);
  } else {
    res.send("Kamu belum login!");
  }
});

// Logout
app.get("/logout", (req, res) => {
  req.session.destroy(() => {
    res.send("Kamu sudah logout! Sampai jumpa!");
  });
});

app.listen(3000, () => {
  console.log("Server jalan di http://localhost:3000");
});

Bedanya dengan CJS?

  • Pakai import bukan require.
  • Harus aktifkan ESM di package.json.

5. Opsi Lengkap express-session (Supaya Backend Makin GG! )

Beberapa opsi penting dalam session:

Opsi Kegunaan
secret Kunci rahasia buat enkripsi session. WAJIB DIISI!
resave Kalau true, session disimpan ulang walau tidak berubah. Biasanya pakai false.
saveUninitialized Kalau true, session tetap dibuat meskipun kosong. Biasanya true.
cookie.secure Kalau true, hanya bisa diakses lewat HTTPS. Gunakan false saat di localhost!
cookie.maxAge Batas waktu session dalam milidetik.
store Simpan session di database (MongoDB, Redis, dll.).

Contoh: Atur session biar kadaluarsa setelah 30 menit

app.use(session({
  secret: "rahasia-super-aman",
  resave: false,
  saveUninitialized: true,
  cookie: { maxAge: 30 * 60 * 1000 } // 30 menit
}));

Kesimpulan: Backend Jadi Gak Pelupa Lagi! 

Session membantu backend "mengingat" pengguna tanpa perlu kirim ulang token di setiap request.
Bisa dipakai dengan CommonJS (CJS) atau ES Module (ESM).
Jangan lupa atur cookie & keamanan session, terutama kalau di production!
Bisa disimpan di database (Redis, MongoDB, dll.) biar lebih scalable!

Sekarang backend kamu jadi lebih cerdas dan gak gampang lupa pengguna

#HappyCoding! 

 

Panduan Lengkap CORS di Node.js (CJS & ESM): Biar Backend & Frontend Nggak LDR!

 


Pernah ngalamin error "Blocked by CORS policy" pas nge-fetch API dari frontend ke backend? Rasanya kayak udah sayang, tapi nggak direstui.

Nah, di sinilah CORS (Cross-Origin Resource Sharing) berperan! CORS itu ibarat surat izin pacaran yang ngasih akses frontend buat ngobrol sama backend meskipun beda alamat domain.

Tapi tenang, kita bakal bahas gimana cara mengaktifkan CORS di Node.js baik pakai CommonJS (CJS) maupun ES Module (ESM). Jadi, mau pakai cara lama atau modern, backend kamu bakal tetap ramah! 

Apa Itu CORS dan Kenapa Kita Butuh?

CORS adalah sistem keamanan di browser yang melarang akses dari domain berbeda tanpa izin.

Contohnya:
Backend API: https://api.kucing.com
Frontend: https://kucingpedia.com

Kalau frontend ini coba ambil data dari API tanpa CORS, browser langsung ngegas:

Access to fetch at 'https://api.kucing.com/data' from origin 'https://kucingpedia.com'
has been blocked by CORS policy

Solusinya? Buka akses CORS di backend Node.js biar hubungan frontend-backend makin harmonis! 

Cara Mengaktifkan CORS di Node.js dengan CommonJS (CJS)

Kalau backend kamu pakai CommonJS (CJS), cara setup CORS-nya gini:

Install Middleware CORS

Buka terminal, masuk ke folder proyek Node.js, lalu jalankan:

npm install cors

Beres? Oke, lanjut! 

Implementasi Dasar CORS di Express.js dengan CommonJS

Di file server.js atau index.js, tambahkan kode ini:

const express = require("express");
const cors = require("cors");

const app = express();

// Gunakan CORS
app.use(cors());

app.get("/", (req, res) => {
  res.send("CORS sudah aktif, silakan fetch data dengan bebas!");
});

app.listen(3000, () => {
  console.log("Server jalan di http://localhost:3000");
});

Sekarang backend kamu udah bisa diakses dari mana aja!


Batasi Akses CORS (Biar Backend Nggak Jadi "Terlalu Murah")

Jangan biarkan backend kamu terlalu terbuka ke semua domain! Kita bisa atur hanya domain tertentu yang boleh akses:

const corsOptions = {
  origin: "https://kucingpedia.com", // Hanya domain ini yang boleh akses
  methods: "GET,POST,PUT,DELETE", // Batasi metode HTTP
  allowedHeaders: "Content-Type,Authorization", // Tentukan header yang boleh
};

app.use(cors(corsOptions));

Sekarang kalau ada frontend dari https://hacker.com mau nyelonong, langsung ditolak mentah-mentah! 

Aktifkan CORS untuk Autentikasi (JWT, Cookies, dll.)

Kalau aplikasi kamu pakai JWT token atau session cookie, kamu perlu aktifkan credentials:

const corsOptions = {
  origin: "https://kucingpedia.com",
  credentials: true, // Izinkan cookie/token dikirim dari frontend
};

app.use(cors(corsOptions));

Di frontend juga harus ditambah:

fetch("https://api.kucing.com/data", {
  credentials: "include", // Supaya token/cookie dikirim ke backend
});

Sekarang backend kamu nggak cuma ramah, tapi juga tetap aman

Cara Mengaktifkan CORS di Node.js dengan ES Module (ESM)

Kalau kamu lebih suka sintaks modern pakai ES Module (ESM), begini caranya:

Pastikan Pakai ESM

Secara default, Node.js pakai CommonJS (CJS), jadi kita harus mengaktifkan ESM dengan dua cara:

Cara 1: Ubah nama file jadi .mjs (misal: server.mjs)
Cara 2: Tambahkan "type": "module" di package.json

{
  "type": "module"
}

Kalau udah, kita bisa pakai sintaks import!

Implementasi CORS dengan ES Module (ESM)

Buka file server.mjs dan tambahkan kode ini:

import express from "express";
import cors from "cors";

const app = express();

// Aktifkan CORS
app.use(cors());

app.get("/", (req, res) => {
  res.send("CORS sudah aktif dengan ES Module!");
});

app.listen(3000, () => {
  console.log("Server jalan di http://localhost:3000");
});

Jalankan dengan:

node server.mjs

Sekarang backend kamu sudah modern dan tetap CORS-friendly!

Batasi Akses CORS di ES Module

Sama seperti di CJS, kita bisa kasih akses hanya ke domain tertentu:

const corsOptions = {
  origin: "https://kucingpedia.com",
  methods: ["GET", "POST", "PUT", "DELETE"],
  allowedHeaders: ["Content-Type", "Authorization"],
};

app.use(cors(corsOptions));

Frontend lain tetap ditolak, cuma domain yang sah yang boleh masuk!

Kesimpulan: Backend & Frontend Nggak LDR Lagi!

CORS itu penting buat kasih izin ke frontend supaya bisa akses backend yang beda domain.
CJS vs. ESM:
Pakai require() kalau masih pake CommonJS (CJS)
Pakai import kalau sudah pake ES Module (ESM)
Buka akses ke semua domain atau batasi ke domain tertentu (biar nggak terlalu murah! )
Kalau pakai autentikasi, aktifkan credentials: true biar token/cookie bisa dikirim!

Sekarang backend Node.js kamu nggak jaim lagi!  Silakan tes dan nikmati koneksi frontend-backend yang harmonis!

Kenapa Pakai import Bukan require?

 



Di Node.js, ada dua sistem modul utama:

Jenis Modul Sintaks Dukungan
CommonJS (CJS) const express = require("express"); Standar lama, masih digunakan luas
ES Module (ESM) import express from "express"; Standar modern, direkomendasikan

import express from "express"; adalah sintaks ES Module yang lebih baru dibandingkan dengan require("express") dari CommonJS.


Bagaimana Cara Menggunakan ES Module di Node.js?

Secara default, Node.js masih menggunakan CommonJS, jadi jika ingin menggunakan import, Anda perlu:

a. Menggunakan Ekstensi .mjs

Ubah nama file dari server.js menjadi server.mjs, lalu jalankan dengan:

node server.mjs

b. Menambahkan "type": "module" di package.json

Di file package.json, tambahkan:

{
  "type": "module"
}

Ini memungkinkan Anda menggunakan ES Module di semua file .js dalam proyek.

 

Alternatif dengan CommonJS (require)

Jika proyek Anda belum menggunakan ES Module, bisa tetap menggunakan sintaks CommonJS:

const express = require("express");

Namun, jika ingin menggunakan fitur terbaru JavaScript, disarankan beralih ke ES Module (import).

 

Kesimpulan

  • import express from "express"; adalah cara modern (ES Module) untuk mengimpor Express di Node.js.
  • Memerlukan konfigurasi tambahan ("type": "module" atau .mjs).
  • Alternatif lama adalah require("express"), yang masih banyak digunakan.

Kalau proyek Anda masih menggunakan CommonJS, tetaplah dengan require(), tapi kalau ingin kode lebih modern dan kompatibel dengan ekosistem JavaScript terbaru, gunakan ES Module dengan import

Kenapa menginstal Nodemon secara Global

 


Menginstal nodemon secara global (-g) memungkinkan Anda menjalankannya dari mana saja di sistem tanpa harus menginstalnya ulang di setiap proyek. Berikut beberapa alasan mengapa itu berguna:

1. Bisa Digunakan di Semua Proyek

Dengan instalasi global, Anda bisa langsung menjalankan nodemon tanpa perlu menginstalnya dalam setiap proyek. Misalnya:

nodemon server.js

Tanpa instalasi global, Anda harus menginstalnya dalam setiap proyek:

npm install --save-dev nodemon

Dan menjalankannya dengan:

npx nodemon server.js

2. Memudahkan Pengembangan

Saat Anda sering bekerja dengan Node.js, nodemon mempercepat pengembangan karena secara otomatis me-restart server ketika ada perubahan pada kode.

3. Tidak Mengganggu Dependensi Proyek

Jika Anda menginstal nodemon hanya sekali secara global, maka tidak perlu menambahkannya ke dalam dependensi proyek (package.json). Ini menghemat ruang penyimpanan dan mengurangi konflik antar versi.

Kapan Sebaiknya Menggunakan Instalasi Lokal?

Kadang, lebih baik menginstal nodemon secara lokal (--save-dev), terutama jika:

  • Tim Anda ingin memastikan semua orang menggunakan versi nodemon yang sama dalam proyek.
  • Anda menggunakan CI/CD yang mengandalkan dependensi proyek untuk menjalankan aplikasi.

Tapi kalau hanya untuk kemudahan saat ngoding di komputer sendiri, instalasi global lebih praktis! 

 

Untuk menginstal nodemon secara global di sistem Anda, gunakan perintah berikut di terminal atau command prompt:

npm install -g nodemon

Verifikasi Instalasi

Setelah instalasi selesai, periksa apakah nodemon sudah terpasang dengan menjalankan:

nodemon -v

Jika nomor versi muncul, berarti nodemon telah berhasil diinstal secara global.

Catatan

  • Pastikan Anda sudah menginstal Node.js dan npm di sistem Anda.
  • Jika mengalami masalah izin (EACCES atau permission denied), coba jalankan dengan sudo di Linux/macOS:
    sudo npm install -g nodemon
    
  • Untuk Windows, pastikan Anda menjalankan Command Prompt atau PowerShell sebagai Administrator.
Setelah nodemon terinstal, Anda bisa menjalankan aplikasi Node.js dengan:
nodemon app.js

nodemon akan secara otomatis me-restart server setiap kali ada perubahan pada file. 

Monday, February 10, 2025

Supabase: Si "Firebase" Open Source - ReactJS

 

1. Apa Itu Supabase?

Supabase adalah platform backend open-source yang sering disebut sebagai "alternatif open-source untuk Firebase." Dengan Supabase, kamu bisa menikmati fitur seperti autentikasi, database, dan storage tanpa perlu setup backend sendiri.

2. Kenapa Harus Pakai Supabase?

Supabase menawarkan berbagai fitur keren yang membuat pengembangan aplikasi React jadi lebih mudah:

  • PostgreSQL Database: Database yang kuat dengan dukungan real-time.
  • Authentication: Login dengan email, social login, atau magic link.
  • Storage: Simpan file seperti gambar dan dokumen dengan mudah.
  • Edge Functions: Jalankan kode serverless tanpa perlu setup backend.

3. Cara Integrasi Supabase dengan React

3.1 Install Supabase di Proyek React

Pastikan kamu sudah punya proyek React. Kalau belum, buat dulu:

npx create-react-app my-app
cd my-app

Lalu install Supabase SDK:

npm install @supabase/supabase-js

3.2 Setup Supabase di Proyek

  1. Buka Supabase dan buat akun.
  2. Buat proyek baru dan catat URL serta anon key.
  3. Buat file supabaseClient.js di proyek React dan isi dengan konfigurasi:
// supabaseClient.js
import { createClient } from "@supabase/supabase-js";

const SUPABASE_URL = "YOUR_SUPABASE_URL";
const SUPABASE_ANON_KEY = "YOUR_SUPABASE_ANON_KEY";

const supabase = createClient(SUPABASE_URL, SUPABASE_ANON_KEY);
export default supabase;

4. Menggunakan Supabase Authentication di React

4.1 Login dengan Email

Tambahkan kode ini di komponen React:

import supabase from "./supabaseClient";

const loginWithEmail = async (email, password) => {
  const { user, error } = await supabase.auth.signInWithPassword({ email, password });
  if (error) console.error("Login gagal:", error.message);
  else console.log("Login sukses:", user);
};

Panggil fungsi ini di event handler:

<button onClick={() => loginWithEmail("test@example.com", "password123")}>Login</button>

5. Menyimpan Data di Supabase

Supabase menggunakan PostgreSQL sebagai database utama. Berikut cara menyimpan data pengguna:

const addUser = async () => {
  const { data, error } = await supabase.from("users").insert([
    { name: "John Doe", email: "johndoe@gmail.com" }
  ]);
  if (error) console.error("Gagal menambahkan user:", error.message);
  else console.log("User berhasil ditambahkan!", data);
};

Tambahkan tombol di UI React:

<button onClick={addUser}>Tambah User</button>

6. Menggunakan Supabase Storage

Kalau mau menyimpan file seperti gambar, gunakan Supabase Storage:

const uploadFile = async (file) => {
  const { data, error } = await supabase.storage.from("avatars").upload(`avatar-${Date.now()}`, file);
  if (error) console.error("Gagal upload file:", error.message);
  else console.log("File berhasil diupload!", data);
};

Tambahkan input file di UI:

<input type="file" onChange={(e) => uploadFile(e.target.files[0])} />

7. Deploy Aplikasi React dengan Supabase

Tidak seperti Firebase, Supabase tidak memiliki hosting bawaan. Kamu bisa deploy aplikasi React ke platform seperti Vercel atau Netlify:

npm run build
vercel deploy  # atau netlify deploy

Kesimpulan

Supabase adalah alternatif open-source yang keren untuk Firebase, dengan database PostgreSQL, autentikasi, dan storage yang powerful. Cocok buat yang ingin backend tanpa ribet tapi tetap fleksibel. Yuk, cobain Supabase!

 

Firebase + React - ReactJS

 

1. Kenalan Dulu dengan Firebase

Kalau kamu ingin membuat aplikasi React yang butuh autentikasi, database real-time, atau hosting tanpa ribet, Firebase bisa jadi sahabat terbaikmu! Firebase adalah platform dari Google yang menyediakan berbagai layanan backend tanpa perlu repot bikin server sendiri.

2. Kenapa Harus Firebase?

Firebase cocok buat yang ingin cepat bikin aplikasi tanpa pusing mikirin infrastruktur backend. Beberapa keunggulan Firebase:

  • Realtime Database & Firestore: Simpan dan ambil data secara real-time.
  • Authentication: Login pakai Google, Facebook, atau email gampang banget.
  • Cloud Functions: Bisa bikin fungsi backend tanpa server.
  • Hosting: Deploy aplikasi React dalam hitungan detik.

3. Cara Integrasi Firebase dengan React

3.1 Install Firebase di Proyek React

Pertama, pastikan kamu sudah punya proyek React. Kalau belum, bikin dulu:

npx create-react-app my-app
cd my-app

Lalu install Firebase:

npm install firebase

3.2 Setup Firebase di Proyek

  1. Buka Firebase Console (https://console.firebase.google.com) dan buat proyek baru.
  2. Tambahkan aplikasi web, lalu copy konfigurasi Firebase yang diberikan.
  3. Buat file firebaseConfig.js di dalam proyek React dan isi dengan konfigurasi yang tadi:
// firebaseConfig.js
import { initializeApp } from "firebase/app";

const firebaseConfig = {
  apiKey: "YOUR_API_KEY",
  authDomain: "YOUR_AUTH_DOMAIN",
  projectId: "YOUR_PROJECT_ID",
  storageBucket: "YOUR_STORAGE_BUCKET",
  messagingSenderId: "YOUR_MESSAGING_SENDER_ID",
  appId: "YOUR_APP_ID"
};

const app = initializeApp(firebaseConfig);
export default app;

4. Menggunakan Firebase Authentication di React

Misalkan kita ingin membuat fitur login dengan Google.

4.1 Install Firebase Auth

npm install firebase

4.2 Buat Fungsi Login

Tambahkan kode ini di komponen React:

import { getAuth, signInWithPopup, GoogleAuthProvider } from "firebase/auth";
import app from "./firebaseConfig";

const auth = getAuth(app);
const provider = new GoogleAuthProvider();

const loginWithGoogle = async () => {
  try {
    const result = await signInWithPopup(auth, provider);
    console.log("User Info:", result.user);
  } catch (error) {
    console.error("Error saat login:", error);
  }
};

Tambahkan tombol login di UI React:

<button onClick={loginWithGoogle}>Login dengan Google</button>

5. Menggunakan Firestore untuk Database

Jika ingin menyimpan data ke Firestore, tambahkan kode berikut:

5.1 Install Firestore

npm install firebase

5.2 Setup Firestore

import { getFirestore, collection, addDoc } from "firebase/firestore";
import app from "./firebaseConfig";

const db = getFirestore(app);

const addUser = async () => {
  try {
    await addDoc(collection(db, "users"), {
      name: "John Doe",
      email: "johndoe@gmail.com"
    });
    console.log("User berhasil ditambahkan!");
  } catch (error) {
    console.error("Gagal menambahkan user:", error);
  }
};

Panggil fungsi ini saat tombol diklik:

<button onClick={addUser}>Tambah User</button>

6. Deploy Aplikasi React ke Firebase Hosting

Mau aplikasi React-mu bisa diakses semua orang? Gunakan Firebase Hosting!

6.1 Install Firebase CLI

npm install -g firebase-tools

6.2 Login ke Firebase

firebase login

6.3 Inisialisasi Firebase di Proyek React

firebase init

Pilih Hosting, lalu ikuti langkah-langkahnya.

6.4 Build dan Deploy

npm run build
firebase deploy

Sekarang aplikasi React-mu sudah online! 

Kesimpulan

Firebase dan React adalah kombinasi yang luar biasa untuk membangun aplikasi tanpa ribet setup backend. Dengan Firebase, kamu bisa menambahkan fitur autentikasi, database, dan hosting dengan mudah. Cobain deh!

 

REST API vs GraphQL - ReactJS

 

1. REST API vs GraphQL: Mana yang Lebih Baik?

Kalau sering berurusan dengan pengambilan data di aplikasi React, pasti sudah tidak asing dengan REST API dan GraphQL. Tapi, mana yang lebih baik? Yuk, kita bahas!

2. Apa Itu REST API?

REST API (Representational State Transfer) adalah standar komunikasi berbasis HTTP yang menggunakan endpoint seperti GET, POST, PUT, DELETE.

Contoh REST API:

Misalnya, untuk mendapatkan data pengguna:

GET /users

Untuk menambahkan pengguna baru:

POST /users

Kelebihan REST API:

  • Mudah digunakan: Banyak dokumentasi dan sudah populer.
  • Bekerja dengan baik di berbagai platform.
  • Standar industri: Banyak digunakan dalam berbagai proyek.

Kekurangan REST API:

  • Over-fetching: Mendapatkan lebih banyak data daripada yang dibutuhkan.
  • Under-fetching: Kadang butuh beberapa request untuk mendapatkan data yang diinginkan.
  • Kurang fleksibel: Struktur responsnya sudah ditentukan di backend.

3. Apa Itu GraphQL?

GraphQL adalah query language untuk API yang dikembangkan oleh Facebook. Dengan GraphQL, klien bisa meminta data sesuai kebutuhan, tidak lebih dan tidak kurang.

Contoh Query GraphQL:

Misalnya, kita ingin mendapatkan nama dan email pengguna:

query {
  user(id: 1) {
    name
    email
  }
}

Kelebihan GraphQL:

  • Lebih fleksibel: Hanya mengambil data yang dibutuhkan.
  • Mengurangi jumlah request: Bisa mengambil banyak data dalam satu permintaan.
  • Dokumentasi otomatis: Skema GraphQL bisa langsung menjadi dokumentasi.

Kekurangan GraphQL:

  • Lebih kompleks: Kurva belajar lebih tinggi dibanding REST API.
  • Performa bisa menurun: Query yang kompleks bisa memperlambat server.
  • Belum semua server mendukung: Tidak semua backend memiliki implementasi GraphQL bawaan.

4. Mana yang Harus Dipilih?

  • Pilih REST API jika butuh solusi yang lebih sederhana, cepat diimplementasikan, dan tidak ingin terlalu banyak konfigurasi.
  • Pilih GraphQL jika ingin lebih fleksibel, mengurangi jumlah request, dan memiliki data yang kompleks.

Kesimpulan

Tidak ada yang benar-benar lebih baik antara REST API dan GraphQL, semua tergantung pada kebutuhan proyekmu. Jika ingin fleksibilitas lebih, GraphQL bisa jadi pilihan. Tapi kalau ingin pendekatan standar yang sudah banyak digunakan, REST API tetap menjadi pilihan yang solid.