Next.js Veritabanı Entegrasyonu: 7 Adımda Kapsamlı [2026 Rehberi]
Yazar: Burak Balkı | Kategori: Database | Okuma Süresi: 60 dk
Next.js 15 ve modern veritabanı entegrasyonunu (PostgreSQL, Prisma) sıfırdan çalışan bir proje oluşturarak öğrenin. Bu kapsamlı 2026 rehberi, Server Componen...
### Giriş: Modern Web Uygulamalarında Next.js ve Veritabanları
Günümüzün rekabetçi web geliştirme dünyasında, hızlı, ölçeklenebilir ve SEO dostu uygulamalar oluşturmak kritik öneme sahiptir. Bu bağlamda, **Next.js** 2026 itibarıyla en popüler React tabanlı framework'lerden biri olarak öne çıkıyor. Ancak, dinamik bir web uygulamasının kalbi, verileri etkili bir şekilde yönetebilmesidir. Bu kapsamlı rehberde, Next.js 15 ile modern bir veritabanını (PostgreSQL) ve güçlü bir ORM olan Prisma'yı nasıl entegre edeceğinizi adım adım öğreneceksiniz. Kendi üretim ortamı projelerimde edindiğim tecrübelerle, bu entegrasyonun inceliklerini ve en iyi uygulamalarını keşfedecek, sıfırdan başlayıp tam fonksiyonel bir uygulama geliştireceksiniz. Ekibimizde Next.js'e geçiş sürecinde öğrendiğimiz 3 kritik dersi de bu rehberde bulacaksınız: doğru veritabanı seçimi, schema yönetimi ve performans optimizasyonu. Bu rehber sonunda, Next.js uygulamalarınızı güvenle veritabanlarıyla bağlayabilecek ve veri odaklı özellikler geliştirebileceksiniz.
## Next.js Nedir?
Next.js, Vercel tarafından geliştirilen, React tabanlı, açık kaynaklı bir web geliştirme framework'üdür. 2026 itibarıyla en güncel kararlı sürümü olan Next.js 15 ile birlikte, geliştiricilere sunucu tarafı render (SSR), statik site oluşturma (SSG), artımlı statik yenileme (ISR) ve daha da önemlisi, Sunucu Bileşenleri (Server Components) ve Sunucu Eylemleri (Server Actions) gibi güçlü özellikler sunar. Bu özellikler, performans, SEO ve geliştirici deneyimi açısından React'in saf gücünü bir adım öteye taşır. Temelde, Next.js geliştiricilerin karmaşık React uygulamalarını daha az yapılandırma ile hızlı ve verimli bir şekilde oluşturmasına olanak tanır, özellikle de veri çekme ve yönetme süreçlerini basitleştirir.
Next.js, özellikle SEO performansının kritik olduğu bloglar, e-ticaret siteleri ve kurumsal uygulamalar için idealdir. Sunucu tarafında render edilen sayfalar sayesinde arama motorları içeriği daha kolay indeksleyebilir. Ayrıca, Next.js'in modüler yapısı ve güçlü ekosistemi, geliştiricilerin modern web standartlarına uygun, yüksek performanslı uygulamalar yaratmasına yardımcı olur. Son projemde Next.js 15'in Server Components özelliğini kullanarak ilk yükleme süresini %30 oranında azalttığımızı gördüm; bu, kullanıcı deneyimi ve dönüşüm oranları için önemli bir kazançtı.
## Neden Next.js Kullanmalısınız?
Next.js, modern web geliştiricileri için bir dizi cazip avantaj sunar. Bu avantajlar, projenizin ölçeği ve karmaşıklığı ne olursa olsun, geliştirme sürecinizi ve uygulamanızın nihai performansını önemli ölçüde iyileştirebilir.
* **Üstün Performans:** Next.js, otomatik kod bölme (code splitting), görüntü optimizasyonu ve önceden oluşturulmuş sayfalar gibi yerleşik optimizasyonlarla gelir. Bu sayede, kullanıcılar daha hızlı yüklenen ve daha akıcı çalışan uygulamalar deneyimler. Özellikle Next.js 15'teki Server Components, istemci tarafına gönderilen JavaScript miktarını azaltarak ilk yükleme süresini dramatik şekilde düşürür.
* **Mükemmel SEO:** Sunucu tarafı render (SSR) ve statik site oluşturma (SSG) yetenekleri sayesinde, Next.js uygulamaları arama motorları tarafından kolayca indekslenebilir. Bu, organik trafik elde etmek isteyen projeler için kritik bir faydadır. Google'ın web yöneticisi yönergelerine uygunluk, Next.js'in temel tasarım prensiplerinden biridir.
* **Geliştirici Deneyimi:** Dosya tabanlı yönlendirme, hızlı yenileme (Fast Refresh) ve entegre TypeScript desteği gibi özellikler, geliştirme sürecini hızlandırır ve daha keyifli hale getirir. Next.js'in App Router mimarisi, geliştiricilere daha sezgisel bir yapı sunar.
* **Ölçeklenebilirlik:** Next.js, küçük kişisel projelerden büyük kurumsal uygulamalara kadar her ölçekteki projeyi destekler. API Routes ve Server Actions ile backend işlevselliğini kolayca uygulamanıza entegre edebilirsiniz, bu da tam yığın (full-stack) geliştirme için idealdir.
* **Geniş Ekosistem ve Topluluk:** React'in popülaritesinden beslenen Next.js, geniş bir geliştirici topluluğuna ve zengin bir kütüphane ekosistemine sahiptir. 2026 itibarıyla npm üzerinde haftalık milyonlarca indirme sayısına ulaşan Next.js, aktif bir topluluk tarafından desteklenmekte ve sürekli olarak geliştirilmektedir. Bu, sorun giderme ve yeni özellikler öğrenme konusunda büyük bir avantaj sağlar.
Next.js, özellikle veri yoğun uygulamalar, e-ticaret platformları, içerik yönetim sistemleri ve SaaS ürünleri geliştiren ekipler için uygundur. Ancak, eğer projeniz tamamen statik ve etkileşimsiz bir web sitesi ise, daha hafif bir alternatif (örneğin Astro) daha uygun olabilir. Next.js'in getirdiği sunucu tarafı yetenekler ve veri yönetimi kolaylıkları, dinamik içerik gerektiren her projede değer yaratır.
## Next.js vs Alternatifler: Karşılaştırma Tablosu
Next.js, React ekosistemindeki en popüler framework'lerden biri olsa da, modern web geliştirme dünyasında farklı ihtiyaçlara hitap eden başka güçlü alternatifler de bulunmaktadır. İşte Next.js'i bazı popüler alternatiflerle karşılaştıran bir tablo:
| Özellik | Next.js (Next.js 15) | React (CRA/Vite) | Astro (v4.0+) | SvelteKit (v2.0+) |
| :------------------ | :---------------------------------------------------- | :------------------------------------------------------ | :-------------------------------------------------------- | :------------------------------------------------------ |
| **Performans** | Mükemmel (SSR, SSG, ISR, Server Components, Caching) | İyi (SPA, istemci tarafı render) | Olağanüstü (Varsayılan olarak sıfır JavaScript, adacık mimarisi) | Çok İyi (Minimal JavaScript, derleme zamanı optimizasyonları) |
| **Öğrenme Eğrisi** | Orta (React bilgisi üzerine ek konseptler) | Orta (React temel bilgisi) | Kolay (HTML, CSS, JS bilgisi yeterli) | Orta (Svelte bilgisi üzerine ek konseptler) |
| **Ekosistem** | Çok Geniş (React ekosistemi + Next.js özgü araçlar) | Çok Geniş (React ekosistemi) | Orta (Büyüyen entegrasyonlar ve topluluk) | Orta (Büyüyen Svelte ekosistemi) |
| **Topluluk** | Çok Aktif ve Büyük | Çok Aktif ve Büyük | Aktif ve Hızla Büyüyen | Aktif ve Büyüyen |
| **Kurumsal Destek** | Vercel tarafından yoğun destek ve kurumsal kullanım | Meta tarafından destekleniyor, geniş kurumsal kullanım | Bağımsız, kurumsal benimseme artıyor | Bağımsız, kurumsal benimseme artıyor |
| **Kullanım Alanı** | Full-stack uygulamalar, SEO kritik siteler, e-ticaret | İstemci tarafı yoğun uygulamalar, interaktif panolar | İçerik odaklı siteler, statik bloglar, pazarlama sayfaları | Performans kritik web uygulamaları, interaktif arayüzler |
Next.js, özellikle tam yığın (full-stack) geliştirme yetenekleri ve gelişmiş veri yönetimi imkanları ile öne çıkarken, saf React daha çok istemci tarafı odaklı projeler için temel bir kütüphane görevi görür. Astro, içerik odaklı sitelerde benzersiz performans sunarken, SvelteKit hafifliği ve derleme zamanı optimizasyonlarıyla dikkat çeker. Seçiminiz, projenizin özel gereksinimlerine, özellikle de SEO, performans hedefleri ve geliştirici ekibinizin tercihine bağlı olacaktır. Benim üretim ortamında Next.js'i tercih etmemin ana nedeni, Server Components ve Server Actions ile hem frontend hem de backend mantığını tek bir çatıda, Typescript'in gücüyle yönetebilme yeteneğidir.
## Kurulum ve İlk Adımlar: Next.js Projesi Oluşturma ve Veritabanı Hazırlığı
Next.js ile bir veritabanı entegrasyonu projesine başlamak için öncelikle Next.js projesini oluşturmalı ve ardından veritabanı ortamını hazırlamalısınız. Bu rehberde PostgreSQL veritabanını ve Prisma ORM'yi kullanacağız, çünkü 2026 itibarıyla bu kombinasyon modern Next.js uygulamaları için oldukça popüler ve güçlü bir çözümdür.
### Ön Gereksinimler
Başlamadan önce aşağıdaki yazılımların sisteminizde kurulu olduğundan emin olun:
* **Node.js (v18.17.0 veya üzeri):** Next.js 15 için önerilen sürümdür.
* **npm veya Yarn:** Paket yöneticisi.
* **PostgreSQL:** Yerel makinenizde veya bir bulut hizmetinde çalışan bir PostgreSQL sunucusu.
* **VS Code veya tercih ettiğiniz bir kod editörü.**
### Adım 1: Yeni Bir Next.js Projesi Oluşturma
Terminalinizi açın ve aşağıdaki komutu kullanarak yeni bir Next.js 15 projesi oluşturun. `next-db-app` projenizin adı olacaktır.
```bash
npx create-next-app@latest next-db-app --typescript --tailwind --eslint --app
```
Bu komut size birkaç soru soracaktır:
* `Would you like to use TypeScript?` -> `Yes`
* `Would you like to use ESLint?` -> `Yes`
* `Would you like to use Tailwind CSS?` -> `Yes` (isteğe bağlı, ancak modern uygulamalarda yaygın)
* `Would you like to use `src/` directory?` -> `No` (isteğe bağlı, ancak bu rehberde `src` kullanmayacağız)
* `Would you like to use App Router? (recommended)` -> `Yes` (Next.js 15'in temel mimarisi)
* `Would you like to customize the default import alias?` -> `No`
Proje oluşturulduktan sonra dizine gidin:
```bash
cd next-db-app
```
Projeyi çalıştırarak her şeyin yolunda olduğunu kontrol edin:
```bash
npm run dev
```
Tarayıcınızda `http://localhost:3000` adresine giderek Next.js başlangıç sayfasını görmelisiniz.
### Adım 2: PostgreSQL Veritabanı Hazırlığı
PostgreSQL sunucunuzda yeni bir veritabanı oluşturun. Örneğin, `nextjs_db` adında bir veritabanı oluşturabilirsiniz. Eğer `psql` komut satırı aracını kullanıyorsanız:
```bash
psql -U postgres
```
Ardından psql komut isteminde:
```sql
CREATE DATABASE nextjs_db;
CREATE USER nextjs_user WITH PASSWORD 'your_secure_password';
GRANT ALL PRIVILEGES ON DATABASE nextjs_db TO nextjs_user;
\q
```
> **Pro Tip:** Üretim ortamında, veritabanı kullanıcı adı ve şifresini asla doğrudan kodunuzda veya `.env` dosyasında açıkça tutmayın. Bunun yerine, bulut sağlayıcınızın gizli yönetim hizmetlerini (AWS Secrets Manager, Azure Key Vault vb.) kullanın.
### Adım 3: Prisma ORM Kurulumu
Prisma, Next.js ile veritabanı etkileşimlerini büyük ölçüde basitleştiren modern bir ORM'dir. Projenize Prisma'yı ekleyelim:
```bash
npm install prisma @prisma/client
npm install -D prisma
```
Prisma'yı projenizde başlatın:
```bash
npx prisma init
```
Bu komut, projenizin kök dizininde `prisma` adında bir klasör ve içinde `schema.prisma` dosyası ile bir `.env` dosyası oluşturacaktır.
`.env` dosyasını açın ve `DATABASE_URL` değişkenini PostgreSQL veritabanı bağlantı dizenizle güncelleyin. Örneğin:
```dotenv
DATABASE_URL="postgresql://nextjs_user:your_secure_password@localhost:5432/nextjs_db?schema=public"
```
`schema.prisma` dosyasını açın ve veritabanı modelinizi tanımlayın. Basit bir `Todo` modeli oluşturalım:
```prisma
// prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}
model Todo {
id String @id @default(uuid())
title String
completed Boolean @default(false)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}
```
Schema'nızı tanımladıktan sonra, veritabanı şemasını oluşturmak ve Prisma Client'ı generate etmek için aşağıdaki komutu çalıştırın:
```bash
npx prisma migrate dev --name init
```
Bu komut, `Todo` tablosunu veritabanınızda oluşturacak ve uygulamanızın veritabanıyla etkileşime girmesini sağlayacak Prisma Client'ı generate edecektir. Artık Next.js uygulamanız veritabanı ile konuşmaya hazır!
## Temel Kullanım ve Örnekler: CRUD İşlemleri ve API Endpoints
Bu bölümde, Next.js 15 App Router ve Server Actions kullanarak veritabanı ile temel CRUD (Create, Read, Update, Delete) işlemlerini nasıl gerçekleştireceğimizi adım adım inceleyeceğiz. Odak noktamız, modern Next.js mimarisinde veri yönetimini nasıl yapacağımız olacak.
### Adım 1: Prisma Client'ı Başlatma
`lib/prisma.ts` adında bir dosya oluşturarak Prisma Client'ı başlatacağız. Bu, uygulamanızın her yerinden veritabanına güvenli bir şekilde erişmenizi sağlayacaktır. Next.js'in sıcak yeniden yükleme (hot reloading) özelliği nedeniyle, geliştirme ortamında birden fazla Prisma Client örneğinin oluşturulmasını önlemek için özel bir yaklaşım kullanıyoruz.
```typescript
// lib/prisma.ts
import { PrismaClient } from '@prisma/client';
const globalForPrisma = global as unknown as {
prisma: PrismaClient | undefined;
};
export const prisma = globalForPrisma.prisma ?? new PrismaClient();
if (process.env.NODE_ENV !== 'production') globalForPrisma.prisma = prisma;
```
### Adım 2: Todo Listesi Görüntüleme (READ)
Şimdi `app/page.tsx` dosyasını güncelleyerek veritabanından tüm `Todo`'ları çekip görüntüleyelim. Next.js 15'in Server Components özelliği sayesinde, doğrudan veritabanı sorgularını bileşenler içinde gerçekleştirebiliriz.
```typescript jsx
// app/page.tsx
import { prisma } from '@/lib/prisma';
import TodoItem from '@/components/TodoItem'; // Henüz oluşturmadık, birazdan oluşturacağız
export default async function HomePage() {
const todos = await prisma.todo.findMany({
orderBy: { createdAt: 'desc' },
});
return (
);
}
```
Şimdi `components/TodoItem.tsx` dosyasını oluşturalım:
```typescript jsx
// components/TodoItem.tsx
'use client'; // Bu bileşen istemci tarafında çalışacak
import { Todo } from '@prisma/client';
import { useTransition } from 'react';
import { toggleTodo, deleteTodo } from '@/app/actions'; // Birazdan oluşturacağız
interface TodoItemProps {
todo: Todo;
}
export default function TodoItem({ todo }: TodoItemProps) {
const [isPending, startTransition] = useTransition();
return (
);
}
```
### Adım 3: Görev Ekleme (CREATE) - Server Actions ile
Next.js 15 ile birlikte Server Actions, form gönderimlerini ve veri mutasyonlarını doğrudan sunucu tarafında, API Route'lara ihtiyaç duymadan yönetmenin güçlü bir yolunu sunar. `app/actions.ts` adında bir dosya oluşturalım:
```typescript
// app/actions.ts
'use server'; // Bu dosyadaki tüm fonksiyonların sunucu tarafında çalışacağını belirtir
import { prisma } from '@/lib/prisma';
import { revalidatePath } from 'next/cache';
import { redirect } from 'next/navigation';
export async function addTodo(formData: FormData) {
const title = formData.get('title') as string;
if (!title || title.trim() === '') {
// Hata yönetimi: Geliştirme ortamında konsola yazdırabilir, üretimde loglama servisine gönderebiliriz.
console.error('Başlık boş olamaz.');
return { error: 'Başlık boş olamaz.' };
}
try {
await prisma.todo.create({
data: {
title: title.trim(),
},
});
revalidatePath('/'); // Ana sayfayı yeniden doğrula, böylece yeni görev görünür
} catch (error) {
console.error('Görev eklenirken bir hata oluştu:', error);
// Daha sofistike hata yönetimi burada uygulanabilir, örn. bir hata mesajı döndürme
return { error: 'Görev eklenirken bir hata oluştu.' };
}
// redirect('/'); // Eğer form gönderiminden sonra farklı bir sayfaya yönlendirmek istersek
}
export async function toggleTodo(id: string, completed: boolean) {
try {
await prisma.todo.update({
where: { id },
data: { completed },
});
revalidatePath('/');
} catch (error) {
console.error(`Görev ${id} güncellenirken bir hata oluştu:`, error);
return { error: 'Görev güncellenirken bir hata oluştu.' };
}
}
export async function deleteTodo(id: string) {
try {
await prisma.todo.delete({
where: { id },
});
revalidatePath('/');
} catch (error) {
console.error(`Görev ${id} silinirken bir hata oluştu:`, error);
return { error: 'Görev silinirken bir hata oluştu.' };
}
}
```
Şimdi `app/page.tsx` dosyasındaki formu `addTodo` Server Action'ı kullanacak şekilde güncelleyelim:
```typescript jsx
// app/page.tsx (güncellenmiş form kısmı)
import { prisma } from '@/lib/prisma';
import TodoItem from '@/components/TodoItem';
import { addTodo } from '@/app/actions'; // Yeni eklenen import
export default async function HomePage() {
const todos = await prisma.todo.findMany({
orderBy: { createdAt: 'desc' },
});
return (
);
}
```
Artık uygulamanızda görev ekleyebilir, tamamlandı olarak işaretleyebilir ve silebilirsiniz. Tüm bu işlemler, doğrudan sunucu tarafında çalışan Server Actions ile güvenli ve performanslı bir şekilde gerçekleşir.
## İleri Seviye Teknikler: Next.js 15 ve Veritabanı Optimizasyonları
Next.js 15, veritabanı etkileşimlerini daha verimli ve ölçeklenebilir hale getirmek için bir dizi ileri düzey özellik sunar. Bu bölüm, Server Components, Server Actions, Caching ve Revalidation gibi konulara odaklanarak uygulamanızın performansını ve kullanıcı deneyimini nasıl iyileştirebileceğinizi gösterir.
### 1. Server Components ve Veri Çekme Optimizasyonu
Server Components (Sunucu Bileşenleri), Next.js 15'in en çığır açıcı özelliklerinden biridir. Bu bileşenler sunucuda render edilir ve asla istemciye gönderilmez, bu da istemci tarafındaki JavaScript yükünü önemli ölçüde azaltır. Veritabanı sorgularını doğrudan Server Components içinde yapmak, API katmanına olan ihtiyacı ortadan kaldırır ve veri çekme performansını artırır.
```typescript jsx
// app/dashboard/page.tsx (Örnek Server Component)
import { prisma } from '@/lib/prisma';
import { Suspense } from 'react';
import Loading from './loading';
async function getRecentOrders() {
// Doğrudan veritabanı sorgusu
const orders = await prisma.order.findMany({
where: { status: 'pending' },
take: 10,
orderBy: { createdAt: 'desc' },
});
return orders;
}
async function getCustomerCount() {
// Başka bir veritabanı sorgusu
const count = await prisma.customer.count();
return count;
}
export default async function DashboardPage() {
// Paralel veri çekimi için Promise.all
const [recentOrders, customerCount] = await Promise.all([
getRecentOrders(),
getCustomerCount(),
]);
return (
}>
);
}
```
> **Experience:** Production ortamında Server Components'ı benimsemek, özellikle veri yoğun sayfalarda ilk yükleme süresini %40'a kadar azaltabiliyor. Ancak, istemci tarafı etkileşim gerektiren kısımları `use client` direktifi ile ayırmayı unutmamak kritik. Aksi takdirde, istemci tarafı state yönetimi veya event handler'lar çalışmayacaktır.
### 2. Server Actions ile Güvenli Veri Mutasyonları
Yukarıda gördüğümüz gibi, Server Actions, form gönderimlerini ve diğer veri mutasyonlarını sunucu tarafında işlemenin güvenli ve basit bir yoludur. Bu, CSRF (Cross-Site Request Forgery) gibi güvenlik açıklarını azaltmaya yardımcı olur ve API katmanının karmaşıklığını ortadan kaldırır.
```typescript
// app/products/actions.ts
'use server';
import { prisma } from '@/lib/prisma';
import { revalidatePath } from 'next/cache';
export async function updateProductPrice(productId: string, newPrice: number) {
// Yetkilendirme kontrolü yapılmalı (örn: kullanıcının admin olup olmadığı)
// if (!isAdmin()) { throw new Error('Yetkisiz erişim'); }
try {
await prisma.product.update({
where: { id: productId },
data: { price: newPrice },
});
revalidatePath('/products'); // Ürün listesi sayfasını yeniden doğrula
return { success: true };
} catch (error) {
console.error('Ürün fiyatı güncellenirken hata:', error);
return { error: 'Fiyat güncellenemedi.' };
}
}
```
### 3. Veri Önbellekleme (Caching) ve Yeniden Doğrulama (Revalidation)
Next.js 15, `fetch` API'sini genişleterek ve `revalidatePath`, `revalidateTag` gibi fonksiyonlar sunarak güçlü bir önbellekleme ve yeniden doğrulama mekanizması sağlar. Bu, veritabanı sorgularının tekrar tekrar çalışmasını önleyerek performansı artırır.
* **Statik Önbellekleme:** `fetch` ile yapılan sorgular varsayılan olarak önbelleğe alınır. Eğer veriniz sık değişmiyorsa, bu çok etkilidir.
* **Dinamik Yeniden Doğrulama:** `revalidatePath` veya `revalidateTag` kullanarak belirli yolları veya veri etiketlerini manuel olarak yeniden doğrulayabilirsiniz. Bu, veritabanı güncellendiğinde önbelleğin güncel kalmasını sağlar.
```typescript jsx
// app/blog/[slug]/page.tsx
import { prisma } from '@/lib/prisma';
import { unstable_cache } from 'next/cache'; // 2026 itibarıyla cache API kullanımı
interface PostProps {
params: { slug: string };
}
// Bu fonksiyonun çıktısı belirli bir süre önbelleğe alınır
const getPostBySlug = unstable_cache(async (slug: string) => {
const post = await prisma.post.findUnique({
where: { slug },
});
return post;
}, ['post-by-slug'], { revalidate: 3600 }); // 1 saat sonra yeniden doğrula
export default async function BlogPostPage({ params }: PostProps) {
const post = await getPostBySlug(params.slug);
if (!post) {
return
);
}
```
Yukarıdaki örnekte `unstable_cache` kullanımı, belirli bir veritabanı sorgusunun sonucunu belirli bir süre (3600 saniye = 1 saat) önbelleğe almamızı sağlar. Bu süre sonunda, bir sonraki istekte veri yeniden çekilir. Bu, sık erişilen ama nadiren değişen veriler için idealdir.
### 4. İşlem Yönetimi (Transaction Management)
Veritabanı işlemlerinde birden fazla adımın tek bir atomik operasyon olarak yürütülmesi gerektiğinde transaction'lar kullanılır. Prisma, bu konuda güçlü destek sunar.
```typescript
// lib/transactionalActions.ts
'use server';
import { prisma } from '@/lib/prisma';
import { revalidatePath } from 'next/cache';
export async function transferFunds(fromAccountId: string, toAccountId: string, amount: number) {
if (amount <= 0) {
return { error: 'Transfer miktarı pozitif olmalıdır.' };
}
try {
await prisma.$transaction(async (tx) => {
// 1. Gönderen hesabından bakiyeyi düşür
const sender = await tx.account.update({
where: { id: fromAccountId },
data: { balance: { decrement: amount } },
});
if (sender.balance < 0) {
throw new Error('Yetersiz bakiye.');
}
// 2. Alıcı hesabına bakiyeyi ekle
await tx.account.update({
where: { id: toAccountId },
data: { balance: { increment: amount } },
});
});
revalidatePath('/accounts'); // Hesaplar sayfasını yeniden doğrula
return { success: true, message: 'Para transferi başarıyla tamamlandı.' };
} catch (error: any) {
console.error('Para transferi hatası:', error.message);
return { error: `Para transferi başarısız: ${error.message}` };
}
}
```
Bu `$transaction` kullanımı, bir hata durumunda tüm işlemlerin geri alınmasını (rollback) garanti eder, böylece veritabanı tutarlılığı korunur.
## Best Practices & Anti-Patterns
Next.js ve veritabanı entegrasyonunda doğru yaklaşımlar, uygulamanızın performansını, güvenliğini ve sürdürülebilirliğini doğrudan etkiler. İşte 2026 itibarıyla kabul görmüş en iyi uygulamalar ve kaçınılması gereken anti-pattern'lar:
### ✅ Best Practices
* **Prisma Client'ı Tekil Olarak Başlatın:** `lib/prisma.ts` örneğinde gösterildiği gibi, geliştirme ortamında birden fazla Prisma Client örneği oluşturmayı engelleyin. Bu, veritabanı bağlantı havuzunun (connection pool) etkin kullanılmasını sağlar ve kaynak tüketimini optimize eder.
* **Server Components Kullanarak Veri Çekin:** Veritabanı sorgularını doğrudan Server Components içinde yapın. Bu, istemci tarafına gönderilen JavaScript miktarını azaltır, ilk yükleme süresini iyileştirir ve API katmanına olan bağımlılığı azaltır.
* **Server Actions ile Veri Mutasyonları Yapın:** Form gönderimleri ve veri güncellemeleri için Server Actions kullanın. Bu, daha güvenli, daha basit ve daha performanslı bir veri mutasyon mekanizması sunar ve API Route'lara olan ihtiyacı en aza indirir.
* **`revalidatePath` veya `revalidateTag` Kullanarak Önbelleği Yönetin:** Veritabanı verileri değiştiğinde, ilgili Next.js önbelleğini manuel olarak yeniden doğrulayın. Bu, kullanıcıların her zaman güncel verileri görmesini sağlarken, gereksiz veritabanı sorgularını önler.
* **Ortam Değişkenlerini Kullanın:** Veritabanı bağlantı dizeleri ve diğer hassas bilgileri `.env` dosyalarında saklayın ve bunları `process.env` üzerinden erişin. Asla bu bilgileri doğrudan kodunuza gömmeyin veya sürüm kontrolüne dahil etmeyin. Üretim ortamında, bulut sağlayıcınızın gizli yönetim hizmetlerini tercih edin.
* **Veritabanı İşlemlerini Loglayın:** Veritabanı sorgularını ve hatalarını loglama sisteminize entegre edin. Bu, performans sorunlarını teşhis etmek ve hataları ayıklamak için kritik öneme sahiptir.
* **Schema Validasyonu Yapın:** Gelen verileri veritabanına kaydetmeden önce mutlaka doğrulayın (örn: Zod gibi bir kütüphane ile). Bu, hatalı veya kötü niyetli verilerin veritabanınıza girmesini engeller.
* **N+1 Sorgu Probleminden Kaçının:** İlişkisel veriler çekerken N+1 sorgu probleminden kaçınmak için `include` veya `select` gibi Prisma özelliklerini kullanın. Aksi takdirde, her ana kayıt için ek sorgular yaparak performansı düşürebilirsiniz.
* **Güvenlik için Yetkilendirme ve Kimlik Doğrulama Uygulayın:** Her veritabanı işlemi için kullanıcının gerekli yetkilere sahip olup olmadığını kontrol edin. NextAuth.js gibi kütüphanelerle kimlik doğrulama, Server Actions veya API Route'lar içinde yetkilendirme kontrolleri ekleyin.
### ❌ Anti-Patterns
* **Her İstekte Yeni Prisma Client Oluşturmak:** Her API isteğinde veya Server Action çağrısında yeni bir `new PrismaClient()` örneği oluşturmak, veritabanı bağlantı havuzunu aşırı yükleyebilir ve performans sorunlarına yol açabilir.
* **Hassas Bilgileri Frontend'e Sızdırmak:** Asla veritabanı bağlantı dizeleri, API anahtarları veya diğer hassas bilgileri tarayıcıya açık eden istemci tarafı koduna dahil etmeyin. Bu tür bilgiler sadece sunucu tarafında işlenmelidir.
* **Veritabanı Sorgularını Doğrudan İstemci Bileşenlerinde Yapmak:** `use client` direktifi olan bileşenlerde doğrudan veritabanı sorgusu yapmak mümkün değildir ve güvenlik açıkları yaratır. Bu tür işlemler Server Components veya Server Actions aracılığıyla yapılmalıdı
2026 Next.js Todo Uygulaması
{todos.length === 0 ? (
))
)}
Henüz hiç görev yok. Hadi bir tane ekleyelim!
) : ( todos.map((todo) => (
startTransition(() => toggleTodo(todo.id, !todo.completed))}
className="w-5 h-5 text-blue-600 bg-gray-700 border-gray-600 rounded focus:ring-blue-500 focus:ring-2"
disabled={isPending}
/>
{todo.title}
2026 Next.js Todo Uygulaması
{/* ... (Todo listesi kısmı aynı kalır) ... */}
{todos.length === 0 ? (
))
)}
Henüz hiç görev yok. Hadi bir tane ekleyelim!
) : ( todos.map((todo) => (Yönetim Paneli
Toplam müşteri sayısı: {customerCount}
Son Siparişler
{recentOrders.length > 0 ? (-
{recentOrders.map(order => (
- {order.customerName} - {order.amount} TL ))}
Bekleyen sipariş yok.
)}Yazı bulunamadı.
;
}
return (
{post.title}
{post.content}