Sampul buku
Buku Rekayasa Perangkat Lunak · Edisi Pertama
◈ Blueprint Vibe Coding · v1.0

Vibe Coding Cukup Frontend & Backend Saja, atau Full-Stack Next.js PoC??

Panduan teknik memilih tumpukan teknologi di era membangun cepat berbantuan AI: kapan dua sisi terpisah sudah cukup, kapan satu monolit Next.js jadi jalan tercepat menuju bukti konsep. Framework, arsitektur, data, keamanan, deployment, lisensi, hingga SaaS versus on-premise.

Ditulis oleh Galih Prasetyo
Bahasa Indonesia · 17 Bab + Alat Interaktif
Dibaca manusia & agent AI
2026 · Cetakan Pertama
00
Front Matter

Pengantar Penulis

Mengapa pertanyaan "cukup dua sisi atau satu monolit?" adalah keputusan arsitektur pertama Anda.

Setiap proyek perangkat lunak dimulai dari satu pertanyaan yang menipu karena tampak sederhana: "Aku mau bangun apa, dan tumpukan teknologi apa yang paling cepat membawaku ke sana tanpa menyesal enam bulan kemudian?" Buku ini lahir dari pertanyaan itu, khususnya dalam konteks yang kini disebut vibe coding — membangun perangkat lunak dengan cepat, dibantu model AI, mengikuti "getaran" dan intuisi alih-alih ritual rekayasa yang berat.

Vibe coding membuat pembuatan kode terasa lancar: Anda mendeskripsikan maksud, AI menuliskan implementasi, dan iterasi berjalan dalam hitungan menit. Tetapi kecepatan itu menyembunyikan sebuah jebakan. AI dengan senang hati menuliskan kode apa pun yang Anda minta — termasuk arsitektur yang salah untuk masalah Anda. Ia tidak akan menghentikan Anda saat memilih microservices untuk aplikasi yang hanya dipakai 20 orang, atau saat menaruh kunci rahasia di kode frontend. Keputusan arsitektur tetap milik Anda. Buku ini adalah peta untuk keputusan-keputusan itu.

Pertanyaan inti yang menjadi tulang punggung buku ini: untuk sebuah bukti konsep (proof of concept, PoC) atau produk awal, apakah cukup membangun frontend dan backend sebagai dua layanan terpisah, ataukah lebih baik satu aplikasi full-stack Next.js? Jawabannya, seperti hampir semua hal dalam rekayasa, adalah "tergantung" — tetapi tergantung pada faktor-faktor yang bisa dipetakan dengan jelas. Itulah yang buku ini lakukan.

Segala sesuatu harus dibuat sesederhana mungkin, tetapi tidak lebih sederhana dari itu.

Prinsip yang lazim dikaitkan dengan Albert Einstein

Buku ini punya dua jenis pembaca sekaligus, dan itu disengaja. Yang pertama adalah Anda, manusia — developer, founder teknis, mahasiswa, atau siapa pun yang ingin memahami lanskap keputusan sebelum menulis baris kode pertama. Yang kedua adalah agent AI yang mungkin membaca buku ini sebagai konteks saat membantu Anda memrogram. Karena itu strukturnya dibuat rapi dan semantik: heading berjenjang, definisi eksplisit, ringkasan poin, dan blok kode yang benar. Bab 16 menjelaskan secara khusus bagaimana sebuah agent sebaiknya mengonsumsi dokumen ini.

Cakupan

Yang dibahas: pemilihan framework frontend & backend, arsitektur monolith vs microservices, database & data, koneksi FE↔BE, keamanan, UI/UX, tooling, deployment & go-live, license manager, SaaS vs on-premise, Chrome extension, hingga studi kasus nyata.

Yang bukan tujuan: menggantikan dokumentasi resmi tiap alat. Ini peta keputusan, bukan manual API.

Front Matter

Cara Membaca Buku Ini

Tiga cara masuk: baca urut, lompat via daftar isi, atau mulai dari alat pemilih.

Ada tiga cara memakai buku ini, tergantung kebutuhan Anda saat ini:

Konvensi Penulisan

  • ✔ Kotak hijau = praktik yang dianjurkan. ▲ Kotak amber = peringatan / jebakan umum.
  • Setiap bab ditutup blok Poin Kunci — ringkasan padat yang aman dikutip agent AI.
  • Blok kode punya tombol salin dan dapat digulir horizontal.
  • Istilah teknis pertama kali muncul ditulis lengkap, dan semuanya terkumpul di Glosarium.
// Alat Interaktif

Pemilih Tech Stack

Jawab enam pertanyaan singkat. Alat ini akan menyusun rekomendasi tumpukan teknologi — frontend, backend, database, arsitektur, hosting, dan model distribusi — beserta alasannya. Semua berjalan di browser Anda; tidak ada data yang dikirim ke mana pun.

◈ Stack Recommender

Rancang tumpukan Anda dalam 30 detik

Pilih satu opsi per pertanyaan, lalu tekan Susun Rekomendasi.

Catatan untuk agent AI

Logika rekomendasi alat ini bersifat heuristik dan sengaja konservatif: ia condong ke tumpukan paling sederhana yang masih memenuhi kebutuhan. Jika Anda (agent) menyusun rekomendasi serupa untuk pengguna, gunakan kerangka faktor yang sama — jenis proyek, skala, real-time, kebutuhan Python/AI, tempat deploy, ukuran tim — dan jelaskan trade-off, bukan hanya nama alat.

01
Bab Satu

Pendahuluan: Vibe Coding

Membangun cepat berbantuan AI, dan keputusan besar pertama: dua sisi terpisah atau satu monolit Next.js?

Istilah vibe coding dipopulerkan pada awal 2025 oleh Andrej Karpathy untuk menggambarkan gaya membangun perangkat lunak di mana developer "menyerahkan diri pada getaran" dan membiarkan model AI menuliskan sebagian besar kode, sementara manusia berperan sebagai pengarah maksud, penguji, dan pengambil keputusan. Dalam praktiknya, vibe coding berarti Anda mendeskripsikan apa yang diinginkan dalam bahasa alami, AI menghasilkan implementasi, lalu Anda menilai, mengoreksi arah, dan mengiterasi — sering kali tanpa membaca setiap baris kode.

Gaya ini luar biasa untuk kecepatan. Yang dulu butuh sehari kini bisa selesai dalam satu jam. Tetapi ada satu hal yang tidak berubah, dan justru menjadi makin penting: arsitektur tetap tanggung jawab manusia. Model AI mengoptimalkan "menjawab permintaan Anda", bukan "menyelamatkan Anda dari keputusan buruk". Jika Anda meminta microservices, ia memberi microservices. Jika Anda menaruh koneksi database di komponen klien, ia mungkin tetap menuliskannya. Getaran yang bagus tidak menghasilkan arsitektur yang bagus secara otomatis.

Jebakan Vibe Coding

AI tidak akan mengoreksi arsitektur Anda kecuali diminta. Ia akan dengan patuh membangun sistem yang terlalu rumit, tidak aman, atau salah tempat. Kecepatan menulis kode justru memperbesar biaya keputusan yang salah — karena Anda menumpuk lebih banyak kode di atas fondasi yang keliru, lebih cepat.

Anatomi Sebuah Aplikasi Web

Sebelum memutuskan "terpisah atau monolit", kita perlu bahasa bersama. Hampir semua aplikasi web punya tiga lapisan:

Pertanyaan buku ini menyangkut hubungan dua lapisan pertama. Ada dua pola besar:

POLA A — TERPISAH Frontend Backend API HTTP Database 2 repo/deploy · 2 bahasa mungkin skala & tim mandiri per sisi POLA B — MONOLIT NEXT.JS Next.js UI + API routes server actions Database 1 repo/deploy · 1 bahasa (TS)
Gambar 1.1 — Dua pola dasar: frontend/backend terpisah vs full-stack Next.js

Kapan Masing-masing Cukup?

Inti keputusannya bisa diringkas menjadi beberapa pertanyaan penyaring. Monolit Next.js biasanya cukup ketika: proyek Anda berbasis web, tim kecil atau solo, tidak butuh komputasi Python berat, dan skala awal masih wajar. Frontend & backend terpisah menjadi perlu ketika salah satu benar: Anda butuh layanan AI/Python tersendiri, ada beberapa klien berbeda (web + mobile + IoT) yang berbagi satu API, real-time berskala besar, atau tim besar yang perlu bekerja pada sisi berbeda secara independen.

FaktorCondong ke Monolit Next.jsCondong ke Terpisah
Ukuran timSolo / kecilBesar, terbagi FE/BE
Kebutuhan Python/AITidak ada / sekadar panggil APIModel/ML/Python sendiri
Jumlah klienSatu (web)Banyak (web+mobile+publik API)
Real-timeRingan / tidakBerat & berskala
Kecepatan ke PoCPrioritas utamaBukan prioritas utama
Kebutuhan skala mandiriBelumSudah, per komponen

Buatlah berfungsi, buatlah benar, buatlah cepat — dalam urutan itu.

Kent Beck

Urutan Kent Beck ini adalah kompas vibe coding. Untuk PoC, tujuan Anda adalah make it work — dan monolit Next.js hampir selalu jalur tercepat ke sana. Optimasi arsitektur (memisah layanan, menambah cache, memecah microservices) adalah pekerjaan make it fast yang datang belakangan, hanya setelah Anda tahu apa yang benar-benar perlu dioptimalkan.

Poin Kunci Bab 1

  • Vibe coding = membangun cepat berbantuan AI; kecepatan menulis kode naik, tetapi tanggung jawab arsitektur tetap di tangan manusia.
  • Aplikasi web punya tiga lapisan: frontend, backend, database. Keputusan besar pertama adalah pola hubungan FE↔BE.
  • Monolit Next.js cukup untuk mayoritas PoC berbasis web dengan tim kecil tanpa Python berat.
  • Pisahkan FE/BE hanya jika ada pemicu jelas: Python/AI, banyak klien, real-time skala besar, atau tim besar.
  • Ikuti urutan Kent Beck: berfungsi → benar → cepat. Jangan optimasi sebelum ada yang bekerja.
02
Bab Dua

Analisis Framework Frontend

Tujuh keluarga framework, kelebihan, batas, dan kapan masing-masing pantas dipakai.

Frontend adalah wajah aplikasi Anda — satu-satunya bagian yang benar-benar dilihat pengguna. Memilih framework frontend menentukan kecepatan pengembangan, performa, kemudahan mencari kontributor (termasuk seberapa baik AI membantunya), dan batas apa yang bisa Anda capai. Tidak ada pemenang mutlak; ada pemenang untuk konteks tertentu. Bab ini membedah tujuh keluarga besar.

React & Next.js

React adalah pustaka UI berbasis komponen dari Meta, dan menjadi standar de facto industri. Next.js adalah framework di atas React yang menambahkan routing, rendering di server (SSR), pembangkitan statis (SSG), server components, dan API routes. Untuk vibe coding, pasangan ini punya keunggulan besar yang jarang disebut: ia adalah ekosistem dengan data pelatihan terbanyak, sehingga model AI menghasilkan kode React/Next paling akurat dibanding framework lain.

Kelebihan: ekosistem raksasa, komponen siap pakai melimpah (shadcn/ui, Radix), dukungan AI terbaik, full-stack dalam satu framework (Next), karier & talenta luas. Keterbatasan: React sendiri "hanya" pustaka — Anda menyusun banyak keputusan; bundle bisa besar; App Router Next.js punya kurva belajar (server vs client components membingungkan pemula). Pakai saat: mayoritas kasus, terutama jika Anda mempertimbangkan monolit full-stack atau butuh dukungan AI maksimal.

