2026'da React Native ve GraphQL: Apollo Client, Sorgular ve Mülakat Soruları

Apollo Client 4.0 ile React Native GraphQL entegrasyonu rehberi. Sorgular, mutasyonlar, önbellekleme, çevrimdışı destek ve mülakat hazırlığı konularını kapsar.

2026'da React Native ve GraphQL: Apollo Client, Sorgular ve Mülakat Soruları

GraphQL, esnek veri çekme ve verimli ağ kullanımı gerektiren React Native uygulamaları için tercih edilen API katmanı haline geldi. 2025 sonunda yayınlanan Apollo Client 4.0, özellikle mobil ortamlar için tasarlanmış %20-30 daha küçük paketler ve geliştirilmiş TypeScript desteği sunan daha hafif bir mimari getiriyor.

Apollo Client 4.0 Temel Değişiklikler

Apollo Client 4.0, React'e özgü dışa aktarımları @apollo/client/react altına ayırıyor, React 19 Suspense ve React Compiler'ı destekliyor ve monolitik ApolloError'u daha iyi hata ayıklama için belirli hata sınıflarıyla değiştiriyor.

React Native'de Apollo Client 4 Kurulumu

Kurulum süreci basit kalmaya devam ediyor. Apollo Client 4.0 hem Expo hem de bare React Native projeleriyle çalışıyor.

bash
# Installation
npm install @apollo/client graphql

İstemci başlatma, ağ istekleri için HttpLink ve yerel durum yönetimi için InMemoryCache gerektiriyor.

src/apollo/client.tstypescript
import { ApolloClient, InMemoryCache, HttpLink } from '@apollo/client';

const httpLink = new HttpLink({
  uri: 'https://api.example.com/graphql',
  // Enable text streaming for @defer and subscriptions
  fetchOptions: {
    reactNative: { textStreaming: true },
  },
});

export const apolloClient = new ApolloClient({
  link: httpLink,
  cache: new InMemoryCache({
    typePolicies: {
      Query: {
        fields: {
          // Merge paginated results
          products: {
            keyArgs: ['category'],
            merge(existing = [], incoming) {
              return [...existing, ...incoming];
            },
          },
        },
      },
    },
  }),
});

typePolicies yapılandırması, sonsuz kaydırmalı mobil uygulamalarda yaygın bir gereksinim olan sayfalandırılmış veriler için önbellek normalizasyonunu yönetiyor.

Uygulamayı ApolloProvider ile Sarmalama

Provider kalıbı, Apollo Client'ı React bileşen ağacına bağlar. Genellikle App.tsx veya Expo Router layout'unda kök seviyeye yerleştirilmelidir.

App.tsxtsx
import { ApolloProvider } from '@apollo/client/react';
import { apolloClient } from './src/apollo/client';
import { RootNavigator } from './src/navigation';

export default function App() {
  return (
    <ApolloProvider client={apolloClient}>
      <RootNavigator />
    </ApolloProvider>
  );
}

Apollo Client 4.0, React hook'larını ana giriş noktası yerine @apollo/client/react'ten içe aktarıyor. Bu değişiklik, çekirdek istemci React dışı bağlamlarda çalıştığında paket boyutunu azaltıyor.

Tip Güvenli GraphQL Sorguları Yazma

GraphQL Code Generator, şemadan TypeScript tipleri üretiyor ve çalışma zamanı tip uyumsuzluklarını ortadan kaldırıyor. İstemci eklentisiyle birlikte kurulmalıdır.

bash
# Install codegen tools
npm install -D @graphql-codegen/cli @graphql-codegen/client-preset

Codegen yapılandırması şemaya işaret eder ve çıktı konumlarını belirler.

codegen.tstypescript
import type { CodegenConfig } from '@graphql-codegen/cli';

const config: CodegenConfig = {
  schema: 'https://api.example.com/graphql',
  documents: ['src/**/*.tsx', 'src/**/*.ts'],
  generates: {
    './src/gql/': {
      preset: 'client',
      config: {
        documentMode: 'string',
      },
    },
  },
};

export default config;

npx graphql-codegen çalıştırıldığında, useQuery hook'unun tükettiği tipli belge düğümleri üretilir.

