Lewati ke konten utama
menjadi.dev
Chapter 15.3 Performance Spesialisasi

DataLoader & N+1 Problem

Solusi untuk N+1 query problem

Tujuan Pembelajaran

  • Memahami N+1 problem
  • Bisa menggunakan DataLoader untuk batching

Analogi

Diagram

      N+1 Problem = Tanya 1 guru, kemudian tanya tiap murid satu per satu
DataLoader = Tanya 1 guru, dapatkan semua murid sekaligus
    

DataLoader melakukan batching dan caching untuk menghindari N+1 query

Penjelasan Konsep

N+1 Problem

N+1 Problem adalah masalah performa umum di GraphQL. Client request daftar item, resolver item butuh data relasi. Tanpa optimasi, tiap item trigger 1 query database — total 1 + N query.

Contoh N+1

Query: { authors { name books { title } } } Tanpa DataLoader: 1 query authors + N query books (satu per author). Dengan DataLoader: 1 query authors + 1 query books (batch).

DataLoader

DataLoader dari Facebook melakukan dua hal:

  1. Batching — Kumpulkan load request dalam 1 tick event loop, eksekusi sebagai single batch.
  2. Caching — Hasil load di-cache per-request, data yang sama tidak di-load ulang.

Best Practice

Buat 1 DataLoader instance per-request. DataLoader function menerima array keys, return array values dalam urutan yang sama.

Inti yang Perlu Dipahami

Bagian ini berfokus pada memahami N+1 problem., dan bisa menggunakan DataLoader untuk batching. Jangan terburu-buru menghafal istilahnya. Lebih penting untuk memahami peran setiap konsep dan kapan konsep itu muncul dalam pekerjaan web development.

Saat membaca DataLoader & N+1 Problem, gunakan tujuan belajar sebagai penanda arah. Kalau kamu sudah bisa menjelaskan tujuan itu dengan kata-katamu sendiri, berarti fondasinya mulai terbentuk.

Cara Membayangkannya

DataLoader melakukan batching dan caching untuk menghindari N+1 query. Analogi ini dipakai supaya konsep teknis tidak terasa melayang. Hubungkan setiap istilah dengan perannya: siapa yang meminta, siapa yang memproses, data apa yang berpindah, dan hasil apa yang diharapkan.

Kalau analoginya sudah terasa masuk akal, barulah lihat istilah teknisnya. Cara ini membuat materi lebih mudah dipahami daripada langsung menghafal definisi.

Saat Melihat Contoh Kode

Contoh kode pada chapter ini memakai bahasa typescript. Bacalah contoh kode sebagai ilustrasi alur, bukan sebagai bagian yang harus langsung dihafal. DataLoader batch request jadi single query. Cache per-request.

Perhatikan nama fungsi, urutan langkah, dan data yang berpindah. Biasanya tiga hal itu sudah cukup untuk memahami hubungan antara teori dan praktik.

Konteks dalam Perjalanan Belajar

Setiap konsep di platform ini dipilih karena dipakai di industri. Fokus pada pemahaman, bukan hafalan.

Kamu sudah di bagian lanjutan. Mulai pikirkan bagaimana konsep ini dipakai di dunia kerja — bukan hanya untuk belajar, tapi untuk membangun produk nyata.

Gunakan pertanyaan reflektif dan prompt AI di akhir chapter sebagai latihan aktif. Membaca saja tidak cukup — kamu perlu menjelaskan ulang dengan kata-katamu sendiri.

Contoh Kode

typescript
// DATALOADER SETUP
import DataLoader from 'dataloader';

const userLoader = new DataLoader(async (userIds) => {
  // SINGLE QUERY untuk semua ID
  const users = await db.users.findMany({
    where: { id: { in: userIds } }
  });
  
  // RETURN DALAM URUTAN userIds
  return userIds.map(id => users.find(u => u.id === id));
});

// RESOLVER
const resolvers = {
  Order: {
    user: async (order) => {
      return userLoader.load(order.userId);  // batch + cache
    }
  }
};

// CREATE PER REQUEST
app.use((req, res, next) => {
  req.loaders = {
    user: new DataLoader(batchUsers),
    order: new DataLoader(batchOrders)
  };
  next();
});

Penjelasan Kode

DataLoader batch request jadi single query. Cache per-request.

Prompt AI

Apa itu N+1 problem dan bagaimana DataLoader menyelesaikannya?

Pertanyaan Reflektif

Implementasi DataLoader untuk entity User dan Order.