Next.js & Modern Web
18 dk okuma (2800+ kelime)•Güncellendi: 2026-03-20

Next.js 16 Caching Katmanları: Data Cache, Request Memoization ve Router Cache Mimarisi

Özet & Kapsam (Executive Summary)

Next.js App Router mimarisindeki en büyük yanlış anlaşılma caching sistemidir. Bu rehber; Request Memoization, Data Cache, Full Route Cache ve Router Cache katmanlarının tam olarak nasıl etkileşime girdiğini, bellek sızıntılarını önleme yöntemlerini ve kurumsal ölçekte revalidation stratejilerini pratik kod örnekleriyle ele almaktadır.

S
Sarp ErgünBaş Yazılım Mimarı, Monova Medya
Kritik Çıkarımlar & Önemli Noktalar
  • Request Memoization sadece React render döngüsü boyunca yaşar; sunucu istekleri arasında paylaşılmaz.
  • Data Cache, Node.js process restart edilse bile diske veya harici depolamaya persist edilebilir.
  • Next.js 15 ve 16 ile birlikte fetch istekleri varsayılan olarak no-store (önbelleğe alınmaz) moduna geçmiştir; stratejik cache opt-in şarttır.
  • revalidateTag() ve revalidatePath() çağrıları sunucu eylemleri (Server Actions) içinde tetiklenmelidir.
  • İstemci tarafındaki Router Cache, sayfa geçişlerini anlık kılmakla birlikte dinamik verilerde router.refresh() gerektirebilir.

1. Next.js Caching Ekosistemine Genel Bakış

Modern web geliştirmede performans, istemciye gönderilen kodun küçüklüğü kadar sunucunun yanıt verme hızıyla (TTFB) da doğrudan ilişkilidir. Next.js App Router, veriyi sadece tek bir yerde saklamak yerine dört farklı yaşam döngüsüne sahip caching katmanında yönetir. Birçok geliştirici Next.js projelerinde "Verimi güncelledim ama ekranda hala eskisi görünüyor" veya "Sayfam her istekte veritabanına gidiyor, sunucu kaynaklarım tükendi" şikayetleriyle karşılaşır. Bunun kök nedeni, bu dört katmanın birbiriyle nasıl konuştuğunu bilmemekten kaynaklanır.

2. Dört Temel Katmanın Anatomisi

Next.js caching sistemini bir hiyerarşi olarak anlamak gerekir. Bir HTTP isteği tarayıcıdan çıktığı andan itibaren sırasıyla şu katmanlardan geçer:
KatmanNerede Yaşar?Ne Saklar?AmaçYaşam Döngüsü
Request MemoizationSunucu (Bellek)fetch() fonksiyon dönüşleriAynı render ağacında çift çağrıyı önlemeTek bir render isteği boyunca
Data CacheSunucu (Disk/Kalıcı)HTTP API / DB Yanıtlarıİstekler ve dağıtımlar arasında veriyi korumaKalıcı (Revalidate olana dek)
Full Route CacheSunucu (Disk/Edge)HTML ve RSC PayloadStatik sayfaları sıfır CPU ile sunmaBuild zamanı veya revalidation
Router Cacheİstemci (Tarayıcı)Ziyaret edilen RSC segmentleriGeri/İleri ve anlık sayfa geçişleriKullanıcı oturumu süresince

3. Request Memoization: Aynı İsteği Tekrar Etmeme Sanatı

React Server Components mimarisinde bileşen ağacının farklı derinliklerinde aynı kullanıcı bilgisine veya ürün detayına ihtiyaç duyabilirsiniz. Props drilling yapmadan aynı fetch fonksiyonunu çağırmak eskiden performans felaketiydi. React ve Next.js, aynı URL ve opsiyonlara sahip GET fetch çağrılarını tek bir render döngüsü boyunca otomatik olarak memoize eder. İlk çağrı gerçek HTTP isteğini atar, ağaçtaki diğer tüm çağrılar bellekteki referansı döndürür.
// components/Header.tsx ve components/Sidebar.tsx içinde ayrı ayrı çağrılsa bile
// ağ üzerinden sadece 1 adet istek gönderilir:
async function getCurrentUser() {
  const res = await fetch('https://api.monova.digital/user/me');
  return res.json();
}

export async function Header() {
  const user = await getCurrentUser();
  return <header>Hoş geldiniz, {user.name}</header>;
}

4. Data Cache & Zaman Temelli / On-Demand Revalidation

