Yükleniyor...

Supabase ile Mobil Uygulama Geliştirme: Derinlemesine Rehber

Yazar: Burak Balkı | Kategori: Mobile Development | Okuma Süresi: 9 dk

Supabase'in mimarisini, PostgreSQL tabanlı yapısını, güvenlik protokollerini (RLS) ve mobil uygulama entegrasyon süreçlerini teknik detaylarıyla inceleyen ka...

## Supabase Nedir: Modern Backend-as-a-Service (BaaS) Mimarisi **Supabase**, geliştiricilerin ölçeklenebilir uygulamalar oluşturmasını sağlayan, açık kaynaklı bir **Backend-as-a-Service (BaaS)** platformudur. Firebase'e en güçlü alternatif olarak konumlanan Supabase, temelini ilişkisel veritabanı dünyasının standart belirleyicisi olan **PostgreSQL** üzerine inşa etmiştir. Geleneksel NoSQL tabanlı çözümlerin aksine, veri bütünlüğünü ve karmaşık sorgu yeteneklerini ön planda tutar. Supabase'in sunduğu temel hizmetler arasında gerçek zamanlı veritabanı güncellemeleri, kimlik doğrulama (Authentication), dosya depolama (Storage) ve sunucusuz fonksiyonlar (Edge Functions) yer alır. Mobil uygulama geliştirme süreçlerinde, özellikle veri yapısının önceden belirlendiği ve ilişkisel verinin kritik olduğu projelerde Supabase, geliştirme hızını (Time-to-Market) optimize eder. ## Supabase'in Teknik İç Yapısı ve Çalışma Prensibi Supabase tek bir monolitik yapı değil, bir dizi açık kaynaklı aracın orkestrasyonudur. Bu mimariyi anlamak, platformun performansını optimize etmek için kritiktir: - **PostgreSQL:** Sistemin kalbidir. Ham SQL erişimi sunar. - **PostgREST:** PostgreSQL veritabanınızı doğrudan RESTful API'ye dönüştüren bir web sunucusudur. - **GoTrue:** Netlify tabanlı, kullanıcı yönetimi ve JWT (JSON Web Token) üretimi yapan bir API'dir. - **Realtime:** Veritabanındaki değişiklikleri (Insert, Update, Delete) dinleyen ve Elixir diliyle yazılmış bir sunucudur. - **Storage:** Dosya yönetimi için AWS S3 uyumlu bir arayüz sunar. - **Kong:** Tüm bu servislerin önünde duran API Gateway mekanizmasıdır. | Bileşen | Görev | Teknoloji | | :--- | :--- | :--- | | Database | Veri Depolama | PostgreSQL | | Auth | Kimlik Doğrulama | GoTrue (Go) | | API | Otomatik REST API | PostgREST (Haskell) | | Realtime | WebSocket Bağlantısı | Phoenix (Elixir) | ## Supabase Kurulumu ve Başlangıç Adımları Bir projeye başlamak için öncelikle Supabase Dashboard üzerinden yeni bir proje oluşturulmalıdır. Proje oluşturulduğunda size bir **API URL** ve bir **anon key** verilir. Bu anahtarlar, istemci tarafında (Client-side) veritabanı ile iletişim kurmak için kullanılır. Projenize bağımlılıkları eklemek için aşağıdaki komutu kullanabilirsiniz: ```bash npm install @supabase/supabase-js ``` Ardından istemciyi initialize etmek için şu yapılandırmayı kullanmalısınız: ```javascript import { createClient } from '@supabase/supabase-js' const supabaseUrl = 'https://your-project-id.supabase.co' const supabaseKey = process.env.SUPABASE_KEY export const supabase = createClient(supabaseUrl, supabaseKey) ``` ## PostgreSQL Veritabanı ve Tablo Yönetimi Supabase üzerinde veri yönetimi, standart SQL sorguları veya Dashboard üzerindeki Table Editor ile yapılabilir. Mobil uygulamalar için şema tasarımı yaparken **Foreign Key** ilişkileri veri tutarlılığı için hayati önem taşır. Örnek bir `profiles` tablosu oluşturma ve veri çekme işlemi: ```javascript const { data, error } = await supabase .from('profiles') .select('username, website, avatar_url') .eq('id', userId) .single() if (error) console.error('Hata:', error.message) ``` ## Row Level Security (RLS) ile Veri Güvenliği Supabase'in en güçlü yönlerinden biri **Row Level Security (RLS)** mekanizmasıdır. RLS, veritabanı seviyesinde hangi kullanıcının hangi satırı görebileceğini veya değiştirebileceğini belirler. Bu, backend kodu yazmadan tam güvenlik sağlar. Örneğin, sadece kendi verisini okuyabilen bir kullanıcı için SQL politikası şöyledir: ```sql ALTER TABLE profiles ENABLE ROW LEVEL SECURITY; CREATE POLICY "Kullanıcılar sadece kendi profillerini görebilir." ON profiles FOR SELECT USING (auth.uid() = id); ``` > **Not:** RLS aktif edilmemiş bir tablo, anonim anahtara sahip herkes tarafından okunabilir ve yazılabilir durumdadır. Üretim ortamında (Production) RLS her zaman aktif olmalıdır. ## Kimlik Doğrulama (Authentication) Stratejileri Supabase Auth; e-posta/şifre, sihirli bağlantılar (magic links) ve sosyal girişleri (Google, Apple, GitHub vb.) destekler. Mobil uygulamalarda oturum yönetimi otomatik olarak yerel depolamada (Local Storage/Secure Storage) tutulur. Kullanıcı kayıt işlemi örneği: ```javascript const { user, session, error } = await supabase.auth.signUp({ email: 'example@email.com', password: 'securePassword123', }) ``` Oturum durumunu dinlemek için `onAuthStateChange` metodunu kullanmak, mobil uygulama yaşam döngüsünde (Lifecycle) UI güncellemeleri için en iyi pratiktir. ## Realtime Özellikleri: Canlı Veri Akışı Mobil uygulamalarda sohbet (chat) veya canlı skor gibi özellikler için **Realtime** servisi kullanılır. Supabase, PostgreSQL'in `replication slot` özelliğini kullanarak değişiklikleri WebSocket üzerinden iletir. ```javascript const mySubscription = supabase .channel('public:messages') .on('postgres_changes', { event: 'INSERT', schema: 'public', table: 'messages' }, payload => { console.log('Yeni mesaj geldi:', payload.new) }) .subscribe() ``` ## Supabase Storage ile Dosya Yönetimi Profil fotoğrafları veya medya dosyaları için Storage bucket'ları kullanılır. Dosya yükleme işlemi asenkron olarak yönetilir ve RLS politikaları ile korunabilir. ```javascript const uploadAvatar = async (file) => { const { data, error } = await supabase.storage .from('avatars') .upload(`public/${file.name}`, file) if (error) throw error return data.path } ``` ## Edge Functions: Sunucusuz İş Mantığı Bazı durumlarda istemci tarafında yapılmaması gereken (ödeme işlemleri, e-posta gönderimi vb.) işlemler için **Edge Functions** kullanılır. Bunlar Deno üzerinde çalışan TypeScript fonksiyonlarıdır. ```typescript // hello-world/index.ts import { serve } from "https://deno.land/std@0.131.0/http/server.ts" serve(async (req) => { const { name } = await req.json() const data = { message: `Merhaba ${name}!`, } return new Response( JSON.stringify(data), { headers: { "Content-Type": "application/json" } }, ) }) ``` ## RPC (Remote Procedure Call) Kullanımı Karmaşık SQL fonksiyonlarını veritabanı tarafında tanımlayıp istemciden çağırmak performans kazandırır. Özellikle birden fazla tabloyu etkileyen toplu işlemler için RPC idealdir. ```javascript const { data, error } = await supabase .rpc('increment_view_count', { row_id: 123 }) ``` ## Best Practices ve Performans İpuçları 1. **İndeksleme:** Sık sorgulanan kolonlara (özellikle `where` ve `order by` kullanılanlar) PostgreSQL indeksleri ekleyin. 2. **Select Optimizasyonu:** `select('*')` yerine sadece ihtiyacınız olan kolonları belirtin. Bu, ağ trafiğini ve bellek kullanımını azaltır. 3. **Connection Pooling:** Çok fazla eşzamanlı bağlantı (Connection) için **Supavisor** veya **PgBouncer** kullanın. 4. **Pagination:** Büyük veri setlerini `range()` fonksiyonu ile sayfalayarak çekin. ```javascript const { data } = await supabase .from('posts') .select('*') .range(0, 9) // İlk 10 kayıt ``` ## Sık Yapılan Hatalar - **RLS'i Unutmak:** En büyük güvenlik açığıdır. Tablo oluşturulduğu an RLS aktif edilmelidir. - **Service Role Key Kullanımı:** `service_role` anahtarını asla istemci tarafında (mobil uygulama içinde) kullanmayın. Bu anahtar tüm güvenlik duvarlarını aşar. - **Yanlış Veri Tipleri:** PostgreSQL'in sunduğu `jsonb`, `uuid` ve `timestamptz` gibi güçlü veri tiplerini kullanmamak. - **N+1 Sorgu Problemi:** İlişkili verileri çekmek için ayrı ayrı sorgular atmak yerine, Supabase'in join yeteneklerini kullanın. ## Sık Sorulan Sorular (SSS) 1. **Supabase tamamen ücretsiz mi?** Supabase'in cömert bir ücretsiz planı vardır. Ancak belirli bir veritabanı boyutu ve transfer limitinden sonra ücretli paketlere geçilmesi gerekir. 2. **Firebase'den Supabase'e geçiş zor mu?** NoSQL'den SQL'e geçiş, veri şemasının yeniden tasarlanmasını gerektirir. Ancak Supabase, geçişi kolaylaştıran CLI araçları sunar. 3. **Supabase çevrimdışı (offline) desteği sunuyor mu?** Şu an için yerleşik bir offline-first senkronizasyon mekanizması yoktur; ancak RxDB gibi kütüphanelerle entegre edilebilir. 4. **Kendi sunucumda barındırabilir miyim?** Evet, Supabase açık kaynaklıdır ve Docker üzerinden kendi sunucunuzda (Self-hosting) çalıştırabilirsiniz. 5. **Hangi dilleri destekliyor?** Resmi olarak JavaScript/TypeScript, Python, Go, Rust, Flutter, Swift ve Kotlin SDK'ları mevcuttur. ## Özet ve Sonuç Supabase, mobil uygulama geliştiricileri için PostgreSQL'in gücünü modern bulut özellikleri ile birleştiren eşsiz bir platformdur. **RLS** ile sağladığı güvenlik, **Realtime** ile sunduğu hız ve **PostgreSQL** ile sağladığı veri bütünlüğü, onu kurumsal projelerden startup fikirlerine kadar her ölçekte tercih edilebilir kılar. Firebase'in kısıtlayıcı NoSQL yapısından sıkılan ve SQL dünyasının esnekliğini arayan geliştiriciler için Supabase, günümüzün en mantıklı BaaS çözümüdür.