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.

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, 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.
# Installation
npm install @apollo/client graphqlİstemci başlatma, ağ istekleri için HttpLink ve yerel durum yönetimi için InMemoryCache gerektiriyor.
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.
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.
# Install codegen tools
npm install -D @graphql-codegen/cli @graphql-codegen/client-presetCodegen yapılandırması şemaya işaret eder ve çıktı konumlarını belirler.
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.
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.
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.
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.
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.
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?
| Politika | Davranış | Kullanım Durumu |
|---|---|---|
cache-first | Mevcutsa önbellek döndür, değilse çek | Varsayılan, istekleri en aza indirir |
cache-and-network | Önbelleği anında döndür, sonra ağdan güncelle | Anında görüntüleme ile taze veri |
network-only | Her zaman çek, önbelleği güncelle | Eski veriler kabul edilemez olduğunda |
cache-only | Hiç çekme, önbellekte yoksa hata | Çevrimdışı mod |
no-cache | Önbelleğe almadan çek | Hassas 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.
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.modifygereksiz 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-persistile önbellek kalıcılığı, daha önce çekilen verilere çevrimdışı erişim sağlar.- GraphQL subscription'ları
graphql-wsprotokolü 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.
React Native kodundaki hatayı bulabilir misin?
Gerçek bir kod parçası, gizli bir hata, günde bir deneme. Denemek için hesap gerekmez.

Yazan:
Anthony Fillion-MailletSharpSkill 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

React Native Uygulama Geliştirme Rehberi 2026: Prodüksiyon Uygulamaları ve Mülakat Soruları
2026 yılında React Native ile prodüksiyon uygulamaları geliştirmenin kapsamlı rehberi. Expo SDK 56, EAS Build, Hermes V1, Yeni Mimari ve React Native geliştiricileri için mülakat hazırlığı.

2026'da React Native Uygulama Geliştirme: Kapsamlı Kılavuz ve Mülakat Soruları
2026'da React Native uygulama geliştirmeyi Yeni Mimari, JSI, Fabric ve TurboModules ile öğrenin. Kod örnekleri ve mülakat soruları içeren pratik tutorial.

React Native 0.87 ve SwiftPM 2026: Modern iOS Build ve Mülakat Soruları
React Native 0.87 deneysel Swift Package Manager desteği sunarak CocoaPods ihtiyacını ortadan kaldırıyor. SwiftPM yapılandırması, otomatik bağlama ve mülakat hazırlığı hakkında bilgi edinin.