← BACK TO PORTFOLIO

/WRITING · SOFTWARE ARCHITECTURE

REST vs. GraphQL: A Practical Engineering Breakdown

Stop choosing APIs based on hype. A practical guide to choosing between REST and GraphQL based on data shape, caching constraints, and team velocity.

Published note6 MIN READ

I see a recurring pattern in architecture discussions and code reviews: teams defaulting to GraphQL for every new project because it is the current trend, while treating REST like a legacy afterthought.

The result is often unnecessary complexity, caching headaches, and strained backend resources. Each API architecture was designed for a specific set of constraints. Choosing the right one isn't about following a trend; it's about matching the tool to the product's core data requirements.

REST: The Document-Oriented Workhorse

REST follows a resource-based, request-response model. The client asks for a specific document (e.g., `/users/123`), the server answers, and the connection closes. This is optimal for:

  • Simple CRUD operations
  • Heavy HTTP/CDN caching requirements
  • File uploads (multipart/form-data)
  • Predictable, flat data shapes

It is simple, stateless, and highly cacheable. However, it is fundamentally rigid when data requirements change rapidly.

Architecture diagram showing a linear, stateless HTTP request from client to a single database endpoint and the subsequent full-document response.

GraphQL: The Graph-Oriented Orchestrator

GraphQL treats your data as a connected graph. The client sends a single query specifying the exact shape of the data it needs. A resolver engine orchestrates the fetch, aggregates the results, and returns a unified payload. This is ideal for:

  • Complex, deeply nested data relationships
  • Avoiding over-fetching and under-fetching
  • Rapid frontend iteration (no backend deploys for new UI fields)
  • Aggregating multiple microservices behind a single gateway
Architecture diagram showing a GraphQL resolver engine fanning out to multiple databases and aggregating the results into a single optimized payload.
TE TAIWO EMMANUEL / CODE NOTE
GRAPHQL
// GraphQL Query: Client dictates the exact shape
query GetUserFeed {
  user(id: "123") {
    name
    posts {
      title
      author { name }
    }
  }
}

// Result: Only the requested fields are returned.
// No over-fetching of unrelated user metadata.

Real-World Example: The Blog Platform

Imagine you are building a blogging platform.

**Use REST** to fetch a single blog post (`GET /posts/123`). It is cacheable at the CDN level, simple to implement, and the data shape is predictable.

**Use GraphQL** to fetch a user's home feed. You need the post title, the author's name, the comment count, and the like status. With REST, this might require 4 separate endpoints or one massively over-fetching endpoint. With GraphQL, the resolver engine orchestrates this in a single, optimized request.

The Takeaway

Production systems don't guess. They match the tool to the job.

  • Need real-time, bidirectional, or highly nested data? **GraphQL**.
  • Building simple, stateless, heavily cached CRUD APIs? **REST**.

Stop choosing your API architecture based on hype. Choose based on your data shape, caching constraints, and team velocity.

TE TAIWO EMMANUEL / CODE NOTE
JAVASCRIPT
// The REST Over-fetching Problem:
// Client only needs the post title, but receives the entire document.

fetch('/api/posts/123')
  .then(res => res.json())
  .then(data => {
    console.log(data.title); 
    // data.body, data.comments, data.metadata 
    // were also downloaded and parsed unnecessarily.
  });

/OCCASIONAL_NOTES

Useful notes, when there’s something worth sharing.

A low-volume digest on product systems, interfaces, and technical work. Your email stays in Taiwo’s private portfolio list—no third-party tracking.