useQuery ile Veri Çekme

useQuery hook'u yükleme durumlarını, hataları ve önbellek güncellemelerini yönetir. Apollo Client 4.0, daha öngörülebilir durum geçişleri için dataState API'sini tanıtıyor.

src/screens/ProductListScreen.tsxtsx
import { useQuery } from '@apollo/client/react';
import { graphql } from '../gql';
import { ActivityIndicator, FlatList, Text, View } from 'react-native';

const GET_PRODUCTS = graphql(`
  query GetProducts($category: String!, $limit: Int, $offset: Int) {
    products(category: $category, limit: $limit, offset: $offset) {
      id
      name
      price
      imageUrl
    }
  }
`);

export function ProductListScreen({ category }: { category: string }) {
  const { data, loading, error, fetchMore } = useQuery(GET_PRODUCTS, {
    variables: { category, limit: 20, offset: 0 },
    // Fetch from cache first, then network
    fetchPolicy: 'cache-and-network',
    // Keep previous data while fetching new
    notifyOnNetworkStatusChange: true,
  });

  if (error) {
    return <Text>Error: {error.message}</Text>;
  }

  const loadMore = () => {
    fetchMore({
      variables: { offset: data?.products.length ?? 0 },
    });
  };

  return (
    <FlatList
      data={data?.products ?? []}
      keyExtractor={(item) => item.id}
      renderItem={({ item }) => <ProductCard product={item} />}
      onEndReached={loadMore}
      onEndReachedThreshold={0.5}
      ListFooterComponent={loading ? <ActivityIndicator /> : null}
    />
  );
}

cache-and-network çekme politikası, sunucudan yenilerken önbelleğe alınmış verileri anında görüntüler. Bu kalıp, mobil ağlarda algılanan gecikmeyi azaltır.

React Native mülakatlarında başarılı olmaya hazır mısın?

İnteraktif simülatörler, flashcards ve teknik testlerle pratik yap.

Mutasyonlar ve İyimser Güncellemeler

Mutasyonlar sunucu verilerini değiştirir ve yerel önbelleği günceller. İyimser yanıtlar, sunucu değişikliği onaylamadan önce anında geri bildirim sağlar.

src/hooks/useAddToCart.tstsx
import { useMutation } from '@apollo/client/react';
import { graphql } from '../gql';

const ADD_TO_CART = graphql(`
  mutation AddToCart($productId: ID!, $quantity: Int!) {
    addToCart(productId: $productId, quantity: $quantity) {
      id
      items {
        id
        product {
          id
          name
        }
        quantity
      }
      totalPrice
    }
  }
`);

export function useAddToCart() {
  const [addToCart, { loading }] = useMutation(ADD_TO_CART, {
    // Optimistic response for instant UI feedback
    optimisticResponse: ({ productId, quantity }) => ({
      addToCart: {
        __typename: 'Cart',
        id: 'current-cart',
        items: [],
        totalPrice: 0,
      },
    }),
    // Update cache after mutation
    update(cache, { data }) {
      if (!data?.addToCart) return;
      cache.modify({
        id: cache.identify({ __typename: 'Cart', id: 'current-cart' }),
        fields: {
          items: () => data.addToCart.items,
          totalPrice: () => data.addToCart.totalPrice,
        },
      });
    },
  });

  return { addToCart, loading };
}

cache.modify metodu, tüm sorguyu yeniden çekmeden önbelleğe alınmış alanları doğrudan günceller. Bu yaklaşım, hücresel bağlantılarda ağ isteklerini en aza indirir.

Mobil Uygulamalarda Ağ Hatalarını Yönetme

Apollo Client 4.0, genel ApolloError'u belirli hata sınıflarıyla değiştiriyor. Statik .is() metotları, tip güvenli hata yönetimi sağlar.

src/components/ErrorBoundary.tsxtsx
import { NetworkError, GraphQLErrors } from '@apollo/client/errors';
import { Text, Button, View } from 'react-native';

interface Props {
  error: Error;
  onRetry: () => void;
}