Vue & Nuxt

Vue menawarkan model yang lebih ringan dan sintaks "single-file component" yang banyak disukai karena mudah dibaca. Nuxt adalah padanan Next.js untuk Vue (SSR, routing berbasis file, full-stack). Kelebihan: kurva belajar landai, dokumentasi rapi, reaktivitas elegan. Keterbatasan: ekosistem lebih kecil dari React; dukungan AI & ketersediaan talenta lebih terbatas; komponen pihak ketiga tak sebanyak React. Pakai saat: tim menyukai kesederhanaan Vue, atau proyek tidak menuntut ekosistem sebesar React.

Svelte & SvelteKit

Svelte adalah compiler: alih-alih mengirim runtime besar ke browser, ia mengompilasi komponen menjadi JavaScript kecil dan efisien. SvelteKit adalah framework full-stacknya. Kelebihan: bundle terkecil, performa runtime bagus, kode sangat ringkas, DX menyenangkan. Keterbatasan: ekosistem & komunitas paling kecil di antara "tiga besar"; lebih sedikit contoh untuk AI; talenta langka. Pakai saat: performa & ukuran bundle jadi prioritas, tim kecil yang nyaman merintis, atau proyek personal.

Angular

Angular (Google) adalah framework berbaterai lengkap: routing, forms, HTTP client, DI, semuanya bawaan, dengan TypeScript wajib. Ia beropini kuat. Kelebihan: struktur konsisten untuk tim besar, cocok aplikasi enterprise besar & berumur panjang, tooling matang. Keterbatasan: verbose, kurva belajar curam (RxJS, modul, DI), terasa berat untuk PoC kecil, kurang cocok gaya vibe coding yang lincah. Pakai saat: aplikasi enterprise besar dengan tim besar yang butuh keseragaman dan aturan ketat.

Astro

Astro dirancang untuk situs yang berat konten — blog, dokumentasi, marketing. Filosofinya "zero JS by default": HTML statis dulu, JavaScript hanya di pulau-pulau interaktif (islands) yang Anda tandai. Astro juga bisa menyisipkan komponen React/Vue/Svelte. Kelebihan: performa & SEO luar biasa, sempurna untuk landing & dokumentasi (termasuk buku HTML seperti ini). Keterbatasan: bukan untuk aplikasi kaya interaksi/dashboard. Pakai saat: konten > interaksi — landing page, blog, docs.

SolidJS

SolidJS punya sintaks mirip React (JSX) tetapi dengan reaktivitas fine-grained tanpa virtual DOM, menghasilkan performa sangat tinggi. Kelebihan: performa puncak, API akrab bagi pengguna React. Keterbatasan: ekosistem muda & kecil, dukungan AI terbatas, risiko lebih tinggi untuk proyek jangka panjang. Pakai saat: performa reaktif ekstrem dibutuhkan dan tim bersedia merintis.

HTMX & Vanilla

HTMX membalik tren: alih-alih SPA berat, ia membiarkan HTML meminta fragmen HTML dari server lewat atribut, sehingga interaktivitas dicapai tanpa banyak JavaScript. Vanilla JS (tanpa framework) tetap valid untuk halaman sederhana. Kelebihan: sangat ringan, tanpa build tooling, dekat dengan platform web, pas dipadukan backend yang me-render HTML (Django, Rails, Go). Keterbatasan: tidak scalable untuk UI kompleks/stateful, manajemen state manual. Pakai saat: aplikasi CRUD sederhana, tim backend-centric, atau menghindari kompleksitas SPA.

Tabel Perbandingan Framework Frontend

FrameworkTipeKurvaBundleDukungan AIPaling cocok untuk
React/NextPustaka + framework full-stackSedangSedang–besar★★★★★Mayoritas app & PoC full-stack
Vue/NuxtFramework full-stackLandaiSedang★★★★Tim yang suka kesederhanaan
Svelte/KitCompiler full-stackLandaiKecil★★★Performa & bundle minimal
AngularFramework enterpriseCuramBesar★★★★Enterprise besar, tim besar
AstroSitus konten (islands)LandaiSangat kecil★★★Landing, blog, dokumentasi
SolidJSPustaka reaktifSedangKecil★★Performa reaktif ekstrem
HTMX/VanillaMinimal / no-frameworkLandaiMinimal★★★CRUD sederhana, backend-centric

Batasan Umum Semua Framework Frontend

Apa pun pilihannya, ada batas yang melekat pada kode yang berjalan di browser, dan penting dipahami sejak awal:

Rekomendasi Praktis

Untuk vibe coding, default ke React/Next.js kecuali ada alasan spesifik. Alasannya bukan karena ia "terbaik" secara teknis, melainkan karena dukungan AI, ekosistem komponen, dan ketersediaan solusi membuat Anda bergerak paling cepat dengan risiko paling kecil. Pilih Astro untuk situs konten, dan pertimbangkan Svelte hanya bila performa/bundle jadi kebutuhan nyata.

Poin Kunci Bab 2

  • Tidak ada framework terbaik mutlak; ada yang terbaik untuk konteks tertentu.
  • React/Next unggul karena ekosistem & dukungan AI, menjadikannya default aman untuk vibe coding.
  • Astro untuk konten, Svelte untuk performa/bundle, Angular untuk enterprise besar, HTMX untuk CRUD sederhana.
  • Batas mutlak frontend: tidak ada rahasia, tidak ada akses DB langsung, performa terbatas perangkat pengguna.
03
Bab Tiga

Kebutuhan Backend

Kapan Anda benar-benar butuh backend, opsi apa saja, dan mengapa AI hidup di Python.

Backend adalah bagian yang berjalan di server yang Anda kendalikan: tempat logika bisnis dijalankan dengan aman, data disimpan, otentikasi diverifikasi, dan rahasia dijaga. Pertanyaan pertama bukan "backend apa", melainkan "apakah saya butuh backend sama sekali?"

Kapan Butuh Backend?

Anda butuh backend begitu salah satu dari ini benar:

Anda mungkin tidak butuh backend penuh untuk: situs statis, landing page, brosur digital, atau kalkulator sisi klien. Untuk ini, hosting statis + satu-dua serverless function untuk form sudah cukup.

Optimasi prematur adalah akar dari segala kejahatan (setidaknya sebagian besarnya) dalam pemrograman.

Donald Knuth

Opsi Backend

Node.js — Express & NestJS

Express adalah framework Node minimalis: cepat dimulai, sangat fleksibel, tetapi tanpa struktur bawaan sehingga proyek besar mudah berantakan. NestJS menambahkan arsitektur beropini (modul, controller, service, dependency injection) di atas Node/TypeScript — mirip Angular untuk backend. Keunggulan Node secara umum: satu bahasa (JavaScript/TypeScript) dengan frontend, ekosistem npm raksasa, sangat cocok I/O-bound (banyak koneksi menunggu, seperti API & realtime). Pakai Express untuk API kecil/menengah; pakai NestJS saat tim & codebase tumbuh dan butuh struktur.

Next.js API Routes & Server Actions

Jika frontend Anda Next.js, backend bisa hidup di dalam framework yang sama. Route Handlers (folder app/api) membuat endpoint HTTP; Server Actions memungkinkan fungsi server dipanggil langsung dari komponen tanpa menulis endpoint manual. Ini adalah jantung "monolit full-stack": satu bahasa, satu repo, satu deploy. Batasnya: bukan untuk komputasi berat/berjalan-lama (fungsi serverless punya batas waktu), dan bukan pengganti layanan Python.

Python — FastAPI & Django

FastAPI adalah framework Python modern, cepat, async, dengan validasi tipe (Pydantic) dan dokumentasi OpenAPI otomatis — favorit untuk membungkus model AI/ML sebagai API. Django adalah framework "berbaterai lengkap" (ORM, admin, auth bawaan) untuk aplikasi berbasis data yang besar. Python adalah rumah bagi data science & AI (lihat di bawah).

Go

Go memberi performa tinggi, konkurensi bawaan (goroutine), dan biner tunggal yang mudah di-deploy. Cocok untuk layanan yang menuntut throughput tinggi, latensi rendah, atau infrastruktur (proxy, gateway). Kurang cocok untuk PoC cepat karena lebih verbose dan ekosistem web-nya lebih ramping.

Serverless Functions

Serverless (Vercel Functions, AWS Lambda, Cloudflare Workers) menjalankan fungsi tanpa mengelola server: bayar per eksekusi, skala otomatis. Ideal untuk beban tak menentu & endpoint ringan. Batas: cold start, batas waktu eksekusi, dan kurang cocok untuk koneksi persisten (WebSocket) atau proses panjang.

BaaS — Supabase & Firebase

Backend-as-a-Service memberi Anda database, otentikasi, storage, dan API instan tanpa menulis backend. Supabase berbasis PostgreSQL (SQL, portabel, punya realtime & row-level security). Firebase (Google) berbasis NoSQL (Firestore) dengan realtime kuat dan integrasi mobile mulus. BaaS mempercepat PoC secara dramatis; harganya: lock-in dan kendali lebih rendah saat kebutuhan menjadi rumit.

OpsiBahasaSweet spotHindari saat
ExpressJS/TSAPI kecil/menengah, fleksibelButuh struktur ketat
NestJSTSBackend besar, tim, terstrukturPoC super cepat
Next.js API/ActionsTSMonolit full-stack, PoC webKomputasi berat/panjang
FastAPIPythonLayanan AI/ML, dataTanpa kebutuhan Python
DjangoPythonApp data besar, admin bawaanMicroservice ringan
GoGoThroughput tinggi, infraPoC cepat, tim kecil
ServerlessApa sajaBeban tak menentu, endpoint ringanWebSocket, proses panjang
Supabase/FirebasePoC kilat, realtime, auth instanLogika server kompleks & anti lock-in

Mengapa AI Memakai Python — dan Kapan Itu Memaksa Pemisahan

Ini pertanyaan yang menentukan banyak keputusan arsitektur, jadi mari jelas: ekosistem AI/ML pada dasarnya adalah ekosistem Python. PyTorch, TensorFlow, NumPy, pandas, scikit-learn, Transformers (Hugging Face), LangChain — semuanya native Python. Riset, model, dan tutorial ditulis dalam Python. Jika pekerjaan Anda melibatkan menjalankan atau melatih model sendiri, memproses data numerik berat, atau computer vision, Anda praktis harus di Python.

Namun ada pembedaan penting yang menghemat banyak kerumitan:

Browser Next.js UI BFF / Node auth, orkestrasi FastAPI layanan Python/ML HTTP HTTP Pola "layanan AI terpisah": UI ringan, otak berat di Python
Gambar 3.1 — Memisahkan layanan Python hanya saat Anda menjalankan model sendiri

Poin Kunci Bab 3

  • Butuh backend begitu ada data persisten bersama, auth, rahasia, atau logika yang tak boleh dipercayakan ke klien.
  • Opsi berjenjang: Next API/Actions (paling ringkas) → Express/NestJS → FastAPI/Django → Go → serverless → BaaS.
  • Sekadar memanggil API LLM tidak butuh Python; menjalankan model sendiri praktis memaksa layanan Python terpisah.
  • BaaS (Supabase/Firebase) mempercepat PoC dengan harga lock-in dan kendali lebih rendah.
