We began adopting GraphQL for some internal APIs, and client design emerged as a key concern.
Useful patterns:
- Fragments to isolate UI-level concerns
- Co-location of queries with components (React + Apollo)
- Batching and caching with Apollo Client
Challenges:
- Handling versioning without breaking contract
- Too much flexibility sometimes caused unexpected N+1 calls
Migration Tip: Don’t try to rewrite everything. Create a BFF layer that wraps legacy REST and new GraphQL gradually.