export function QueryErrorHandler({ error, onRetry }: Props) {
  // Network failure (offline, timeout, DNS)
  if (NetworkError.is(error)) {
    return (
      <View>
        <Text>Connection failed. Check your internet.</Text>
        <Button title="Retry" onPress={onRetry} />
      </View>
    );
  }

  // GraphQL validation or resolver errors
  if (GraphQLErrors.is(error)) {
    const firstError = error.graphQLErrors[0];
    if (firstError?.extensions?.code === 'UNAUTHENTICATED') {
      return <Text>Session expired. Please log in again.</Text>;
    }
    return <Text>Request failed: {firstError?.message}</Text>;
  }

  return <Text>Something went wrong</Text>;
}

Ağ hatalarını GraphQL hatalarından ayırt etmek, farklı kurtarma stratejilerine olanak tanır: geçici arızalar için yeniden deneme, kimlik doğrulama sorunları için yönlendirme.

Önbellek Kalıcılığı ile Çevrimdışı Destek

Mobil uygulamalar, daha önce çekilen verilere çevrimdışı erişim gerektirir. apollo3-cache-persist kütüphanesi önbelleği AsyncStorage'a serileştirir.

src/apollo/persistence.tstypescript
import AsyncStorage from '@react-native-async-storage/async-storage';
import { persistCache } from 'apollo3-cache-persist';
import { apolloClient } from './client';

export async function initializeCache() {
  await persistCache({
    cache: apolloClient.cache,
    storage: AsyncStorage,
    maxSize: 1024 * 1024 * 5, // 5 MB limit
    debounce: 1000, // Write at most once per second
  });
}

Diskten önbelleğe alınmış verileri geri yüklemek için uygulamayı render etmeden önce initializeCache çağrılmalıdır. Kullanıcılar, ağ erişimi olmadan bile en son çekilen içerikleri anında görür.

GraphQL Subscriptions ile Gerçek Zamanlı Güncellemeler

Subscription'lar sunucu olaylarını WebSocket üzerinden istemciye iletir. Apollo Client 4.0, daha yeni graphql-ws protokolünü destekler.

src/apollo/client.tstypescript
import { split, HttpLink, ApolloClient, InMemoryCache } from '@apollo/client';
import { GraphQLWsLink } from '@apollo/client/link/subscriptions';
import { createClient } from 'graphql-ws';
import { getMainDefinition } from '@apollo/client/utilities';

const httpLink = new HttpLink({ uri: 'https://api.example.com/graphql' });

const wsLink = new GraphQLWsLink(
  createClient({
    url: 'wss://api.example.com/graphql',
    connectionParams: async () => ({
      authToken: await getStoredToken(),
    }),
  })
);

// Route subscriptions to WebSocket, others to HTTP
const splitLink = split(
  ({ query }) => {
    const definition = getMainDefinition(query);
    return (
      definition.kind === 'OperationDefinition' &&
      definition.operation === 'subscription'
    );
  },
  wsLink,
  httpLink
);

export const apolloClient = new ApolloClient({
  link: splitLink,
  cache: new InMemoryCache(),
});

split fonksiyonu, işlem türüne göre operasyonları uygun taşıyıcıya yönlendirir.

Yaygın Mülakat Soruları: React Native GraphQL

Teknik mülakatlar genellikle GraphQL'in mobil cihazlara özgü dengeleme konularındaki anlayışı sorgular. Aşağıdaki sorular React Native pozisyonlarında sıkça karşılaşılır.

Mobil uygulamalar için neden REST yerine GraphQL tercih edilir?

GraphQL, yalnızca istenen alanları döndürerek aşırı veri çekmeyi azaltır. Tek bir sorgu birden fazla REST endpoint'ini değiştirir ve yüksek gecikmeli hücresel bağlantılarda gidiş-dönüş sayısını azaltır. Tipli şema, API uyumsuzluklarını çalışma zamanından önce yakalayarak derleme zamanı doğrulaması sağlar.

Apollo Client verileri nasıl önbelleğe alır?

Apollo, yanıtları __typename ve id'ye göre normalleştirir ve her varlığı bir kez saklar. Sorgular, önbellek anahtarına göre normalleştirilmiş nesnelere başvurur. Bu tekilleştirme bellek tasarrufu sağlar ve tutarlılık sağlar: bir listedeki ürünü güncellemek, onu her yerde günceller.

Apollo Client hangi çekme politikalarını destekler?

