Pernah nggak kamu mau bikin aplikasi mobile tapi berhenti di tahap "nah, backend-nya pakai apa?" Saya dulu juga gitu. Mikir server, mikir database, mikir API endpoint, mikir deploy. Belum lagi kalau mau ada push notification sama real-time update. Repot banget.
Nah, kenalan yuk sama Firebase. Platform ini bikin kamu bisa punya backend lengkap tanpa harus setup server sendiri. Database, autentikasi, storage, push notification, analytics semuanya udah disiapin Google. Tinggal pakai dari sisi mobile app.
Apa Itu Firebase?
Firebase adalah Backend-as-a-Service (BaaS) yang Google akuisisi tahun 2014. Intinya, Firebase ngasih kamu semua infrastruktur backend yang biasanya butuh server sendiri. Kamu fokus nulis kode mobile app, Firebase urus sisanya.
Beberapa fitur utama Firebase:
- Cloud Firestore database NoSQL real-time yang sinkron otomatis ke semua client
- Firebase Authentication login pakai email/password, Google, Facebook, Apple, dll tanpa nulis logic sendiri
- Cloud Storage upload file (foto, video, dokumen) ke cloud Google langsung dari app
- Cloud Messaging (FCM) kirim push notification gratis ke Android dan iOS
- Cloud Functions jalankan kode backend (Node.js/Python) tanpa kelola server
- Firebase Hosting deploy web app dengan SSL otomatis dan CDN global
- Firebase Analytics tracking user behavior gratis tanpa setup tambahan
Yang bikin Firebase cocok untuk developer Indonesia: free tier-nya generous banget. Untuk app skala kecil sampai menengah, kamu bisa jalan tanpa bayar apa-apa.
Setup Firebase di Project Mobile
Saya pakai Flutter sebagai contoh karena lagi populer, tapi konsepnya sama buat React Native atau native Android/iOS.
Pertama, buat project di Firebase Console:
- Buka console.firebase.google.com
- Klik Add Project, kasih nama (misal: my-app-dev)
- Pilih Google Analytics (opsional tapi recommended)
- Tunggu provisioning selesai
Setelah project jadi, tambah platform (Android/iOS). Firebase bakal generate google-services.json (Android) atau GoogleService-Info.plist (iOS) yang kamu taruh di project.
Install Firebase SDK di Flutter:
# pubspec.yaml
flutter pub add firebase_core
flutter pub add firebase_auth
flutter pub add cloud_firestore
flutter pub add firebase_storage
flutter pub add firebase_messaging
Inisialisasi Firebase di main.dart:
import 'package:flutter/material.dart';
import 'package:firebase_core/firebase_core.dart';
import 'firebase_options.dart'; // Generated by FlutterFire CLI
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await Firebase.initializeApp(
options: DefaultFirebaseOptions.currentPlatform,
);
runApp(const MyApp());
}
Cloud Firestore Database Real-Time tanpa Server
Ini fitur yang bikin Firebase beda dari backend tradisional. Firestore adalah database NoSQL yang sinkron real-time. Maksudnya, kalau ada data berubah di database, semua client yang listen bakal ke-update otomatis. Tanpa polling, tanpa WebSocket manual.
Struktur Firestore: Collections berisi Documents, yang berisi fields (key-value) dan sub-collections.
Contoh struktur untuk app todo:
todos (collection)
{auto-id} (document)
title: "Belajar Firebase"
done: false
created_at: timestamp
uid: "user123"
{auto-id} (document)
title: "Bikin kopi"
done: true
CRUD di Flutter dengan Firestore:
// CREATE - tambah todo baru
Future<void> addTodo(String title, String uid) async {
await FirebaseFirestore.instance.collection('todos').add({
'title': title,
'done': false,
'created_at': FieldValue.serverTimestamp(),
'uid': uid,
});
}
// READ - stream real-time (auto-update kalau data berubah)
Stream<QuerySnapshot> getTodos(String uid) {
return FirebaseFirestore.instance
.collection('todos')
.where('uid', isEqualTo: uid)
.orderBy('created_at', descending: true)
.snapshots();
}
// UPDATE - centang todo selesai
Future<void> toggleTodo(String docId, bool currentDone) async {
await FirebaseFirestore.instance
.collection('todos')
.doc(docId)
.update({'done': !currentDone});
}
// DELETE - hapus todo
Future<void> deleteTodo(String docId) async {
await FirebaseFirestore.instance
.collection('todos')
.doc(docId)
.delete();
}
Perhatikan .snapshots() ini bikin data auto-refresh. Kalau user A nambah todo dari HP lain, user B langsung liat perubahan tanpa refresh. Itulah kekuatan real-time sync Firestore.
Firebase Auth Login tanpa Bikin Logic dari Nol
Buat autentikasi dari awang-awang itu melelahkan. Hash password, handle session, OAuth flow, reset password email, verify email... Firebase Auth handle semuanya.
// Register pakai email
Future<User?> register(String email, String password) async {
try {
final cred = await FirebaseAuth.instance.createUserWithEmailAndPassword(
email: email,
password: password,
);
return cred.user;
} on FirebaseAuthException catch (e) {
if (e.code == 'weak-password') {
print('Password terlalu lemah');
} else if (e.code == 'email-already-in-use') {
print('Email udah dipake');
}
return null;
}
}
// Login pakai Google
Future<User?> signInWithGoogle() async {
final googleUser = await GoogleSignIn().signIn();
if (googleUser == null) return null; // user cancel
final googleAuth = await googleUser.authentication;
final cred = GoogleAuthProvider.credential(
accessToken: googleAuth.accessToken,
idToken: googleAuth.idToken,
);
final result = await FirebaseAuth.instance.signInWithCredential(cred);
return result.user;
}
// Listen auth state changes
FirebaseAuth.instance.authStateChanges().listen((User? user) {
if (user == null) {
print('User logged out');
} else {
print('User logged in: ${user.uid}');
}
});
Yang penting: Security Rules. Default Firestore rules mengizinkan akses untuk siapa saja. Wajib diupdate!
rules_version = '2';
service cloud.firestore {
match /databases/{database}/documents {
// User cuma bisa akses todo miliknya sendiri
match /todos/{todoId} {
allow read, write: if request.auth != null
&& request.auth.uid == resource.data.uid;
allow create: if request.auth != null
&& request.auth.uid == request.resource.data.uid;
}
// Profile user cuma bisa diakses pemiliknya
match /users/{userId} {
allow read: if request.auth != null;
allow write: if request.auth != null && request.auth.uid == userId;
}
}
}
Push Notification dengan FCM
Push notification itu penting banget buat engagement. FCM (Firebase Cloud Messaging) gratis unlimited. Kamu bisa kirim notif ke device tertentu, topic, atau broadcast semua user.
// Setup FCM di Flutter
Future<void> setupFCM() async {
// Request permission (iOS)
await FirebaseMessaging.instance.requestPermission(
alert: true,
badge: true,
sound: true,
);
// Dapatkan token device
final token = await FirebaseMessaging.instance.getToken();
print('FCM Token: $token');
// Simpan token ini ke Firestore untuk kirim notif ke device ini nanti
// Handle notif saat app terbuka
FirebaseMessaging.onMessage.listen((RemoteMessage message) {
print('Pesan diterima: ${message.notification?.title}');
// Tampilkan dialog atau snackbar
});
// Handle notif saat app di background
FirebaseMessaging.onBackgroundMessage(_backgroundHandler);
}
@pragma('vm:entry-point')
Future<void> _backgroundHandler(RemoteMessage message) async {
print('Background message: ${message.messageId}');
}
Kirim notif dari server (Cloud Functions atau backend sendiri):
// Cloud Function untuk kirim push notification
const admin = require('firebase-admin');
admin.initializeApp();
exports.sendNotification = functions.firestore
.document('todos/{todoId}')
.onCreate(async (snap, context) => {
const todo = snap.data();
// Ambil FCM token user dari profile
const userDoc = await admin.firestore()
.collection('users')
.doc(todo.uid)
.get();
const fcmToken = userDoc.data()?.fcmToken;
if (!fcmToken) return;
await admin.messaging().send({
token: fcmToken,
notification: {
title: 'Todo Baru Ditambahkan',
body: todo.title,
},
data: {
type: 'todo_created',
todoId: context.params.todoId,
},
});
});
Cloud Functions Backend Logic tanpa Server
Kadang kamu butuh logic backend yang nggak bisa dijalankan di mobile app. Cloud Functions solve ini. Kamu nulis function (Node.js atau Python), deploy, dan Firebase handle scaling-nya.
# Install Firebase CLI
npm install -g firebase-tools
# Login
firebase login
# Init Cloud Functions
firebase init functions
# Pilih: JavaScript atau TypeScript
# Pilih: Firestore, Auth, atau trigger lain
// functions/index.js
const functions = require('firebase-functions');
const admin = require('firebase-admin');
admin.initializeApp();
// Trigger saat user baru register
exports.onUserCreate = functions.auth.user().onCreate(async (user) => {
// Buat profile document otomatis
await admin.firestore().collection('users').doc(user.uid).set({
email: user.email,
displayName: user.displayName || '',
createdAt: admin.firestore.FieldValue.serverTimestamp(),
fcmToken: null,
});
console.log(`Profile dibuat untuk ${user.email}`);
});
// HTTP endpoint (bisa dipanggil dari app atau curl)
exports.checkUsername = functions.https.onCall(async (data, context) => {
if (!context.auth) {
throw new functions.https.HttpsError('unauthenticated', 'Login dulu');
}
const username = data.username;
const snapshot = await admin.firestore()
.collection('users')
.where('username', '==', username)
.get();
return { available: snapshot.empty };
});
// Scheduled function (cron job)
exports.cleanupOldTodos = functions.pubsub
.schedule('0 3 * * *') // Jam 3 pagi setiap hari
.onRun(async (context) => {
const cutoff = admin.firestore.Timestamp.fromMillis(
Date.now() - 30 * 24 * 60 * 60 * 1000 // 30 hari lalu
);
const oldTodos = await admin.firestore()
.collection('todos')
.where('done', '==', true)
.where('created_at', '<', cutoff)
.get();
const batch = admin.firestore().batch();
oldTodos.forEach(doc => batch.delete(doc.ref));
await batch.commit();
console.log(`Dihapus ${oldTodos.size} todo lama`);
});
Deploy:
firebase deploy --only functions
Gratis vs Berbayar Kapan Harus Upgrade?
Firebase punya dua tier: Spark (Gratis) dan Blaze (Bayar sesuai pemakaian).
Spark Plan (gratis) sudah cukup untuk development dan app kecil:
- Firestore: 50K baca, 20K tulis, 20K hapus per hari
- Auth: unlimited authentication
- Storage: 1 GB storage, 1 GB download per hari
- FCM: unlimited push notification
- Cloud Functions: nggak tersedia di free tier
Blaze Plan (pay-as-you-go) cocok kalau app udah punya traffic:
- Firestore: baca $0.03/100K, tulis $0.18/100K
- Storage: $0.026/GB/bulan
- Cloud Functions: $0.40/juta invokasi
- F CM: tetap gratis unlimited
Tip hemat: pakai batch writes dan offline persistence untuk kurangi jumlah Firestore operations. Cache data di lokal device, sinkron hanya saat perlu.
Best Practices Firebase
Beberapa hal yang saya pelajari dari pengalaman pakai Firebase di production:
1. Design Firestore schema dengan benar. Firestore itu NoSQL, jadi denormalization itu normal. Kalau kamu butuh query yang kompleks, pertimbangkan duplikasi data ke multiple collections daripada satu query mega-kompleks.
2. Security Rules bukan opsional. Default rules mengizinkan semua orang akses data kamu. Selalu set rules sebelum deploy. Test pakai Firebase Emulator Suite sebelum push ke production.
3. Gunakan Firebase Emulator untuk development lokal. Jangan test di production database. Setup emulator lokal untuk Firestore, Auth, Functions, dan Storage:
# firebase.json
{
"emulators": {
"firestore": { "port": 8080 },
"auth": { "port": 9099 },
"functions": { "port": 5001 },
"storage": { "port": 9199 },
"ui": { "enabled": true }
}
}
# Run
firebase emulators:start
4. Monitor quota usage. Firebase Console ada tab Usage yang detail. Monitor terutama Firestore reads kalau query kamu nggak efficient, baca bisa meledak cepat banget.
5. Backup data secara berkala. Pakai Cloud Functions untuk export Firestore ke Cloud Storage setiap hari. Jangan andalkan Firebase sebagai satu-satunya backup.
Kapan Firebase Nggak Cocok?
Jujur, Firebase nggak selalu jawaban. Beberapa kasus di mana saya pakai backend custom instead:
- Query kompleks dengan JOIN Firestore NoSQL, kalau butuh relational query yang berat, PostgreSQL lebih cocok
- Data sensitif yang butuh compliance ketat kalau regulasi butuh data disimpan di server Indonesia, Firebase (Google Cloud) lokasinya di luar
- Cost predictability kalau traffic tinggi, Firebase bisa mahal. Backend tradisional dengan VPS bisa lebih murah di skala besar
- Butuh kontrol penuh kalau kamu mau custom runtime, custom library, atau logic yang spesifik, self-hosted lebih fleksibel
Kesimpulan
Firebase adalah pilihan solid untuk developer mobile yang mau cepat shipping app tanpa pusing mikirin backend. Dari autentikasi sampai database real-time, semuanya terintegrasi rapi. Free tier-nya cukup untuk development dan app kecil, dan scaling-nya otomatis.
Tapi ingat, Firebase bukan solusi untuk semua masalah. Untuk app yang butuh query relasional kompleks atau cost control di skala besar, pertimbangkan alternatif seperti Supabase (PostgreSQL-based) atau backend custom.
Kalau kamu baru mulai project mobile dan butuh backend cepat, coba Firebase. Setup-nya 10 menit, dan kamu langsung punya database, auth, dan storage siap pakai. Daripada mikir server, mending ship product lebih cepat.
Sudah pernah coba Firebase di project kamu? Atau masih ragu pakai BaaS vs backend custom? Share pengalamanmu di komen ya!