04
Bab Empat

Full-Stack Next.js sebagai PoC

Satu bahasa, satu repo, satu deploy — kapan monolit Next.js adalah jalan tercepat, dan di mana batasnya.

Untuk sebagian besar bukti konsep berbasis web, Next.js full-stack adalah jawaban paling praktis. Ia menyatukan frontend dan backend dalam satu framework TypeScript, satu proses build, satu proses deploy. Anda tidak perlu memelihara dua repositori, menyelaraskan dua bahasa, atau menyiapkan CORS antar-domain. Untuk tim kecil yang ingin bergerak cepat, penghematan overhead ini sangat besar.

Kapan Next.js Full-Stack Cukup

Monolit Next.js cukup ketika kebutuhan Anda cocok dengan mayoritas PoC web:

Struktur App Router

App Router (Next.js 13+) mengatur routing lewat struktur folder di dalam app/. Setiap folder adalah segmen URL; file khusus punya makna tetap.

tree · struktur proyek
app/
├─ layout.tsx          # kerangka bersama (nav, footer)
├─ page.tsx            # halaman "/"
├─ globals.css
├─ (marketing)/        # route group, tak memengaruhi URL
│  └─ harga/page.tsx   # "/harga"
├─ dashboard/
│  ├─ layout.tsx       # layout khusus dashboard
│  ├─ page.tsx         # "/dashboard"
│  └─ [id]/page.tsx    # "/dashboard/:id" (dinamis)
├─ api/
│  └─ tugas/route.ts   # endpoint HTTP "/api/tugas"
└─ actions.ts          # server actions ("use server")
lib/                   # util, klien db, skema
components/            # komponen UI reusable
prisma/schema.prisma   # definisi database

Server Components vs Client Components

Inovasi terpenting App Router adalah React Server Components (RSC). Secara default, komponen berjalan di server: ia bisa mengambil data langsung (bahkan query database) tanpa endpoint API, dan tidak mengirim JavaScript-nya ke browser. Komponen yang butuh interaktivitas (state, event, useEffect) ditandai dengan "use client" di baris pertama.

tsx · server component mengambil data langsung
// app/dashboard/page.tsx — berjalan di SERVER
import { db } from "@/lib/db";

export default async function Dashboard() {
  // query langsung — tak perlu fetch/endpoint
  const tugas = await db.tugas.findMany();
  return (
    <ul>
      {tugas.map((t) => <li key={t.id}>{t.judul}</li>)}
    </ul>
  );
}
Aturan Praktis RSC

Buat komponen menjadi server component sebisa mungkin (default), dan tambahkan "use client" hanya di daun pohon yang benar-benar interaktif (tombol, form, dropdown). Ini menjaga bundle kecil dan data tetap di server.

API Routes & Server Actions

Route Handlers cocok saat Anda butuh endpoint HTTP nyata (dipanggil klien lain, webhook, mobile). Server Actions cocok untuk mutasi dari form/UI Anda sendiri — tanpa menulis endpoint manual.

ts · server action untuk mutasi form
// app/actions.ts
"use server";
import { db } from "@/lib/db";
import { revalidatePath } from "next/cache";

export async function tambahTugas(formData: FormData) {
  const judul = String(formData.get("judul") ?? "").trim();
  if (!judul) return { error: "Judul wajib diisi" };
  await db.tugas.create({ data: { judul } });
  revalidatePath("/dashboard");
}

Batasan Next.js Full-Stack

Monolit Next.js bukan palu untuk segala paku. Kenali batasnya sebelum menabraknya:

Kesederhanaan adalah prasyarat keandalan.

Edsger W. Dijkstra
Strategi Migrasi Aman

Mulai sebagai monolit Next.js. Saat sebuah kebutuhan menabrak batas di atas (mis. Anda mulai butuh model Python), ekstrak hanya bagian itu menjadi layanan terpisah, dan biarkan sisanya tetap monolit. Anda nyaris tak pernah perlu memecah semuanya sekaligus.

Poin Kunci Bab 4

  • Next.js full-stack menyatukan FE+BE dalam satu bahasa/repo/deploy — jalur tercepat ke PoC web.
  • App Router memakai struktur folder; RSC menjalankan komponen di server secara default, "use client" untuk interaktivitas.
  • Server Actions untuk mutasi UI sendiri; Route Handlers untuk endpoint HTTP publik/eksternal.
  • Batas: komputasi berat, Python/ML, WebSocket berat, penskalaan mandiri — saat menabraknya, ekstrak bagian itu saja.
05
Bab Lima

Arsitektur: Monolith vs Microservices

Mengapa hampir semua PoC harus monolit — dan bentuk monolit yang tidak akan Anda sesali.

Setelah memilih bahasa dan framework, keputusan struktural terbesar adalah: satu aplikasi (monolith) atau banyak layanan kecil (microservices)? Debat ini sering diwarnai hype. Kenyataannya sederhana: untuk PoC dan produk awal, monolith hampir selalu jawaban yang benar — tetapi monolith yang termodularisasi dengan baik, bukan bola lumpur besar.

Definisi

Trade-off

AspekMonolithMicroservices
Kecepatan awalCepat — satu basis kodeLambat — banyak setup
DeploySatu, sederhanaBanyak, butuh orkestrasi
DebuggingMudah — satu proses, satu logSulit — tracing terdistribusi
PenskalaanSeluruhnya sekaligusPer layanan, mandiri
KegagalanSatu jatuh, semua jatuhTerisolasi (jika benar)
Kompleksitas operasionalRendahTinggi (jaringan, versi, data)
Cocok untuk timKecil–menengahBanyak tim independen

Organisasi yang merancang sistem akan menghasilkan desain yang strukturnya meniru struktur komunikasi organisasi tersebut.

Melvin Conway (Hukum Conway)

Hukum Conway adalah alasan diam-diam di balik banyak keputusan arsitektur. Microservices masuk akal ketika Anda punya banyak tim yang perlu bekerja & men-deploy secara independen — struktur perangkat lunak mengikuti struktur tim. Tim solo yang membangun microservices berarti melawan Hukum Conway: menciptakan batas jaringan yang tidak dituntut oleh batas organisasi mana pun. Hasilnya semua ongkos terdistribusi tanpa satu pun manfaatnya.

Jebakan Microservices Dini

Microservices memindahkan kompleksitas dari kode ke jaringan & operasi: latensi antar layanan, konsistensi data terdistribusi, versi API, tracing, service discovery. Untuk PoC, semua ini adalah pajak murni tanpa imbalan. Martin Fowler menyebut pendekatan yang bijak sebagai "MonolithFirst" — mulai monolith, pecah hanya saat rasa sakitnya nyata.

Contoh Struktur Modular Monolith

Rahasia monolith yang sehat adalah batas modul internal yang tegas. Susun kode berdasarkan domain bisnis (fitur), bukan berdasarkan lapisan teknis. Setiap modul memiliki API internalnya sendiri; modul lain memanggil lewat API itu, bukan menyentuh isi dalamnya.

tree · modular monolith berbasis domain
src/
├─ modules/
│  ├─ auth/            # domain: otentikasi
│  │  ├─ service.ts    # logika bisnis (API internal modul)
│  │  ├─ repository.ts # akses data
│  │  ├─ schema.ts     # validasi (zod)
│  │  └─ index.ts      # HANYA ini yang diekspor keluar
│  ├─ billing/         # domain: penagihan
│  │  ├─ service.ts
│  │  ├─ repository.ts
│  │  └─ index.ts
│  └─ tasks/           # domain: tugas
│     ├─ service.ts
│     ├─ repository.ts
│     └─ index.ts
├─ shared/             # util lintas domain (logger, db, errors)
│  ├─ db.ts
│  └─ logger.ts
└─ app/                # lapisan HTTP (routes memanggil service)
   └─ api/...

Aturan emasnya: modul billing tidak boleh mengimpor tasks/repository.ts langsung — ia hanya boleh memanggil tasks/index.ts (API publik modul). Disiplin ini membuat setiap modul bisa "dicabut" menjadi microservice nanti dengan mengganti panggilan fungsi menjadi panggilan jaringan — tanpa menulis ulang logika bisnis.

Kapan Benar-benar Pecah ke Microservices

Pecah sebuah modul menjadi layanan tersendiri hanya saat ada pemicu nyata: (1) modul itu butuh diskalakan sangat berbeda dari sisanya, (2) ditulis dalam bahasa berbeda (mis. layanan Python AI), (3) tim khusus perlu men-deploy independen, atau (4) kebutuhan isolasi kegagalan/keamanan yang tegas. Tanpa salah satu ini, tetap monolit.

Poin Kunci Bab 5

  • Untuk PoC & produk awal, modular monolith hampir selalu pilihan benar — "MonolithFirst" (Fowler).
  • Microservices memindahkan kompleksitas ke jaringan & operasi; hanya berbayar bila ada banyak tim/skala berbeda (Hukum Conway).
  • Susun modul berdasarkan domain bisnis dengan batas tegas; ekspor hanya lewat index.ts tiap modul.
  • Disiplin batas modul memungkinkan ekstraksi ke service nanti tanpa menulis ulang logika.
06
Bab Enam

Data & Database

SQL vs NoSQL, Postgres serverless, caching, desain ERD, migrasi, dan indexing.

Data adalah aset paling berharga sekaligus paling berumur panjang dalam sistem Anda. Framework bisa diganti; data harus bertahan lintas versi, migrasi, bahkan penulisan ulang aplikasi. Karena itu keputusan database layak dipikirkan lebih hati-hati daripada keputusan framework — meski, kabar baiknya, jawaban default untuk mayoritas kasus cukup jelas.

SQL vs NoSQL

Database SQL (relasional) seperti PostgreSQL dan MySQL menyimpan data dalam tabel dengan skema tetap dan relasi antar tabel. Mereka menjamin ACID (Atomicity, Consistency, Isolation, Durability) dan unggul untuk data terstruktur dengan relasi — yang menggambarkan hampir semua aplikasi bisnis.

Database NoSQL mencakup beberapa keluarga: dokumen (MongoDB, Firestore), key-value (Redis, DynamoDB), kolom-lebar (Cassandra), dan graf (Neo4j). Mereka menawarkan skema fleksibel dan penskalaan horizontal, dengan trade-off pada konsistensi dan relasi.

AspekSQL (Postgres)NoSQL (dokumen)
SkemaTetap, tervalidasiFleksibel
RelasiKuat (JOIN)Lemah / manual
KonsistensiACID kuatSering eventual
Query kompleksSangat kuat (SQL)Terbatas
Skala tulis horizontalButuh usahaNative
Cocok untukAplikasi bisnis, transaksiData tak terstruktur, log, katalog besar
Default yang Jarang Salah

Mulai dengan PostgreSQL. Ia relasional, mendukung JSON (jadi bisa "NoSQL saat perlu"), punya ekstensi kaya (pgvector untuk embedding AI, PostGIS untuk geospasial), dan portabel. Untuk 95% aplikasi, Postgres adalah pilihan yang tidak akan Anda sesali. Pilih NoSQL hanya untuk kebutuhan spesifik yang jelas.

PostgreSQL Serverless — Neon

Neon adalah Postgres serverless: memisahkan penyimpanan dari komputasi, bisa scale-to-zero (tidur saat tak dipakai, murah untuk PoC), dan punya fitur branching — membuat salinan database seperti branch git untuk setiap fitur/PR. Alternatif serupa: Supabase (Postgres + BaaS), PlanetScale (MySQL), Turso (SQLite terdistribusi). Untuk vibe coding, Neon + Vercel adalah kombinasi yang sangat lancar.