PolitikaDavranışKullanım Durumu
cache-firstMevcutsa önbellek döndür, değilse çekVarsayılan, istekleri en aza indirir
cache-and-networkÖnbelleği anında döndür, sonra ağdan güncelleAnında görüntüleme ile taze veri
network-onlyHer zaman çek, önbelleği güncelleEski veriler kabul edilemez olduğunda
cache-onlyHiç çekme, önbellekte yoksa hataÇevrimdışı mod
no-cacheÖnbelleğe almadan çekHassas veriler

İyimser güncellemeler nasıl çalışır?

İstemci mutasyon sonucunu tahmin eder ve sunucu yanıt vermeden önce önbelleği günceller. Sunucu farklı bir sonuç döndürürse, Apollo iyimser veriyi gerçek yanıtla değiştirir. Mutasyon başarısız olursa, Apollo önceki duruma geri döner.

GraphQL'de N+1 problemine ne sebep olur?

İlişkili verileri ayrı ayrı çeken iç içe resolver'lar N+1 sorgusu oluşturur. 50 ürün listesini kategorileriyle birlikte istemek, 1 ürün sorgusu artı 50 kategori sorgusu tetikler. Sunucu tarafında DataLoader bunları tek bir sorguda gruplar.

Apollo Client ile kimlik doğrulama token'ları nasıl yönetilir?

Önerilen yaklaşım, her isteğe token eklemek için Apollo Link kullanır.

src/apollo/authLink.tstypescript
import { setContext } from '@apollo/client/link/context';
import { getStoredToken } from '../auth/storage';

export const authLink = setContext(async (_, { headers }) => {
  const token = await getStoredToken();
  return {
    headers: {
      ...headers,
      authorization: token ? `Bearer ${token}` : '',
    },
  };
});

Bu link, istemci yapılandırmasında HttpLink'ten önce zincirlenmelidir.

React Native'de GraphQL Hata Ayıklama

Apollo, React Native geliştirmesi için çeşitli hata ayıklama seçenekleri sunar. VS Code Apollo uzantısı, önbellek içeriklerini ve sorgu geçmişini gösteren yerleşik Client DevTools içerir.

Bağımsız hata ayıklama için Flipper, react-native-apollo-devtools topluluk eklentisiyle entegre olur. Bu eklenti önbellek durumunu inceler, uçuştaki sorguları izler ve mutasyonları yeniden oynatır.

React Native Debugger üzerinden ağ incelemesi, "Debug JS Remotely" etkinleştirilmesini gerektirir. Network sekmesi daha sonra istek ve yanıt gövdeleriyle GraphQL yüklerini gösterir.

Mobil GraphQL Geliştirmesi İçin Temel Çıkarımlar

  • Apollo Client 4.0, ESM-first paketleme ve ayrılmış React dışa aktarımları sayesinde paket boyutunu %20-30 azaltır.
  • cache-and-network çekme politikası, yavaş bağlantılarda anında görüntüleme ile veri tazeliğini dengeler.
  • İyimser güncellemeler anında geri bildirim sağlar; cache.modify gereksiz yeniden çekmeleri önler.
  • Apollo Client 4.0'daki tipli hata sınıfları, ağ arızaları ile GraphQL hataları için belirli işleme sağlar.
  • apollo3-cache-persist ile önbellek kalıcılığı, daha önce çekilen verilere çevrimdışı erişim sağlar.
  • GraphQL subscription'ları graphql-ws protokolü ve split link yapılandırması gerektirir.
  • Mülakat soruları, önbellekleme stratejileri, çekme politikaları ve N+1 önleme gibi mobil cihazlara özgü dengeleme konularına odaklanır.

Pratik yapmaya başla!

Mülakat simülatörleri ve teknik testlerle bilgini test et.

Günün meydan okuması

React Native kodundaki hatayı bulabilir misin?

Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Anthony Fillion-Maillet

Yazan:

Anthony Fillion-Maillet

SharpSkill kurucusu

10 yılı aşkın süredir fullstack geliştirici. SharpSkill’i yönetiyor ve burada yayımlanan her şeyden sorumlu.

20 Ağustos 2026 tarihinde güncellendi

Paylaş

İlgili makaleler