Data Cache, istekler arasında paylaşılan sunucu önbelleğidir. Next.js 16'da verilerinizi ne kadar süreyle taze tutacağınızı iki ana stratejiyle belirlersiniz: 1. **Zaman Temelli (Time-based):** Belirli saniyeler boyunca veri korunur (örneğin döviz kurları için 60 saniye). 2. **Talep Doğrultusunda (On-Demand):** Veri bir yönetim panelinden güncellendiğinde 'tag' bazlı anında geçersiz kılınır.
Üretim Tavsiyesi

Kurumsal sistemlerde zaman temelli (time-based) revalidate yerine her zaman etiket tabanlı (tag-based) revalidateTag() kullanın. Bu sayede veri güncellenmediği sürece sonsuza dek önbellekten milisaniyelik hızla sunulur.

// Veriyi etiketle önbelleğe alma:
export async function getProduct(slug: string) {
  const res = await fetch(`https://api.monova.digital/products/${slug}`, {
    next: { tags: ['products', `product-${slug}`] }
  });
  return res.json();
}

// Bir Server Action içinde anında geçersiz kılma:
'use server';
import { revalidateTag } from 'next/cache';

export async function updateProductStock(slug: string) {
  // DB güncellemesi yapıldıktan sonra:
  revalidateTag(`product-${slug}`);
}

7. Sahada En Sık Yapılan 5 Caching Hatası

Yüzlerce kurumsal kod denetiminde tespit ettiğimiz ve performansı felç eden en yaygın hatalar: - **Hata 1: Dinamik Fonksiyonları Bilinçsizce Kullanmak:** Sayfanın en üstünde `cookies()` veya `headers()` çağırmak, tüm sayfayı otomatik olarak Full Route Cache dışına atar ve dinamik render moduna zorlar. - **Hata 2: İstemci router.refresh() ile Sunucu Önbelleğini Temizleyeceğini Sanmak:** `router.refresh()` sadece tarayıcının Router Cache'ini temizler; sunucudaki Data Cache geçersiz kılınmadıkça sunucu eski veriyi üretmeye devam eder. - **Hata 3: fetch yerine doğrudan ORM (Prisma/Drizzle) Çağrılarında Cache Unutulması:** Doğrudan veritabanı sorguları Next.js fetch sarmalayıcısından geçmediği için varsayılan olarak önbelleğe alınmaz. Bunun için `unstable_cache` veya React `cache()` kullanılmalıdır. - **Hata 4: Mutasyon Sonrası redirect() Sıralaması:** `revalidateTag()` çağrısını `redirect()` sonrasına koymak; `redirect()` dahili bir hata (NEXT_REDIRECT) fırlattığı için revalidation satırının hiçbir zaman çalışmamasına neden olur.

9. Sonuç & Production Kontrol Listesi

Next.js App Router'da caching bir engel değil, sitenizi 50ms altında açmanızı sağlayan en gelişmiş süper güçtür. Canlıya çıkmadan önce şu kontrol listesini mutlaka tamamlayın: ✓ Dinamik fonksiyonları (cookies, headers) sadece gereken en alt bileşenlere izole edin. ✓ Tüm harici API çağrılarına anlamlı cache tag'leri atayın. ✓ Server Action form submit sonrasında ilgili sayfaları revalidateTag ile yenileyin. ✓ Lighthouse Core Web Vitals testlerinde TTFB değerinin 200ms altında olduğunu doğrulayın.

Konuyla İlgili Sıkça Sorulan Sorular

Evet. Next.js 15 ve 16 sürümlerinde fetch istekleri artık varsayılan olarak no-store modundadır. Veriyi önbelleğe almak istiyorsanız açıkça force-cache veya next: { revalidate: ... } belirtmelisiniz.

Evet, ORM ve doğrudan SQL sorgularını Data Cache katmanına bağlamak için Next.js tarafından resmi olarak sağlanan ve yaygın kullanılan yöntemdir.

Next.js konfigürasyonunda experimental.staleTimes ayarı ile dinamik ve statik segmentlerin tarayıcıda kaç saniye taze tutulacağı milimetrik olarak yönetilebilir.

İlgili Hizmetimiz

Bu Stratejiyi Profesyonelce Uygulayalım

Uzman ekibimizle markanız için bu metodolojiyi anahtar teslim hayata geçirin.

Teklif Alın →
Büyümeye Hazır Mısınız?

Bu konudaki tecrübemizi markanız için kullanalım.

Gelin, dijital büyüme hedeflerinizi birlikte planlayalım ve hayata geçirelim.

24 Saat İçinde Detaylı Teklif
Ücretsiz 30 Dk Keşif Görüşmesi