GraphQL solved over-fetching + under-fetching. But introduced N+1 queries + complex caching. Understanding the architecture prevents pitfalls.
Query language
Client specifies exact shape needed. Reduces over-fetching. Enables schema stitching for federated services.
Query language
Client specifies exact shape needed. Reduces over-fetching. Enables schema stitching for federated services.
Resolvers
Each field has a resolver function. Parent's return value + args → this field's value. Composable.
N+1 problem
Query for 100 users. Each user has posts. Naive resolver: 1 query for users + 100 queries for posts. Catastrophic.
DataLoader pattern
Batch + cache per request. Collect all post IDs needed → single batched query → distribute results back. 100 queries → 2.
Caching complexity
Every query is unique. HTTP cache doesn't work. Persisted queries + custom fingerprinting or normalized cache (Apollo, Relay).