Programming
น้องๆ เคยเจอปัญหาไหม? เรียกข้อมูลจาก API มาเพียบ แต่ใช้จริงแค่ 2-3 ช่อง ที่เหลือคือ "ขยะ" เต็ม bandwidth ไปหมด สมัยผมทำร้านเน็ต bandwidth มันแพงนะเฟ้ย! ทุก byte มีค่า GraphQL เลยเข้ามาเป็นพระเอกขี่ม้าขาว (หรือเปล่า?) มาดูกันว่ามันต่างจาก REST API ยังไง และทำไมเราต้องสนใจมัน
REST API เนี่ย เหมือนเราสั่งอาหารตามเมนูเป๊ะๆ อยากกินอะไรก็สั่งตามนั้น แต่ GraphQL เหมือนเราบอกเชฟว่า "ขอข้าวผัด ใส่หมู ไม่ใส่ผักชี เพิ่มไข่ดาว" คือเจาะจงได้ตามใจชอบเลย
ก่อนจะลงสังเวียน GraphQL vs REST API เราต้องมีพื้นฐานกันก่อนนะน้อง
REST (Representational State Transfer) เนี่ย เป็น architecture style ที่ใช้กันมานานนม หลักๆ คือ Client ส่ง Request ไปหา Server, Server ก็ Return Response กลับมา โดยใช้ HTTP verbs (GET, POST, PUT, DELETE) เป็นตัวจัดการ
ยกตัวอย่างง่ายๆ: อยากได้ข้อมูล user id 123 ก็ GET ไปที่ /users/123 Server ก็ส่งข้อมูล user นั้นกลับมาให้
GraphQL สร้างโดย Facebook (พี่มาร์คแกชอบสร้างอะไรใหม่ๆ) มันเป็น Query Language สำหรับ API คือเราจะ query อะไรก็ได้ตาม schema ที่กำหนดไว้
ที่สำคัญคือ GraphQL แก้ปัญหา Over-fetching (ได้ข้อมูลมาเกิน) และ Under-fetching (ได้ข้อมูลไม่พอ) ได้อย่างดี
Schema ใน GraphQL คือตัวกำหนดว่าเราสามารถ query อะไรได้บ้าง มี fields อะไรบ้าง และแต่ละ field มี type อะไรบ้าง เปรียบเหมือนพิมพ์เขียวบ้าน ถ้าไม่มีพิมพ์เขียว ช่างก็สร้างบ้านไม่ได้
Schema เขียนด้วย Schema Definition Language (SDL) ซึ่งเข้าใจง่ายมากๆ
มาดูวิธีใช้งานของแต่ละตัวกันบ้าง เริ่มจาก REST ก่อนเลย
REST API เนี่ยง่ายตรงที่เราใช้ HTTP verbs ได้เลย แต่ต้องออกแบบ API endpoints ให้ดี ไม่งั้นจะมั่วซั่วไปหมด
ตัวอย่าง code (Node.js + Express):
const express = require('express');
const app = express();
app.get('/users/:id', (req, res) => {
const userId = req.params.id;
// ดึงข้อมูล user จาก database
const user = { id: userId, name: 'John Doe', email: 'john.doe@example.com' };
res.json(user);
});
app.listen(3000, () => {
console.log('Server listening on port 3000');
});
อันนี้คือ endpoint ง่ายๆ สำหรับดึงข้อมูล user ตาม id
GraphQL ซับซ้อนกว่า REST นิดหน่อย แต่ยืดหยุ่นกว่าเยอะ เราต้อง define schema ก่อน แล้วค่อยเขียน resolvers เพื่อดึงข้อมูล
ตัวอย่าง code (Node.js + Apollo Server):
const { ApolloServer, gql } = require('apollo-server');
// Define schema
const typeDefs = gql`
type User {
id: ID!
name: String!
email: String
}
type Query {
user(id: ID!): User
}
`;
// Define resolvers
const resolvers = {
Query: {
user: (parent, args, context) => {
const userId = args.id;
// ดึงข้อมูล user จาก database
return { id: userId, name: 'John Doe', email: 'john.doe@example.com' };
},
},
};
// Create Apollo Server
const server = new ApolloServer({ typeDefs, resolvers });
// Start the server
server.listen().then(({ url }) => {
console.log(`Server ready at ${url}`);
});
อันนี้คือ server GraphQL ง่ายๆ ที่มี query สำหรับดึงข้อมูล user ตาม id
มาลองทำตามขั้นตอนง่ายๆ กัน
mkdir my-rest-api && cd my-rest-apinpm install expressindex.js แล้วใส่ code ตัวอย่างข้างบนnode index.jsmkdir my-graphql-api && cd my-graphql-apinpm install apollo-server graphqlindex.js แล้วใส่ code ตัวอย่างข้างบนnode index.jsREST API: ใช้ Postman หรือ curl ก็ได้ GET ไปที่ http://localhost:3000/users/123
GraphQL: เข้าไปที่ GraphQL Playground (ปกติจะอยู่ที่ http://localhost:4000) แล้วเขียน query:
query {
user(id: "123") {
id
name
email
}
}
นอกจาก REST API แล้ว ยังมีทางเลือกอื่นอีกไหม? ตอบ: มีแน่นอน!
แต่ REST API กับ GraphQL ถือเป็นตัวเลือกหลักๆ ที่ใช้กันเยอะที่สุดในปัจจุบัน
มาดูตารางเปรียบเทียบกันชัดๆ:
| Feature | REST API | GraphQL |
|---|---|---|
| Over-fetching/Under-fetching | มีปัญหา | แก้ปัญหาได้ |
| Schema | ไม่มี | มี |
| Versioning | ต้องจัดการเอง | ไม่ต้อง version |
| Caching | HTTP caching | ซับซ้อนกว่า |
| Complexity | ง่ายกว่า | ซับซ้อนกว่า |
| Developer Experience | แล้วแต่ design | ดีกว่า |
เห็นไหมว่า GraphQL มีข้อดีหลายอย่าง แต่ก็ไม่ได้แปลว่า REST API ไม่ดีนะ มันขึ้นอยู่กับ use case ของเรามากกว่า
ถ้าโปรเจคเล็กๆ ไม่ซับซ้อน REST API ก็ยังเป็นตัวเลือกที่ดี แต่ถ้าโปรเจคใหญ่ๆ มี data เยอะ GraphQL อาจจะตอบโจทย์กว่า
สมัยผมทำ SiamCafe Blog ผมใช้ REST API เพราะมันง่ายดี แต่ถ้าให้เริ่มใหม่ตอนนี้ อาจจะลอง GraphQL ดูบ้าง
สุดท้ายแล้ว ไม่มีอะไรดีที่สุดในทุกกรณี ลองศึกษาดู แล้วเลือกสิ่งที่เหมาะกับเราที่สุดนะน้องๆ
อย่าลืมแวะไปอ่านบทความอื่นๆ ใน SiamCafe Blog นะ มีอะไรดีๆ อีกเยอะเลย
ดูวิดีโอเพิ่มเติมเกี่ยวกับGraphql vs Rest Api:
เอาล่ะ มาถึงส่วนที่สำคัญที่สุดละ ประสบการณ์จริงล้วนๆ ที่ผมเจอมาจากการทำโปรเจกต์ต่างๆ ที่ SiamCafe ตั้งแต่ยุคบุกเบิกจนถึงปัจจุบัน ทั้ง GraphQL และ REST API มันมีเคล็ดลับเล็กๆ น้อยๆ ที่ช่วยให้ชีวิตเราง่ายขึ้นเยอะเลย
1. เลือกใช้ให้ถูกงาน: อันนี้สำคัญสุดๆ ไม่ใช่ว่า GraphQL จะดีกว่า REST API เสมอไปนะ มันขึ้นอยู่กับ use case ของเรามากกว่า ถ้าโปรเจกต์เล็กๆ API ไม่ซับซ้อน REST API นี่แหละจบไวสุดแล้ว แต่ถ้า API ซับซ้อน มี client หลายแบบ GraphQL จะช่วยลดภาระงานได้เยอะ
สมัยผมทำร้านเน็ตฯ REST API นี่แหละตอบโจทย์ เพราะข้อมูลไม่ได้เยอะซับซ้อนอะไรมาก แค่จัดการ user, เกม, billing แต่ถ้าเป็นโปรเจกต์ใหญ่ๆ ที่มีข้อมูลเยอะๆ เช่น ระบบจัดการคลังสินค้า หรือระบบ e-commerce ที่มี client หลายแบบ GraphQL จะเวิร์คกว่า
2. Caching is your friend: ไม่ว่าจะ GraphQL หรือ REST API Caching ช่วยลดภาระ server ได้เยอะมากๆ ยิ่งถ้าข้อมูลมีการเปลี่ยนแปลงไม่บ่อย การทำ caching จะช่วยให้ API เร็วขึ้นหลายเท่าตัว
ผมเคยเจอเคสที่ API ช้ามากๆ เพราะ query ข้อมูลจาก database ทุกครั้งที่ request เข้ามา พอใส่ caching เข้าไปเท่านั้นแหละ เร็วปรื๊ดเลย ลองใช้ Redis หรือ Memcached ดูนะ ง่ายและ effective มาก
3. Versioning is a must: ไม่ว่าจะ GraphQL หรือ REST API การทำ versioning สำคัญมากๆ เพราะ API มีการเปลี่ยนแปลงตลอดเวลา ถ้าไม่มี versioning client ที่ใช้ API เวอร์ชั่นเก่าอาจจะพังได้
สำหรับ REST API ก็ใช้ versioning ใน URL ไปเลยง่ายสุด เช่น /api/v1/users สำหรับ GraphQL ก็ใช้ schema versioning ได้ หรือจะใช้ namespace ก็ได้ แล้วแต่ความถนัดเลย
4. Monitor & Log: อันนี้สำคัญมาก อย่าปล่อยให้ API ทำงานไปเรื่อยๆ โดยไม่รู้ว่าเกิดอะไรขึ้น ต้อง monitor API performance และ log error อย่างละเอียด เพื่อให้เราสามารถแก้ไขปัญหาได้ทันท่วงที
ผมแนะนำให้ใช้ tools อย่าง Prometheus, Grafana, ELK stack พวกนี้ช่วยให้เราเห็นภาพรวมของ API ได้ชัดเจนมากๆ
GraphQL เหมาะกับงานที่ต้องการความยืดหยุ่นสูง มี client หลายแบบ และต้องการดึงข้อมูลเฉพาะที่จำเป็นเท่านั้น เช่น mobile app, single page application (SPA) หรือ API ที่ต้องรองรับ client ที่มีความต้องการข้อมูลแตกต่างกัน
REST API เหมาะกับงานที่ไม่ซับซ้อน มี client ไม่เยอะ และต้องการความเรียบง่ายในการพัฒนา เช่น API สำหรับเว็บแอปพลิเคชันทั่วไป หรือ API ที่ต้องการความเข้ากันได้กับระบบเดิม
GraphQL มี learning curve ที่สูงกว่า REST API จริง แต่เมื่อเข้าใจ concept แล้ว GraphQL จะช่วยลดภาระงานได้เยอะ โดยเฉพาะอย่างยิ่งในโปรเจกต์ที่มี API ซับซ้อน
มี tools ให้เลือกใช้เยอะมาก ขึ้นอยู่กับภาษาที่เราถนัด ถ้า JavaScript ก็ลองใช้ Apollo Server หรือ Express GraphQL ถ้า Python ก็ลองใช้ Graphene หรือ Ariadne
GraphQL และ REST API มีข้อดีข้อเสียแตกต่างกันไป ไม่มีอะไรดีกว่าอะไรเสมอไป สิ่งสำคัญคือเราต้องเลือกใช้ให้เหมาะสมกับ use case ของเรา ลองศึกษาข้อดีข้อเสียของแต่ละเทคโนโลยี แล้วเลือกใช้ให้ถูกงาน จะช่วยให้เราพัฒนา API ได้อย่างมีประสิทธิภาพ
อย่าลืมไปเยี่ยมชม iCafeForex นะครับ เผื่อใครสนใจเรื่อง Forex
และอย่าลืมติดตาม SiamCafe Blog ด้วยนะครับ มีบทความดีๆ อีกเยอะเลย