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şım | Nasıl çalışır | Uygun olduğu durum |
|---|---|---|
| OpenAPI (Swagger) | API bir YAML/JSON şemasıyla tanımlanır, client ve tipler üretilir | Farklı dillerde backend, public API, mobil + web |
| tRPC | Backend fonksiyonlarının TypeScript tipleri doğrudan frontend'e akar, codegen yok | Full 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.tsimport 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 verirtRPC ö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 tipliPratik 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.
İlgili Web Mimarisi soruları
- SSR, SSG ve CSR arasındaki farklar nelerdir?
- Monorepo nedir? Avantajları, dezavantajları ve araçları nelerdir?
- MVC mimarisi nedir? Modern web uygulamalarında nasıl karşılık bulur?
- Bir kullanıcı girişinin uçtan uca akışını (frontend'den veritabanına) anlatın.
- Büyük dosya yükleme akışını nasıl tasarlarsınız? Presigned URL nedir?
- Backend for Frontend (BFF) deseni nedir, ne zaman kullanılır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.