Caching — Redis / Upstash

Redis adalah penyimpanan key-value in-memory: sangat cepat, dipakai untuk caching hasil query mahal, session store, rate limiting, dan antrian ringan. Upstash menyediakan Redis serverless (bayar per request, cocok serverless/edge). Aturannya: jangan tambahkan cache sampai Anda punya masalah performa yang terukur. Cache menambah satu sumber kebenaran baru yang harus dijaga konsistensinya — kompleksitas yang hanya berbayar saat beban nyata.

Tunjukkan diagram alir dan sembunyikan tabelnya, saya akan tetap bingung. Tunjukkan tabelnya, dan saya biasanya tak perlu diagram alir; ia sudah jelas.

Fred Brooks, The Mythical Man-Month

Contoh Desain ERD

Entity-Relationship Diagram (ERD) memetakan entitas (tabel) dan relasi di antaranya. Berikut ERD ringkas untuk aplikasi SaaS multi-tenant sederhana: sebuah Organization punya banyak User, dan setiap User membuat banyak Task.

Organization PK id name plan created_at User PK id FK org_id email (unique) password_hash role Task PK id FK user_id title, done 1 : N 1 : N
Gambar 6.1 — ERD SaaS multi-tenant: Organization 1:N User 1:N Task

Migrasi dengan Prisma

Prisma adalah ORM TypeScript populer: Anda mendefinisikan skema deklaratif, dan Prisma menghasilkan klien type-safe serta mengelola migrasi (perubahan skema database yang terversi). Skema ERD di atas menjadi:

prisma · schema.prisma
model Organization {
  id        String   @id @default(cuid())
  name      String
  plan      String   @default("free")
  users     User[]
  createdAt DateTime @default(now())
}

model User {
  id           String @id @default(cuid())
  email        String @unique
  passwordHash String
  role         String @default("member")
  org          Organization @relation(fields: [orgId], references: [id])
  orgId        String
  tasks        Task[]

  @@index([orgId])   // indeks untuk query per-organisasi
}

model Task {
  id     String  @id @default(cuid())
  title  String
  done   Boolean @default(false)
  user   User    @relation(fields: [userId], references: [id])
  userId String

  @@index([userId])
}
bash · alur migrasi
# buat & terapkan migrasi baru (dev)
npx prisma migrate dev --name init
# terapkan migrasi di produksi (CI/CD)
npx prisma migrate deploy

Indexing

Indeks adalah struktur data yang mempercepat pencarian dengan mengorbankan sedikit ruang & kecepatan tulis. Tanpa indeks, database memindai seluruh tabel (full scan) untuk menemukan baris. Panduan praktis:

Poin Kunci Bab 6

  • Default ke PostgreSQL — relasional, mendukung JSON & ekstensi (pgvector), portabel, jarang disesali.
  • Neon memberi Postgres serverless dengan scale-to-zero & branching; pas untuk vibe coding.
  • Tambah cache (Redis/Upstash) hanya setelah ada masalah performa terukur.
  • Rancang ERD lebih dulu; kelola skema & migrasi dengan Prisma; indeks foreign key & kolom yang sering difilter.
  • Indeks berdasarkan query nyata yang lambat (EXPLAIN), bukan tebakan; jangan berlebihan.
07
Bab Tujuh

Menghubungkan Frontend ↔ Backend

REST, tRPC, GraphQL, Server Actions, autentikasi, CORS, dan rahasia.

Setelah frontend dan backend ada, keduanya harus berbicara. Cara mereka berbicara — kontrak API, otentikasi, dan pengelolaan rahasia — menentukan seberapa aman dan seberapa nyaman sistem Anda berkembang. Bab ini membahas pilihan gaya komunikasi lalu tiga hal keamanan-koneksi yang wajib benar sejak awal.

Gaya Komunikasi API

REST

REST adalah gaya paling universal: sumber daya diakses lewat URL dan metode HTTP (GET, POST, PUT, DELETE). Kelebihan: dipahami semua orang & semua alat, mudah di-cache, tanpa dependensi khusus. Kekurangan: rentan over-fetching/under-fetching (dapat terlalu banyak atau terlalu sedikit data), dan kontrak tidak type-safe secara otomatis. Default yang aman untuk API publik atau lintas-bahasa.

tRPC

tRPC memberi pemanggilan fungsi backend dari frontend dengan type-safety end-to-end tanpa membuat kontrak terpisah — tipe TypeScript backend "mengalir" ke frontend. Kelebihan: DX luar biasa dalam monorepo TypeScript, autocomplete & error saat compile. Kekurangan: hanya untuk TypeScript di kedua sisi; tak cocok bila konsumen lintas-bahasa atau API publik. Pilihan hebat untuk monolit/monorepo TS.

GraphQL

GraphQL memberi klien kekuatan meminta persis data yang dibutuhkan dalam satu query, dari banyak sumber. Kelebihan: menghilangkan over/under-fetching, kuat untuk klien beragam (web, mobile) & graf data kompleks. Kekurangan: kompleksitas server tinggi (resolver, caching, N+1), berlebihan untuk PoC sederhana. Berharga saat banyak klien dengan kebutuhan data berbeda.

Server Actions

Dalam Next.js, Server Actions membuat batas FE↔BE nyaris hilang: Anda memanggil fungsi server langsung dari komponen, dan Next mengurus jaringannya. Untuk monolit Next, ini sering meniadakan kebutuhan menulis REST/tRPC sama sekali untuk kebutuhan internal. Cara termudah untuk PoC full-stack Next.

GayaType-safeLintas bahasaTerbaik untuk
RESTTidak (perlu OpenAPI)YaAPI publik, universal
tRPCYa (otomatis)Tidak (TS saja)Monorepo TS internal
GraphQLYa (skema)YaBanyak klien, graf data
Server ActionsYaTidak (Next saja)Monolit Next.js PoC

Autentikasi: Session vs JWT

Otentikasi menjawab "siapa Anda"; ada dua pola dominan menyimpan status login:

Aturan Penyimpanan Token

Simpan token/sesi dalam cookie httpOnly, Secure, SameSite — bukan di localStorage. localStorage dapat dibaca JavaScript mana pun di halaman, sehingga token di sana rentan dicuri lewat XSS. Cookie httpOnly tak terjangkau JavaScript.

Untuk vibe coding, jangan gulung sendiri auth. Gunakan pustaka teruji: Auth.js (NextAuth), Lucia, Clerk, atau auth bawaan Supabase. Auth adalah area di mana "buat sendiri" hampir selalu keputusan buruk.

CORS

CORS (Cross-Origin Resource Sharing) hanya relevan bila frontend dan backend berada di domain berbeda — kasus arsitektur terpisah. Browser memblokir permintaan lintas-asal kecuali server tujuan mengizinkannya lewat header. Konfigurasikan daftar asal yang diizinkan secara eksplisit; jangan pakai wildcard * untuk endpoint yang butuh kredensial.

ts · konfigurasi CORS eksplisit (Express)
import cors from "cors";
app.use(cors({
  origin: ["https://app.contoh.com"], // eksplisit, bukan "*"
  credentials: true,                     // izinkan cookie
}));

Catatan: pada monolit Next.js, frontend & backend satu asal, sehingga CORS tidak menjadi masalah — satu lagi keuntungan diam-diam dari pendekatan monolit.

Environment Variables & Secrets

Rahasia (kunci API, kredensial database, secret JWT) tidak boleh masuk ke kode atau git. Simpan dalam environment variables.

bash · .env (JANGAN commit)
DATABASE_URL="postgresql://user:pass@host/db"
JWT_SECRET="rahasia-panjang-acak"
ANTHROPIC_API_KEY="sk-..."      # hanya di server
NEXT_PUBLIC_APP_URL="https://app.contoh.com"  # aman ke klien
Prefiks NEXT_PUBLIC_

Di Next.js, hanya variabel berprefiks NEXT_PUBLIC_ yang dikirim ke browser. Jangan pernah memberi prefiks itu pada kunci rahasia — NEXT_PUBLIC_ANTHROPIC_API_KEY akan membocorkan kunci Anda ke setiap pengunjung. Tambahkan .env ke .gitignore; simpan nilai produksi di pengelola rahasia hosting (Vercel/AWS Secrets Manager).

Poin Kunci Bab 7

  • REST untuk universal/publik; tRPC untuk monorepo TS; GraphQL untuk banyak klien; Server Actions untuk monolit Next.
  • Session mudah dicabut; JWT skala baik tapi sulit dicabut. Simpan keduanya di cookie httpOnly, bukan localStorage.
  • Jangan gulung auth sendiri — pakai Auth.js/Lucia/Clerk/Supabase.
  • CORS hanya untuk arsitektur beda-domain; monolit satu-asal terhindar dari masalah CORS.
  • Rahasia hidup di env vars, tak pernah di git; hati-hati prefiks NEXT_PUBLIC_.
08
Bab Delapan

Keamanan Data

Enkripsi, hashing password, masking PII, rahasia, OWASP Top 10, dan rate limiting.

Keamanan bukan fitur yang ditambahkan belakangan; ia adalah properti yang dibangun sejak fondasi. Dalam vibe coding, godaannya besar: AI menuliskan kode yang "berfungsi", tetapi "berfungsi" dan "aman" adalah dua hal berbeda. Bab ini adalah daftar hal minimum yang harus benar sebelum data sungguhan — apalagi data orang lain — masuk ke sistem Anda.

Enkripsi: At-Rest & In-Transit

Hashing Password: argon2 & bcrypt

Password tidak pernah disimpan sebagai teks polos atau dienkripsi (yang bisa dibalik). Ia di-hash dengan fungsi lambat yang dirancang khusus: satu arah, ber-salt, dan mahal untuk di-brute-force.

Jangan

Jangan gunakan MD5, SHA-1, atau SHA-256 polos untuk password — mereka cepat, dan "cepat" berarti mudah di-brute-force. Jangan pula membuat skema hashing sendiri.

ts · hashing dengan argon2
import argon2 from "argon2";
// saat registrasi
const hash = await argon2.hash(password); // salt otomatis
// saat login
const ok = await argon2.verify(hash, password);

Masking Data & PII

PII (Personally Identifiable Information) — nama, email, telepon, alamat, nomor identitas — menuntut perlakuan khusus. Praktik inti:

Secrets Management

Rahasia hidup di environment variables atau pengelola rahasia khusus (Vercel Env, AWS Secrets Manager, Doppler, HashiCorp Vault) — tak pernah di kode atau git. Rotasikan kunci secara berkala, batasi cakupan (least privilege), dan gunakan kredensial berbeda antara dev & produksi. Jika sebuah rahasia pernah ter-commit, anggap ia bocor: cabut & ganti, jangan sekadar hapus dari histori.

OWASP Top 10 (Ringkas)

OWASP Top 10 adalah daftar risiko keamanan aplikasi web paling kritis. Ringkasannya sebagai checklist praktis:

#RisikoMitigasi ringkas
A01Broken Access ControlCek otorisasi di server tiap request; jangan percaya klien
A02Cryptographic FailuresTLS di mana-mana; hash password (argon2); enkripsi data sensitif
A03Injection (SQL/XSS)Query terparameter/ORM; escape output; validasi input
A04Insecure DesignAncaman dipikirkan sejak desain; rate limit; batas bisnis
A05Security MisconfigurationNonaktifkan default berisiko; header keamanan; tak ada debug di prod
A06Vulnerable Componentsnpm audit; perbarui dependensi; Dependabot
A07Auth FailuresPakai pustaka auth teruji; MFA; batasi percobaan login
A08Data Integrity FailuresVerifikasi sumber & tanda tangan; hati-hati deserialisasi
A09Logging FailuresLog peristiwa keamanan; pantau; jangan log rahasia
A10SSRFValidasi & whitelist URL yang diambil server
Aturan #1 Anti-Injection

Jangan pernah menyusun query dengan penggabungan string. Gunakan query terparameter atau ORM (Prisma). SELECT * FROM users WHERE email = '" + input + "' adalah undangan SQL injection; WHERE email = $1 dengan parameter aman.

Rate Limiting

Rate limiting membatasi jumlah request per klien per rentang waktu — pertahanan terhadap brute-force login, penyalahgunaan API, dan sebagian serangan DoS. Terapkan terutama pada endpoint sensitif (login, reset password, pengiriman OTP, endpoint mahal/AI). Implementasi umum memakai penghitung di Redis (mis. Upstash Ratelimit).

ts · rate limit sederhana (Upstash)
import { Ratelimit } from "@upstash/ratelimit";
import { Redis } from "@upstash/redis";

const limiter = new Ratelimit({
  redis: Redis.fromEnv(),
  limiter: Ratelimit.slidingWindow(5, "60 s"), // 5 / menit
});
const { success } = await limiter.limit(ipPengguna);
if (!success) return Response.json({ error: "Terlalu banyak percobaan" }, { status: 429 });

Satu-satunya sistem yang benar-benar aman adalah yang dimatikan, dicabut, disegel dalam blok beton, dan dijaga penjaga bersenjata — dan bahkan itu pun saya ragukan.

Gene Spafford

Poin Kunci Bab 8

  • TLS untuk semua lalu lintas (in-transit); andalkan enkripsi at-rest penyedia, enkripsi kolom untuk data paling sensitif.
  • Hash password dengan argon2id (atau bcrypt); jangan pernah MD5/SHA polos atau menyimpan teks polos.
  • Minimalkan & masking PII; jangan log rahasia/PII; patuhi regulasi (UU PDP/GDPR).
  • Rahasia di secrets manager, dirotasi, least-privilege; anggap rahasia ter-commit sebagai bocor.
  • Jadikan OWASP Top 10 checklist; cegah injection dengan query terparameter; rate limit endpoint sensitif.
09
Bab Sembilan

UI / UX

Prinsip desain, design system, aksesibilitas, responsivitas, dan komponen.

Sebuah produk dinilai pengguna bukan dari elegansi arsitekturnya, melainkan dari pengalaman memakainya. UI (User Interface) adalah apa yang mereka lihat; UX (User Experience) adalah bagaimana rasanya. Dalam vibe coding, AI dapat menghasilkan antarmuka dengan cepat — tetapi tanpa prinsip, hasilnya cepat tampil dan cepat pula membingungkan. Bab ini memberi prinsip agar kecepatan itu tetap terarah.

Prinsip Desain

Desain bukan sekadar bagaimana ia terlihat dan terasa. Desain adalah bagaimana ia bekerja.

Steve Jobs

Design System

Sebuah design system adalah kumpulan token, komponen, dan aturan yang membuat produk terasa satu kesatuan. Fondasinya adalah design tokens: variabel untuk warna, tipografi, jarak (spacing scale), radius, dan bayangan. Dengan token, mengganti tema atau menjaga konsistensi menjadi trivial.

css · design tokens
:root {
  /* warna */
  --primary: #2563eb;  --danger: #ef4444;  --ok: #22c55e;
  /* skala jarak (kelipatan 4px) */
  --space-1: 4px; --space-2: 8px; --space-3: 16px; --space-4: 24px;
  /* radius & tipografi */
  --radius: 12px;  --font: "Inter", sans-serif;
}

Untuk React, ekosistemnya matang: Tailwind CSS (utility-first, cepat untuk vibe coding), shadcn/ui (komponen yang Anda salin & miliki, bukan dependensi), Radix UI (primitif tanpa gaya tetapi aksesibel), dan Material UI untuk yang menginginkan sistem lengkap.

Aksesibilitas (a11y)

Aksesibilitas memastikan produk bisa dipakai semua orang, termasuk pengguna pembaca layar & navigasi keyboard. Ia bukan tambahan opsional — di banyak yurisdiksi ia kewajiban, dan selalu praktik baik. Dasar minimum:

Responsivitas

Antarmuka harus bekerja dari layar ponsel hingga monitor lebar. Pendekatan mobile-first: rancang untuk layar kecil dulu, lalu tingkatkan untuk yang besar. Gunakan unit relatif (rem, %, fr), layout fleksibel (Flexbox/Grid), dan media query untuk titik pindah. Uji di perangkat nyata, bukan hanya penyusut jendela browser.

Komponen

Bangun UI dari komponen kecil yang dapat dikomposisi. Prinsipnya: komponen presentasional (hanya tampil, terima props) dipisah dari komponen kontainer (mengurus data & state). Komponen yang baik punya satu tanggung jawab, API props yang jelas, dan tidak bocor asumsi tentang tempat ia dipakai. Ini paralel langsung dengan disiplin batas modul di Bab 5 — pada level UI.

Vibe Coding UI

Kombinasi Tailwind + shadcn/ui adalah jalur tercepat menuju UI rapi & aksesibel dalam vibe coding: AI sangat fasih keduanya, komponennya sudah aksesibel, dan Anda memiliki kodenya (bukan terkunci dependensi). Mulai dari sana kecuali ada alasan lain.

Poin Kunci Bab 9

  • UI = tampilan; UX = rasa memakainya. Prioritaskan kejelasan, konsistensi, umpan balik, hierarki.
  • Design system dibangun dari token (warna, spacing, tipografi); Tailwind + shadcn/ui cepat & aksesibel.
  • Aksesibilitas wajib: HTML semantik, kontras, navigasi keyboard, alt/label — juga membantu keterbacaan AI.
  • Rancang mobile-first dengan unit relatif & Grid/Flex; komponen kecil, satu tanggung jawab, props jelas.
10
Bab Sepuluh

Tooling

Package manager, monorepo, linting, formatting, dan CI/CD.

Perkakas yang baik bekerja diam-diam di latar, mempercepat Anda tanpa menuntut perhatian. Perkakas yang buruk menjadi sumber gesekan harian. Dalam vibe coding di mana iterasi cepat adalah segalanya, memilih tooling yang lancar bukan detail sepele — ia mengalikan kecepatan Anda di setiap commit.

Package Manager: npm vs pnpm vs yarn vs bun

ToolKecepatanEfisiensi diskCatatan
npmSedangRendahBawaan Node, universal, paling kompatibel
pnpmCepatTinggi (symlink store)Hemat disk, ketat soal dependensi, hebat untuk monorepo
yarnCepatSedangMatang; Yarn Berry (PnP) berbeda signifikan
bunSangat cepatTinggiSekaligus runtime & bundler; muda tapi menjanjikan
Rekomendasi

Untuk proyek baru, pnpm adalah titik manis: cepat, hemat disk, dan penanganan dependensi yang ketat mencegah "phantom dependency". npm tetap pilihan aman bila ingin nol kejutan. bun menarik untuk eksperimen & kecepatan ekstrem. Yang penting: pilih satu & commit lockfile-nya agar build deterministik.

Monorepo & Turborepo

Monorepo adalah satu repositori yang memuat banyak paket/aplikasi (mis. web, api, ui bersama). Ini relevan justru saat Anda memilih arsitektur terpisah: frontend dan backend berbeda, tetapi berbagi tipe & util dalam satu repo — memberi sebagian kenyamanan monolit (satu tempat, tipe bersama) tanpa menyatukan deploy.

Turborepo (dan Nx) mempercepat monorepo dengan caching tugas: build/test yang tak berubah tidak diulang. Struktur khas:

tree · monorepo (pnpm + turborepo)
apps/
├─ web/          # frontend Next.js
└─ api/          # backend (Nest/FastAPI wrapper)
packages/
├─ ui/           # komponen bersama
├─ types/        # tipe TS bersama (kontrak FE↔BE)
└─ config/       # eslint/tsconfig bersama
turbo.json       # pipeline & cache
pnpm-workspace.yaml
Insight Arsitektur

Monorepo menjembatani debat "monolit vs terpisah": Anda bisa punya kode terbagi (repo tunggal, tipe bersama) namun deploy terpisah. Untuk tim kecil yang butuh layanan Python di samping UI, monorepo sering jalan tengah paling nyaman.

Linting & Formatting

ESLint menangkap masalah & pola berbahaya; Prettier menyeragamkan format (spasi, kutip, koma) agar tak ada lagi debat gaya. Pemain baru Biome menggabungkan keduanya dalam satu alat cepat. Pasangkan dengan TypeScript untuk keamanan tipe, dan Husky + lint-staged agar linting/format jalan otomatis di pre-commit.

CI/CD

CI (Continuous Integration) menjalankan lint, test, dan build otomatis pada setiap push/PR — menangkap kerusakan sebelum digabung. CD (Continuous Deployment/Delivery) melanjutkan ke deploy otomatis. GitHub Actions adalah standar de facto. Contoh alur minimal:

yaml · .github/workflows/ci.yml
name: CI
on: [push, pull_request]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: pnpm/action-setup@v4
      - uses: actions/setup-node@v4
        with: { node-version: 20, cache: pnpm }
      - run: pnpm install --frozen-lockfile
      - run: pnpm lint
      - run: pnpm test
      - run: pnpm build

Untuk deploy, platform seperti Vercel & Netlify menyediakan CD bawaan: setiap push ke main ter-deploy, setiap PR mendapat preview URL tersendiri — luar biasa untuk mereview perubahan sebelum merilis.

Poin Kunci Bab 10

  • Pilih satu package manager (pnpm titik manis) & commit lockfile untuk build deterministik.
  • Monorepo (Turborepo) memungkinkan kode terbagi + deploy terpisah — jalan tengah untuk tim kecil dengan layanan Python.
  • ESLint + Prettier (atau Biome) + TypeScript + pre-commit hook menjaga kualitas otomatis.
  • CI (lint/test/build tiap PR) + CD (deploy & preview otomatis) menangkap kerusakan sebelum rilis.
11
Bab Sebelas

Deployment & Go Live

Dari localhost ke website yang benar-benar hidup — langkah demi langkah.

Kode yang berjalan di laptop Anda belum menjadi produk. Produk adalah sesuatu yang bisa diakses orang lain lewat alamat yang mereka ketik di browser. Bab ini menjembatani jurang itu: dari localhost:3000 menuju https://produkanda.com yang hidup, aman, dan bisa diakses siapa pun di dunia.

Peta Besar: Apa yang Membuat Website "Hidup"

Tiga hal harus bertemu agar sebuah website live:

  1. Hosting — komputer/server yang menjalankan aplikasi Anda 24/7.
  2. Domain — nama yang mudah diingat (mis. produkanda.com) yang Anda sewa dari registrar.
  3. DNS — sistem yang menerjemahkan nama domain menjadi alamat server (IP), sehingga browser tahu ke mana pergi.
Pengguna ketik domain DNS nama → IP Hosting jalankan app HTML
Gambar 11.1 — Perjalanan sebuah request: pengguna → DNS → hosting → respons

