Frontend ve backend arasında API sözleşmesini (contract) nasıl yönetirsiniz? OpenAPI, tRPC ve GraphQL codegen yaklaşımlarını karşılaştırın.

Cevap

Amaç, backend bir alanı değiştirdiğinde frontend'in bunu çalışma zamanında değil derleme zamanında fark etmesidir. Bunun için API'nin tek bir kaynaktan tanımlanıp tiplerin otomatik üretilmesi gerekir.

YaklaşımNasıl çalışırUygun olduğu durum
OpenAPI (Swagger)API bir YAML/JSON şemasıyla tanımlanır, client ve tipler üretilirFarklı dillerde backend, public API, mobil + web
tRPCBackend fonksiyonlarının TypeScript tipleri doğrudan frontend'e akar, codegen yokFull TypeScript monorepo (Next.js + Node)
GraphQL + codegenŞema ve sorgulardan tipli hook'lar üretilirÇok farklı ekranlar, esnek veri ihtiyacı

OpenAPI örneği

# Backend'in ürettiği şemadan tipleri üret
npx openapi-typescript https://api.ornek.com/openapi.json -o src/api/schema.ts
import createClient from "openapi-fetch";
import type { paths } from "./api/schema";

const api = createClient<paths>({ baseUrl: "/api" });
const { data, error } = await api.GET("/users/{id}", { params: { path: { id: "42" } } });
// data tipi şemadan gelir; alan adı değişirse derleme hata verir

tRPC örneği

// server
export const appRouter = router({
  userById: publicProcedure.input(z.object({ id: z.string() }))
    .query(({ input }) => db.user.findUnique({ where: { id: input.id } })),
});
// client: trpc.userById.useQuery({ id: "42" }) tamamen tipli

Pratik kurallar

  • Code-first (koddan şema üretmek: NestJS, FastAPI, Zod-to-OpenAPI) veya schema-first (önce şema, sonra kod) seçin ama tek kaynak olsun.
  • CI'da şema farkını kontrol edin; kırıcı değişiklik (alan silme, tip değiştirme) PR'da yakalansın (oasdiff, GraphQL Inspector).
  • Tipler derleme zamanı garantisidir; çalışma zamanında gelen veriyi de (özellikle dış API'lerden) Zod ile doğrulamak iyi pratiktir.
  • tRPC, client ve server aynı repoda ve TypeScript olduğunda harikadır; mobil uygulama veya üçüncü taraf tüketici varsa OpenAPI daha uygundur.
  1. SSR, SSG ve CSR arasındaki farklar nelerdir?OrtaWeb MimarisiFull Stack
  2. Monorepo nedir? Avantajları, dezavantajları ve araçları nelerdir?ZorWeb MimarisiFull Stack
  3. MVC mimarisi nedir? Modern web uygulamalarında nasıl karşılık bulur?KolayWeb MimarisiFull Stack
  4. Bir kullanıcı girişinin uçtan uca akışını (frontend'den veritabanına) anlatın.OrtaWeb MimarisiFull Stack
  5. Büyük dosya yükleme akışını nasıl tasarlarsınız? Presigned URL nedir?ZorWeb MimarisiFull Stack
  6. Backend for Frontend (BFF) deseni nedir, ne zaman kullanılır?OrtaWeb MimarisiFull Stack

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle