Mình dùng REST 5 năm trước khi thử GraphQL. Đây là những gì mình học được — cả ưu và nhược.
Vấn đề với REST
Over-fetching
GET /api/users/123
→ Trả về 30 fields, frontend chỉ cần name + avatar
Under-fetching
GET /api/posts/456 → Lấy bài viết
GET /api/users/123 → Lấy tác giả
GET /api/posts/456/comments → Lấy comments
→ 3 requests cho 1 trang
Version hell
/api/v1/users
/api/v2/users (thêm field mới)
/api/v3/users (đổi format)
GraphQL giải quyết thế nào
query {
post(id: "456") {
title
content
author {
name
avatar
}
comments(first: 10) {
text
createdAt
}
}
}
1 request, lấy đúng data cần. Không over-fetch, không under-fetch.
Setup (Node.js + Apollo)
const { ApolloServer } = require('@apollo/server');
const typeDefs = `
type User {
id: ID!
name: String!
email: String!
posts: [Post!]!
}
type Post {
id: ID!
title: String!
author: User!
}
type Query {
user(id: ID!): User
posts(limit: Int): [Post!]!
}
type Mutation {
createPost(title: String!, content: String!): Post!
}
`;
const resolvers = {
Query: {
user: (_, { id }) => getUserById(id),
posts: (_, { limit }) => getPosts(limit),
},
User: {
posts: (user) => getPostsByUserId(user.id),
},
};
Khi nào GraphQL tốt hơn REST?
✅ Dùng GraphQL khi:
- Frontend cần flexibility (mobile vs web cần data khác nhau)
- Quan hệ data phức tạp (social network, e-commerce)
- Nhiều team cùng dùng API
- Tránh over-fetching quan trọng (mobile, bandwidth thấp)
❌ Giữ REST khi:
- API đơn giản, ít endpoints
- File upload (GraphQL hỗ trợ nhưng phức tạp)
- Caching đơn giản (REST dùng HTTP cache, GraphQL phải dùng client cache)
- Team nhỏ, product đơn giản
- Microservices giao tiếp nội bộ
Nhược điểm GraphQL (thật sự)
1. N+1 Query Problem
query {
posts { # 1 query
author { # N queries (mỗi post 1 query lấy author)
name
}
}
}
Fix: DataLoader
const DataLoader = require('dataloader');
const userLoader = new DataLoader(async (ids) => {
const users = await User.findAll({ where: { id: ids } });
return ids.map(id => users.find(u => u.id === id));
});
2. Caching khó hơn
REST: GET /users/123 → HTTP cache tự nhiên.
GraphQL: Mọi request đều POST → phải dùng client-side cache (Apollo Client).
3. Error handling phức tạp
REST: HTTP status code nói rõ lỗi gì.
GraphQL: Luôn trả 200, lỗi nằm trong errors array.
Kết luận
GraphQL không thay thế REST. Nó giải quyết problems khác. Chọn tool phù hợp với problem của bạn.
Bạn dùng REST hay GraphQL? Hay cả hai?