Langkah demi Langkah: Membuat Website Live

  1. Beli domain. Dari registrar (Namecheap, Cloudflare Registrar, Niagahoster, GoDaddy). Cloudflare menjual "at-cost" tanpa markup. Biaya khas: ratusan ribu rupiah/tahun untuk .com.
  2. Siapkan repositori git. Push kode ke GitHub/GitLab — ini menjadi sumber deploy.
  3. Pilih hosting (lihat perbandingan di bawah). Untuk PoC Next.js, Vercel adalah jalur termulus.
  4. Hubungkan & deploy. Hosting menarik kode dari git, membangun, dan menyajikannya di URL sementara (mis. proyek.vercel.app).
  5. Arahkan domain via DNS. Di dashboard registrar/DNS, tambahkan record yang menunjuk domain Anda ke hosting: umumnya sebuah record A ke IP, atau CNAME ke host (mis. cname.vercel-dns.com).
  6. Aktifkan HTTPS. Platform modern menerbitkan sertifikat TLS otomatis (Let's Encrypt). Tunggu propagasi DNS (menit hingga jam).
  7. Set environment variables produksi di dashboard hosting (DATABASE_URL, kunci API, dll).
  8. Verifikasi. Buka domain, cek gembok HTTPS, uji alur utama, pantau log.

Jenis DNS Record yang Perlu Dikenal

RecordFungsiContoh
ADomain → alamat IPv4@ → 76.76.21.21
AAAADomain → alamat IPv6@ → 2606:...
CNAMESubdomain → nama lainwww → proyek.vercel.app
MXServer email@ → mail server
TXTVerifikasi & SPF/DKIMverifikasi domain

Deploy ke Vercel (Langkah Konkret)

  1. Buat akun di Vercel, hubungkan akun GitHub.
  2. Klik Add New Project → pilih repositori Anda.
  3. Vercel mendeteksi Next.js otomatis — biarkan setelan default build.
  4. Isi Environment Variables (production).
  5. Klik Deploy. Dalam menit, aplikasi live di *.vercel.app.
  6. Settings → Domains → tambahkan domain kustom; Vercel memberi instruksi DNS persis.
  7. Selanjutnya, setiap git push ke main auto-deploy; tiap PR mendapat preview URL.
bash · deploy cepat via CLI
npm i -g vercel
vercel            # preview deploy
vercel --prod     # deploy ke produksi

VPS vs Serverless

AspekServerless (Vercel/Lambda)VPS (DigitalOcean/Hetzner)
SetupNyaris nolKonfigurasi server manual
SkalaOtomatisManual / vertikal
Biaya awalGratis–murah, bayar pemakaianTetap per bulan (mis. $5–$20)
KendaliTerbatasPenuh (root)
Proses panjang/WebSocketTerbatasBebas
Cocok untukPoC, beban tak menentuKendali penuh, on-prem, beban stabil

Untuk PoC, mulai serverless — nol ops, gratis untuk memulai. Pindah ke VPS/kontainer saat butuh kendali penuh, proses panjang, atau ingin menghindari lock-in. Untuk VPS, kemas aplikasi dalam Docker agar konsisten & portabel.

Gambaran AWS — Kapan Perlu

AWS adalah penyedia cloud terbesar dengan ratusan layanan. Anda tidak butuh AWS untuk PoC, tetapi berguna mengenali blok utamanya untuk saat skala & kendali menuntutnya:

Jangan Mulai dari AWS

AWS kuat tetapi kompleksitas operasional & risiko tagihan mengejutkannya nyata. Untuk PoC, ia hampir selalu over-engineering. Pindah ke AWS saat Anda punya kebutuhan konkret (kepatuhan, skala, kendali infrastruktur), bukan karena "nanti mungkin butuh".

Poin Kunci Bab 11

  • Website live butuh tiga hal: hosting (jalankan app), domain (nama), DNS (nama → IP).
  • Alur go-live: beli domain → push git → hosting build → arahkan DNS (A/CNAME) → HTTPS otomatis → env produksi → verifikasi.
  • Vercel = jalur termulus untuk Next.js: connect git, deploy, tambah domain, auto-deploy + preview.
  • Serverless untuk PoC (nol ops); VPS/Docker untuk kendali penuh & proses panjang.
  • AWS (EC2/S3/RDS/Lambda) hanya saat skala/kendali/kepatuhan menuntut — bukan titik mulai.
12
Bab Dua Belas

Membangun License Manager

Kunci lisensi, aktivasi, validasi online/offline, dan arsitekturnya.

Begitu Anda ingin menjual perangkat lunak — khususnya yang dipasang di infrastruktur pelanggan (on-premise) — Anda butuh cara memastikan hanya pelanggan berhak yang dapat memakainya, sesuai batas yang dibeli. Itulah tugas license manager. Bab ini membahas konsep, arsitektur, dan alur praktisnya, termasuk tantangan khas validasi tanpa internet.

Konsep Dasar Lisensi

Kunci Bertanda-tangan (Signed License Key)

Pendekatan paling kuat adalah public-key cryptography. Penerbit memegang kunci privat; ke dalam produk ditanam kunci publik. Lisensi berisi data (entitlement) + tanda tangan. Produk memverifikasi tanda tangan dengan kunci publik — jika valid, data lisensi dipercaya. Keindahannya: validasi bisa terjadi offline, karena tak butuh menghubungi server untuk membuktikan keaslian.

ts · verifikasi lisensi bertanda-tangan (offline)
import { createVerify } from "crypto";

function verifikasiLisensi(payload: string, tandaTanganB64: string): boolean {
  const v = createVerify("SHA256");
  v.update(payload);       // mis. JSON: {org, tier, exp, seats}
  v.end();
  return v.verify(KUNCI_PUBLIK, tandaTanganB64, "base64");
}
// entitlement dibaca HANYA jika tanda tangan valid

Validasi Online vs Offline

ModelCara kerjaKelebihanKekurangan
OnlineProduk memanggil server lisensi berkala (heartbeat)Bisa dicabut seketika; pantau pemakaian real-timeButuh internet; server harus selalu ada
OfflineVerifikasi tanda tangan lokal; kedaluwarsa dari data lisensiJalan tanpa internet (air-gapped)Sulit dicabut sebelum kedaluwarsa
HibridaOffline + cek online berkala saat tersedia (grace period)Fleksibel & tangguhLebih rumit diimplementasikan

Pola hibrida paling umum untuk on-premise: lisensi diverifikasi offline (tanda tangan + tanggal kedaluwarsa), dengan cek online opsional saat internet tersedia untuk mencabut lisensi bermasalah dan menyegarkan masa berlaku. Diberi grace period (mis. 14 hari) agar gangguan jaringan tak langsung mematikan produk pelanggan.

Arsitektur License Manager

SISI PENERBIT (Anda) License Server Kunci Privat DB Pelanggan SISI PELANGGAN (on-prem) Aplikasi Kunci Publik + file lisensi terbitkan lisensi bertanda-tangan cek online opsional (heartbeat)
Gambar 12.1 — Arsitektur license manager hibrida untuk produk on-premise

Contoh Alur

  1. Pembelian. Pelanggan membeli; server penerbit membuat record entitlement (org, tier, seats, exp).
  2. Penerbitan. Server menghasilkan payload lisensi + menandatanganinya dengan kunci privat → file/kunci lisensi diberikan ke pelanggan.
  3. Aktivasi. Pelanggan memasukkan kunci ke aplikasi on-prem; aplikasi memverifikasi tanda tangan dengan kunci publik tertanam & mengikatnya ke instans.
  4. Validasi berkala. Saat start & periodik, aplikasi memeriksa tanggal kedaluwarsa (offline) dan, bila online, menghubungi server untuk cek pencabutan & menyegarkan masa berlaku.
  5. Penegakan. Bila lisensi kedaluwarsa/dicabut melewati grace period, fitur berbayar dinonaktifkan dengan pesan jelas.

Lisensi untuk SaaS vs On-Premise

Realita Anti-Pembajakan

Tidak ada skema lisensi yang 100% tak bisa ditembus di perangkat yang dikendalikan penyerang — tujuannya bukan kesempurnaan, melainkan menjadikan pelanggaran cukup sulit & tak sepadan bagi pelanggan bisnis yang jujur. Jangan berlebihan; DRM yang menyakitkan pengguna sah lebih merugikan daripada pembajakan yang dicegahnya.

Poin Kunci Bab 12

  • License manager melindungi hak pakai & menegakkan entitlement (seats, tier, kedaluwarsa) — terutama untuk on-premise.
  • Kunci bertanda-tangan (public-key) memungkinkan validasi offline: verifikasi tanda tangan dengan kunci publik tertanam.
  • Model validasi: online (cabut seketika), offline (air-gapped), hibrida (offline + cek online berkala + grace period).
  • SaaS: lisensi = status langganan di DB Anda. On-premise: butuh kunci bertanda-tangan & aktivasi.
  • Tujuan realistis: cukup sulit dilanggar, bukan sempurna; jangan menghukum pengguna sah.
13
Bab Tiga Belas

SaaS vs On-Premise

Dua model distribusi, dua arsitektur, dua ekonomi yang berbeda.

Cara perangkat lunak Anda sampai ke pengguna membentuk hampir setiap keputusan lain: arsitektur, keamanan, model bisnis, bahkan siklus rilis. Dua model besar mendominasi: SaaS (Anda menjalankan, pelanggan mengakses lewat internet) dan on-premise (pelanggan menjalankan di infrastrukturnya sendiri). Memahami perbedaannya menghindarkan Anda dari membangun untuk model yang salah.

Perbedaan Arsitektur

AspekSaaSOn-Premise
Lokasi jalanServer Anda (cloud)Infrastruktur pelanggan
Kendali versiAnda, satu versi untuk semuaPelanggan, bisa beragam versi
UpdateAnda deploy, instanDikirim & dipasang pelanggan
DataDi sistem AndaTetap di pelanggan (isolasi penuh)
Kepemilikan uptimeAndaPelanggan
LisensiStatus langganan di DBKunci bertanda-tangan (Bab 12)
Model hargaLangganan berulangLisensi + maintenance tahunan

Multi-Tenancy (Inti SaaS)

Multi-tenancy berarti satu instans aplikasi melayani banyak pelanggan (tenant) sekaligus, dengan data mereka terpisah secara logis. Ini efisiensi inti SaaS. Tiga pola isolasi:

Bahaya #1 Multi-Tenant

Kebocoran data antar-tenant adalah mimpi buruk SaaS. Pada pola shared-schema, satu query yang lupa filter tenant_id bisa membocorkan data pelanggan A ke pelanggan B. Gunakan mekanisme yang menegakkan filter secara otomatis (mis. Row-Level Security PostgreSQL, atau lapisan repository yang selalu menyuntikkan tenant).

SaaS (Multi-tenant) 1 Aplikasi Tnt A Tnt B Tnt C satu deploy melayani semua On-Premise (Single-tenant) App A App B App C satu instans terpisah per pelanggan
Gambar 13.1 — Multi-tenant (satu app, banyak tenant) vs single-tenant on-premise

Update

Di SaaS, Anda men-deploy sekali dan semua pelanggan langsung memakai versi terbaru — mudah, tetapi menuntut kompatibilitas & migrasi yang mulus (tak boleh merusak siapa pun). Di on-premise, update harus dikemas, didistribusikan, dan dipasang pelanggan; Anda harus mendukung banyak versi sekaligus, menyediakan panduan migrasi, dan menangani lingkungan yang beragam. Kontainer (Docker) sangat membantu menstandarkan on-premise.

Data & Kepatuhan

On-premise menang telak saat pelanggan menuntut data tak boleh keluar dari infrastrukturnya — lazim di perbankan, kesehatan, pemerintah, atau lingkungan air-gapped. SaaS menang pada kenyamanan, pemeliharaan terpusat, dan biaya awal rendah. Banyak vendor akhirnya menawarkan keduanya: SaaS untuk mayoritas, on-premise untuk pelanggan enterprise yang membayar premium demi kendali.

Model Harga

Poin Kunci Bab 13

  • SaaS: Anda jalankan, satu versi untuk semua, update instan, data di Anda, harga langganan.
  • On-premise: pelanggan jalankan, banyak versi, update dikirim, data di pelanggan, lisensi + maintenance.
  • Multi-tenancy adalah inti efisiensi SaaS; jaga isolasi tenant (RLS/repository) untuk cegah kebocoran data.
  • On-premise unggul untuk kepatuhan/data-tak-boleh-keluar; kontainer menstandarkan distribusinya.
  • Banyak vendor menawarkan keduanya: SaaS default, on-premise untuk enterprise premium.
14
Bab Empat Belas

Chrome Extension

Manifest V3, content & background script, use case, dan cara publish.

Kadang produk terbaik bukan situs terpisah, melainkan sesuatu yang hidup di dalam browser pengguna — menambah kemampuan pada halaman yang sudah mereka pakai. Chrome Extension (juga bekerja di Edge & browser Chromium lain) memakai teknologi web yang sama persis dengan yang sudah Anda kuasai: HTML, CSS, JavaScript. Untuk vibe coding, ia jalur cepat dari ide ke alat nyata.

Kapan Memilih Extension

Anatomi & Manifest V3

Sejak Manifest V3 (standar wajib kini), extension punya beberapa bagian utama. Pusatnya adalah manifest.json yang mendeklarasikan izin & komponen:

json · manifest.json (MV3)
{
  "manifest_version": 3,
  "name": "Peringkas Halaman",
  "version": "1.0.0",
  "description": "Ringkas halaman aktif dengan AI",
  "permissions": ["activeTab", "storage"],
  "host_permissions": ["https://*/*"],
  "action": { "default_popup": "popup.html" },
  "background": { "service_worker": "background.js" },
  "content_scripts": [
    { "matches": ["https://*/*"], "js": ["content.js"] }
  ]
}

Komponen & Perannya

js · content script mengirim teks ke background
// content.js — punya akses ke DOM halaman
const teks = document.body.innerText.slice(0, 5000);
chrome.runtime.sendMessage({ tipe: "ringkas", teks }, (balasan) => {
  console.log("ringkasan:", balasan.hasil);
});
Keamanan Kunci API di Extension

Kode extension dapat diinspeksi pengguna — sama seperti frontend, tak ada rahasia di sana. Untuk fitur AI, jangan menaruh kunci LLM di extension. Kirim permintaan ke backend Anda sendiri yang menyimpan kunci & menerapkan rate limit; extension hanya memanggil backend itu.

Batasan & Pertimbangan

Cara Publish ke Chrome Web Store

  1. Daftar akun developer Chrome Web Store (biaya pendaftaran satu kali).
  2. Kemas extension: zip folder yang berisi manifest.json & asetnya.
  3. Unggah zip lewat Developer Dashboard.
  4. Lengkapi listing: deskripsi, ikon, tangkapan layar, kebijakan privasi (wajib bila mengakses data).
  5. Kirim untuk review — bisa memakan beberapa hari; izin sensitif memperlambatnya.
  6. Setelah disetujui, extension tayang; update dengan menaikkan version & mengunggah ulang.

Poin Kunci Bab 14

  • Extension memakai HTML/CSS/JS untuk menambah kemampuan di dalam browser; pas untuk alat "sejangkauan" & integrasi situs pihak ketiga.
  • MV3: manifest.json pusatnya; content script (DOM halaman), background service worker (otak), popup (UI), message passing antar-konteks.
  • Kode extension terinspeksi — tak ada rahasia; fitur AI harus lewat backend Anda yang menyimpan kunci.
  • Publish via Chrome Web Store: kemas zip, isi listing + kebijakan privasi, lewati review, update dengan menaikkan versi.
15
Bab Lima Belas

Studi Kasus

Lima skenario nyata melewati kerangka pemilih — dari landing hingga on-prem enterprise.

Teori menjadi berguna saat diterapkan. Bab ini menjalankan lima skenario umum melalui kerangka faktor yang sama dengan Pemilih Tech Stack di awal buku — jenis proyek, skala, real-time, kebutuhan Python/AI, tempat deploy, ukuran tim — lalu menyimpulkan tumpukan dan, yang terpenting, alasannya. Bandingkan penalaran ini dengan hasil alat interaktif.

Studi Kasus 1 — Landing Page Startup

Jenis: LandingSkala: KecilReal-time: TidakAI: TidakDeploy: CloudTim: Solo

Konteks. Sebuah startup butuh situs marketing cepat muat, SEO kuat, dengan satu form "hubungi kami". Tak ada login, tak ada data pengguna berkelanjutan.

FrontendAstro (atau Next mode statis) + Tailwind
BackendTak perlu; form via serverless function / layanan form (Formspree)
DatabaseTak perlu; konten via Markdown/CMS headless
ArsitekturSitus statis (SSG)
HostingVercel/Netlify (gratis)
PutusanCukup frontend saja

Alasan. Prioritasnya kecepatan muat & SEO, bukan logika server. Menambah backend penuh di sini adalah kompleksitas tanpa manfaat. Astro "zero JS by default" memberi performa terbaik.

Studi Kasus 2 — SaaS Kecil (Manajemen Tugas Tim)

Jenis: SaaSSkala: Kecil–sedangReal-time: RinganAI: TidakDeploy: CloudTim: Solo/kecil

Konteks. Aplikasi web multi-tenant: organisasi, pengguna, tugas, langganan berbayar. Update ringan cukup lewat refetch, belum butuh WebSocket berat.

FrontendNext.js (App Router) + Tailwind + shadcn/ui
BackendNext.js Server Actions + Route Handlers
DatabasePostgreSQL (Neon) + Prisma; RLS untuk isolasi tenant
ArsitekturModular monolith (satu deploy)
Auth & bayarAuth.js + Stripe
PutusanFull-stack Next.js PoC

Alasan. Kasus roti-mentega monolit Next.js. Satu bahasa, satu repo, satu deploy; tim kecil bergerak maksimal cepat. Pisahkan layanan hanya bila muncul kebutuhan konkret (mis. nanti butuh AI/Python).

Studi Kasus 3 — Internal Tool (Dashboard Operasi)

Jenis: InternalSkala: KecilReal-time: TidakAI: TidakDeploy: Cloud/internalTim: Kecil

Konteks. Alat internal untuk tim operasi: tabel data, filter, aksi CRUD. SEO tak relevan; hanya dipakai karyawan yang login.

FrontendReact + Vite (SPA) — atau bahkan admin low-code (Retool)
BackendAPI ringan (Express/NestJS) atau Next API
DatabasePostgreSQL terkelola + Prisma
ArsitekturMonolith sederhana
HostingInternal / cloud dengan akses terbatas (VPN/SSO)
PutusanFull-stack cukup; SEO tak dibutuhkan

Alasan. Karena tak butuh SEO/SSR, SPA React + Vite sangat cepat dibangun. Untuk kebutuhan super standar, pertimbangkan alat low-code agar lebih cepat lagi — jangan bangun yang bisa dibeli.

Studi Kasus 4 — Aplikasi AI (Asisten Dokumen)

Jenis: AI appSkala: SedangReal-time: StreamingAI: Berat (Python)Deploy: CloudTim: Kecil

Konteks. Pengguna mengunggah dokumen, sistem membuat embedding, menyimpannya, lalu menjawab pertanyaan (RAG) dengan streaming jawaban. Melibatkan pemrosesan & model di Python.

FrontendNext.js (streaming UI) + Tailwind
Backend UI/BFFNext.js — auth, orkestrasi, streaming ke klien
Layanan AIPython FastAPI — embedding, pipeline RAG, panggil LLM
DatabasePostgreSQL + pgvector (penyimpanan embedding)
ArsitekturDua layanan: UI/BFF (TS) + AI (Python)
HostingVercel (UI) + Fly.io/Railway (FastAPI)
PutusanFrontend + backend terpisah

Alasan. Inilah pemicu klasik pemisahan: pekerjaan AI berat hidup di ekosistem Python. UI tetap Next.js yang ramping; otak berat di FastAPI. Jika kebutuhan hanya memanggil API LLM tanpa pipeline Python, ini bisa menyusut kembali menjadi monolit Next.

Studi Kasus 5 — On-Premise Enterprise

Jenis: SaaS/produkSkala: Sedang–besarReal-time: BervariasiAI: OpsionalDeploy: On-prem/air-gappedTim: Besar

Konteks. Pelanggan perbankan menuntut perangkat lunak berjalan di infrastrukturnya; data tak boleh keluar; sering tanpa internet.

FrontendNext.js (mode standalone) atau SPA
BackendNestJS/Go — dikemas kontainer
DatabasePostgreSQL self-hosted (kontainer)
ArsitekturModular monolith dalam Docker Compose
DistribusiPaket kontainer; license manager offline/hibrida (Bab 12)
UpdateRilis berversi + panduan migrasi
PutusanOn-premise; kemasan & lisensi jadi fokus

Alasan. Kendala deployment (data tak boleh keluar, air-gapped) mendominasi. Fokus bergeser dari "framework mana" ke pengemasan, lisensi offline, dan kemudahan update di lingkungan yang tak Anda kendalikan. Kontainer & modular monolith menyederhanakan operasi di sisi pelanggan.

Pola yang Muncul

Perhatikan benang merahnya: default selalu ke yang paling sederhana (monolit/full-stack Next), dan pemisahan hanya dipicu oleh kebutuhan konkret — Python/AI berat, kendala deployment, atau skala & tim besar. Kompleksitas harus diperoleh, bukan diasumsikan.

Poin Kunci Bab 15

  • Landing → frontend saja (Astro). SaaS kecil & internal tool → full-stack Next monolit.
  • Aplikasi AI dengan Python berat → pisahkan layanan FastAPI dari UI Next.
  • On-premise enterprise → fokus pindah ke pengemasan kontainer, lisensi offline, & strategi update.
  • Benang merah: default sederhana; kompleksitas hanya ditambah saat dipicu kebutuhan nyata.
16
Bab Enam Belas

Cara Buku Ini Dibaca AI

Bagaimana agent AI mengonsumsi dokumen ini sebagai konteks utuh untuk pemrograman & brainstorming.

Buku ini punya pembaca kedua: agent AI. Ketika sebuah agent membantu Anda memrogram, ia bekerja jauh lebih baik bila diberi konteks yang terstruktur ketimbang menebak dari ingatan. Bab ini menjelaskan bagaimana dokumen ini dirancang agar mudah "dicerna" agent — dan bagaimana agent sebaiknya memakainya.

Mengapa Struktur Itu Penting untuk AI

Model bahasa membaca teks linear, tetapi memahami struktur. Heading berjenjang, daftar, tabel, dan blok kode yang benar bukan sekadar estetika — mereka adalah sinyal yang membantu model membangun peta mental konten. Sebuah dokumen dengan <h2>/<h3> rapi dan ringkasan per bagian jauh lebih berguna sebagai konteks daripada dinding teks tanpa hierarki. Karena itu buku ini konsisten memakai HTML semantik.

Peta Konteks = Struktur Heading

Daftar isi buku ini adalah peta pengetahuannya. Sebuah agent dapat memindai heading untuk menemukan bagian relevan tanpa membaca keseluruhan, lalu menarik hanya bab yang dibutuhkan ke dalam konteksnya. Pola judul yang konsisten (Bab N — Topik, sub-h3 per konsep, blok "Poin Kunci" penutup) membuat ekstraksi ini andal.

Cara Fetch (untuk agent)

Bila buku ini disajikan di aplikasi web, ia dapat diambil pada rute /buku/<slug> (slug: vibe-coding-stack). Agent dapat: (1) mengambil HTML, (2) memetakan konteks dari struktur <h2>/<h3>, (3) menarik blok "Poin Kunci" tiap bab sebagai ringkasan padat, lalu (4) mendalami bab tertentu sesuai kebutuhan tugas.

Cara Agent Sebaiknya Memakai Buku Ini

Elemen yang Dioptimalkan untuk Keterbacaan AI

ElemenFungsi untuk AI
Heading berjenjang (h2/h3)Peta navigasi & batas konsep
Blok "Poin Kunci" tiap babRingkasan padat siap-kutip
Tabel perbandinganData terstruktur untuk penalaran opsi
Blok kode berlabel bahasaContoh konkret yang dapat diadaptasi
Definisi eksplisit di awal konsepMenghindari asumsi ambigu
Kotak peringatan (amber)Sinyal anti-pola yang harus dicegah

Program harus ditulis agar dibaca manusia, dan hanya kebetulan bisa dijalankan mesin.

Harold Abelson, SICP

Semangat kutipan Abelson meluas ke buku ini: ditulis agar dibaca manusia, dan — kebetulan yang disengaja — terstruktur agar dapat dicerna mesin. Keduanya menuntut kejelasan yang sama.

Poin Kunci Bab 16

  • Struktur (heading, daftar, tabel, kode benar) adalah sinyal yang membantu AI membangun peta konteks.
  • Daftar isi = peta pengetahuan; agent dapat menarik hanya bab relevan lewat struktur heading.
  • Rute konseptual /buku/vibe-coding-stack; blok "Poin Kunci" berfungsi sebagai ringkasan padat siap-kutip.
  • Agent sebaiknya menerapkan kerangka faktor yang sama, menjelaskan trade-off, dan menandai jebakan (kotak amber).
17
Bab Tujuh Belas

Penutup

Rangkuman filosofi, glosarium teknis, checklist keputusan, dan FAQ.

Kita telah menempuh perjalanan dari pertanyaan sederhana — "dua sisi terpisah atau satu monolit Next.js?" — melalui framework, arsitektur, data, keamanan, deployment, hingga lisensi dan model distribusi. Jika ada satu pelajaran yang layak dibawa pulang, ia sederhana: mulai dari yang paling sederhana yang bisa bekerja, dan biarkan kompleksitas diperoleh, bukan diasumsikan.

Vibe coding memberi kekuatan luar biasa: Anda bisa membangun dalam jam apa yang dulu butuh minggu. Tetapi kekuatan itu netral. Ia memperbesar keputusan baik dan buruk. Peran Anda bukan menulis setiap baris — AI melakukannya — melainkan memegang kemudi arsitektur: memilih fondasi yang benar, menandai jebakan, dan tahu kapan menambah kompleksitas benar-benar berbayar. Buku ini adalah peta untuk peran itu.

Selera yang baik adalah tentang menghapus kompleksitas yang tidak perlu. Kode yang buruk melakukan hal yang sama dengan lebih banyak baris; kode yang baik membuat kasus khusus lenyap.

Linus Torvalds (parafrasa tentang "good taste")

Rekomendasi default buku ini, jika Anda hanya mengingat satu hal per topik: Next.js full-stack untuk PoC web, PostgreSQL untuk data, modular monolith untuk struktur, Vercel untuk go-live, argon2 + TLS + pustaka auth teruji untuk keamanan, dan pemisahan layanan hanya saat dipicu Python/AI berat, skala, atau tim besar. Menyimpang dari default ini sepenuhnya valid — asalkan Anda tahu mengapa.

Glosarium Teknis

IstilahDefinisi
ACIDJaminan transaksi database: Atomicity, Consistency, Isolation, Durability.
App RouterSistem routing Next.js berbasis folder app/ dengan server components.
argon2Algoritma hashing password modern pemenang PHC; tahan serangan GPU.
BaaSBackend-as-a-Service; DB, auth, storage siap pakai (Supabase, Firebase).
bcryptAlgoritma hashing password matang & teruji; masih aman.
BFFBackend-for-Frontend; lapisan server yang melayani kebutuhan UI spesifik.
CI/CDContinuous Integration/Deployment; otomasi test, build, dan rilis.
CORSAturan browser untuk permintaan lintas-asal (beda domain).
CRUDCreate, Read, Update, Delete — operasi data dasar.
DNSDomain Name System; menerjemahkan nama domain ke alamat IP.
ERDEntity-Relationship Diagram; peta entitas & relasi database.
ESR / SSR / SSGRendering di server (SSR), pembangkitan statis (SSG) — strategi menyajikan HTML.
GraphQLBahasa query API; klien meminta persis data yang dibutuhkan.
Hukum ConwayStruktur sistem meniru struktur komunikasi organisasi pembuatnya.
IslandsPola Astro: pulau interaktif JS di lautan HTML statis.
JWTJSON Web Token; token bertanda-tangan untuk auth stateless.
Modular MonolithSatu deploy dengan batas modul internal yang tegas.
MicroservicesAplikasi dipecah menjadi banyak layanan independen.
Multi-tenancySatu instans melayani banyak pelanggan dengan data terisolasi.
Manifest V3Standar terkini format & izin Chrome Extension.
ORMObject-Relational Mapping; akses DB via objek (mis. Prisma).
OWASP Top 10Daftar sepuluh risiko keamanan aplikasi web paling kritis.
pgvectorEkstensi PostgreSQL untuk menyimpan & mencari embedding (AI).
PIIPersonally Identifiable Information; data pribadi teridentifikasi.
PoCProof of Concept; bukti konsep awal untuk memvalidasi ide.
RAGRetrieval-Augmented Generation; LLM menjawab dari data yang diambil.
Rate limitingMembatasi jumlah request per klien per waktu.
RESTGaya API berbasis sumber daya & metode HTTP.
RLSRow-Level Security; aturan akses per-baris di PostgreSQL.
RSCReact Server Components; komponen yang berjalan di server.
ServerlessMenjalankan fungsi tanpa mengelola server; skala & bayar per pemakaian.
Server ActionsFungsi server Next.js yang dipanggil langsung dari komponen.
TLSTransport Layer Security; enkripsi lalu lintas (HTTPS).
tRPCAPI type-safe end-to-end untuk monorepo TypeScript.
Vibe codingMembangun cepat berbantuan AI, mengarahkan maksud & menguji hasil.
VPSVirtual Private Server; server virtual dengan kendali penuh.
WebSocketKoneksi dua-arah persisten untuk real-time.

Checklist Keputusan

Cetak atau salin daftar ini sebelum memulai proyek. Setiap "ya/tidak" mengarahkan Anda ke bab yang relevan.

Sebelum Menulis Kode

  • ◻ Jenis proyek jelas (landing / PoC / SaaS / internal / AI)? → Bab 1, 15
  • ◻ Butuh backend sama sekali? → Bab 3
  • ◻ Ada kebutuhan Python/AI berat? Jika ya, rencanakan layanan terpisah. → Bab 3, 4
  • ◻ Monolit Next.js cukup, atau perlu terpisah? → Bab 1, 4, 5
  • ◻ Database dipilih (default: PostgreSQL) & ERD dirancang? → Bab 6

Saat Membangun

  • ◻ Batas modul tegas (susun per domain, ekspor via index)? → Bab 5
  • ◻ Gaya API dipilih (Server Actions / REST / tRPC / GraphQL)? → Bab 7
  • ◻ Auth pakai pustaka teruji, token di cookie httpOnly? → Bab 7
  • ◻ Password di-hash (argon2), TLS aktif, rahasia di env? → Bab 8
  • ◻ Input tervalidasi, query terparameter (anti-injection)? → Bab 8
  • ◻ UI aksesibel & responsif, design token konsisten? → Bab 9
  • ◻ Lint/format/CI berjalan otomatis? → Bab 10

Sebelum & Sesudah Go Live

  • ◻ Domain, DNS, HTTPS, env produksi siap? → Bab 11
  • ◻ Rate limiting di endpoint sensitif? → Bab 8
  • ◻ Model distribusi jelas (SaaS vs on-prem) & lisensi bila perlu? → Bab 12, 13
  • ◻ Isolasi tenant diverifikasi (jika multi-tenant)? → Bab 13
  • ◻ Rencana backup, pemantauan, & log (tanpa PII/rahasia)? → Bab 8, 11

FAQ

Kalau ragu, monolit atau microservices?

Monolit — hampir selalu, untuk PoC & produk awal. Microservices adalah solusi untuk masalah skala organisasi yang belum Anda miliki. Mulai monolit modular; pecah saat rasa sakitnya nyata (Bab 5).

Saya bikin "aplikasi AI" — wajib Python?

Tidak, jika Anda hanya memanggil API LLM (Claude, GPT) — cukup dari backend Node/Next Anda. Wajib Python bila Anda menjalankan/melatih model sendiri atau memakai pipeline ML/data science (Bab 3, 15).

Next.js full-stack, tapi nanti butuh scale — buntu?

Tidak. Karena Anda memelihara batas modul, Anda bisa mengekstrak bagian yang perlu diskalakan menjadi layanan tersendiri tanpa menulis ulang. Mulai monolit bukan jalan buntu; ia titik awal yang bijak (Bab 4, 5).

SQL atau NoSQL untuk proyek baru?

PostgreSQL (SQL) untuk 95% kasus. Ia mendukung JSON bila butuh fleksibilitas NoSQL, plus relasi & transaksi kuat. Pilih NoSQL hanya untuk kebutuhan spesifik yang jelas (Bab 6).

Aman menyimpan token di localStorage?

Tidak disarankan. localStorage terjangkau JavaScript apa pun di halaman (rentan XSS). Gunakan cookie httpOnly, Secure, SameSite (Bab 7, 8).

Perlu AWS dari awal?

Hampir tak pernah untuk PoC. Vercel + database terkelola jauh lebih cepat & sederhana. Pindah ke AWS saat ada kebutuhan konkret akan kendali/skala/kepatuhan (Bab 11).

Bagaimana melindungi produk on-premise dari pembajakan?

License manager dengan kunci bertanda-tangan & validasi offline/hibrida. Targetnya membuat pelanggaran cukup sulit bagi pelanggan bisnis jujur, bukan kesempurnaan yang mustahil (Bab 12).

Kata Terakhir

Bangunlah. Kirimkan. Pelajari dari pengguna nyata. Arsitektur terbaik adalah yang membawa Anda ke tangan pengguna paling cepat dengan penyesalan paling sedikit — dan hampir selalu, itu lebih sederhana dari yang Anda kira. Selamat membangun.