DEV Community

EME GUG
EME GUG

Posted on

Tại sao mình chuyển từ REST sang GraphQL (và khi nào không nên)

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

Version hell

/api/v1/users
/api/v2/users  (thêm field mới)
/api/v3/users  (đổi format)
Enter fullscreen mode Exit fullscreen mode

GraphQL giải quyết thế nào

query {
    post(id: "456") {
        title
        content
        author {
            name
            avatar
        }
        comments(first: 10) {
            text
            createdAt
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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),
    },
};
Enter fullscreen mode Exit fullscreen mode

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
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

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));
});
Enter fullscreen mode Exit fullscreen mode

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?

Top comments (0)