GraphQL হল একটি শক্তিশালী API কুয়েরি ভাষা যা ক্লায়েন্টদেরকে API-র মাধ্যমে ডেটা ফেচ করার জন্য অত্যন্ত নমনীয় এবং কার্যকর পদ্ধতি প্রদান করে। GraphQL ব্যবহার করলে, আপনি নির্দিষ্ট ডেটা প্রয়োজন অনুযায়ী কুয়েরি করতে পারেন এবং API-তে অনুরোধ করার পরমাত্র প্রয়োজনীয় ডেটা ফিরিয়ে আনতে পারবেন। KoaJS এবং GraphQL একত্রে ব্যবহার করে আপনি অত্যন্ত স্কেলেবল এবং কার্যকর API তৈরি করতে পারেন।
এই টিউটোরিয়ালে, আমরা দেখব KoaJS এবং GraphQL কীভাবে একত্রে কাজ করে এবং কিভাবে Apollo Server ব্যবহার করে KoaJS অ্যাপ্লিকেশনটিতে GraphQL ইন্টিগ্রেশন করা যায়।
১. Apollo Server এবং KoaJS ইন্টিগ্রেশন
Apollo Server হল একটি GraphQL সার্ভার লাইব্রেরি যা GraphQL API নির্মাণে ব্যবহৃত হয়। KoaJS এবং Apollo Server একত্রে ব্যবহার করে আপনি একটি সম্পূর্ণ GraphQL API তৈরি করতে পারেন।
১.১. Apollo Server ইনস্টল করা
প্রথমে, আপনাকে KoaJS এবং Apollo Server ইনস্টল করতে হবে:
npm install koa koa-router apollo-server-koa graphql
এখানে:
koa: KoaJS ফ্রেমওয়ার্ক।koa-router: KoaJS রাউটিং লাইব্রেরি।apollo-server-koa: Apollo Server, যা KoaJS এর সাথে গ্রাফকিউএল API সংযোগ করতে সাহায্য করে।graphql: GraphQL এর প্রাথমিক লাইব্রেরি।
২. KoaJS এবং GraphQL ইন্টিগ্রেশন
এখন, আমরা দেখব কিভাবে Apollo Server এবং KoaJS একত্রে কাজ করে একটি সাধারণ GraphQL API তৈরি করা যায়।
২.১. GraphQL Schema এবং Resolvers তৈরি করা
GraphQL API তৈরি করার জন্য, প্রথমে আপনাকে schema এবং resolvers তৈরি করতে হবে। Schema হল GraphQL এর কুয়েরি এবং মিউটেশনগুলির নির্ধারণ, এবং resolvers হল সেই কুয়েরি এবং মিউটেশনের জন্য কার্যকরী ফাংশন।
const { ApolloServer, gql } = require('apollo-server-koa');
const Koa = require('koa');
const Router = require('koa-router');
// Koa অ্যাপ তৈরি করা
const app = new Koa();
const router = new Router();
// GraphQL Schema এবং Resolver তৈরি করা
const typeDefs = gql`
type Query {
hello: String
getUser(id: Int!): User
}
type User {
id: Int
name: String
email: String
}
`;
const resolvers = {
Query: {
hello: () => 'Hello, World!',
getUser: (_, { id }) => {
const users = [
{ id: 1, name: 'John Doe', email: 'john@example.com' },
{ id: 2, name: 'Jane Doe', email: 'jane@example.com' }
];
return users.find(user => user.id === id);
}
}
};
// Apollo Server কনফিগারেশন
const server = new ApolloServer({
typeDefs,
resolvers,
});
// Koa রাউটার সেটআপ করা
server.applyMiddleware({ app });
// Koa অ্যাপ চালু করা
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000/graphql');
});
এখানে:
typeDefs: GraphQL স্কিমা তৈরি করা হয়েছে, যেখানে দুটি কুয়েরি (Query) রয়েছে:helloএবংgetUser(id: Int!)।resolvers: কুয়েরির জন্য বাস্তবায়ন যোগ করা হয়েছে।helloকুয়েরি একটি স্ট্রিং ফেরত দেয়, এবংgetUserকুয়েরি নির্দিষ্টidসহ ব্যবহারকারীর ডেটা ফেরত দেয়।
২.২. Apollo Server কনফিগারেশন
applyMiddleware: এটি Koa অ্যাপে Apollo Server ইন্টিগ্রেট করার জন্য ব্যবহৃত হয়, যেখানে/graphqlরাউটে GraphQL API এক্সেস করা যায়।
৩. GraphQL Query এবং Mutation
আপনি আপনার কাস্টম কুয়েরি এবং মিউটেশন তৈরি করতে পারেন। উদাহরণস্বরূপ, getUser কুয়েরি ব্যবহারকারী ডেটা ফেরত দেয় এবং আপনি একটি নতুন ব্যবহারকারী তৈরি করার জন্য একটি মিউটেশনও যুক্ত করতে পারেন।
৩.১. GraphQL Query উদাহরণ
Query: getUser(id: 1)
query {
getUser(id: 1) {
id
name
email
}
}
Response:
{
"data": {
"getUser": {
"id": 1,
"name": "John Doe",
"email": "john@example.com"
}
}
}
৩.২. GraphQL Mutation উদাহরণ
mutation {
createUser(name: "New User", email: "newuser@example.com") {
id
name
email
}
}
Response:
{
"data": {
"createUser": {
"id": 3,
"name": "New User",
"email": "newuser@example.com"
}
}
}
৪. GraphQL Playground
Apollo Server এক্সপোজ করে GraphQL Playground যা আপনাকে একটি ইন্টারেক্টিভ UI প্রদান করে, যেখানে আপনি কুয়েরি এবং মিউটেশন রن করতে পারবেন। এটি কেবলমাত্র ডেভেলপমেন্ট পরিবেশে ব্যবহৃত হয়। আপনি /graphql এ গিয়ে এটি এক্সেস করতে পারেন।
৫. Error Handling in GraphQL
GraphQL-এর ত্রুটি হ্যান্ডলিং সাধারণত কাস্টম ত্রুটি বার্তা সহ করা হয়। যদি কোনও কুয়েরি বা মিউটেশন ভুল হয়, তবে আপনি throw ব্যবহার করে কাস্টম ত্রুটি তৈরি করতে পারেন।
const resolvers = {
Query: {
getUser: (_, { id }) => {
const users = [
{ id: 1, name: 'John Doe', email: 'john@example.com' },
{ id: 2, name: 'Jane Doe', email: 'jane@example.com' }
];
const user = users.find(user => user.id === id);
if (!user) {
throw new Error('User not found');
}
return user;
}
}
};
এখানে, getUser কুয়েরি যদি কোনও ব্যবহারকারী না খুঁজে পায়, তবে একটি কাস্টম ত্রুটি বার্তা প্রদান করবে।
৬. Security Considerations
- Authorization: গ্রাফকিউএল API-তে অথেনটিকেশন এবং অথরাইজেশন সিস্টেম তৈরি করা অত্যন্ত গুরুত্বপূর্ণ। আপনি JWT (JSON Web Tokens) ব্যবহার করতে পারেন, যাতে কেবলমাত্র অথেনটিকেটেড ব্যবহারকারীরাই API অ্যাক্সেস করতে পারে।
- Rate Limiting: গ্রাফকিউএল API-তে খুব বেশি রিকোয়েস্ট এলে সার্ভারের উপর চাপ সৃষ্টি হতে পারে। তাই rate limiting ব্যবহারের মাধ্যমে রিকোয়েস্ট সীমাবদ্ধ করতে পারেন।
সারাংশ
KoaJS-এ GraphQL ইন্টিগ্রেট করতে Apollo Server ব্যবহার করা হয়, যা KoaJS-এ সহজেই GraphQL API তৈরি করার সুযোগ দেয়। এখানে, আমরা একটি GraphQL Schema, Resolvers, এবং Koa অ্যাপে Apollo Server কনফিগারেশন করেছি। এছাড়া, GraphQL Playground ব্যবহারের মাধ্যমে ডেভেলপাররা API পরীক্ষা করতে পারেন। GraphQL এবং KoaJS একত্রে ব্যবহার করে আপনি শক্তিশালী এবং স্কেলেবল API তৈরি করতে পারবেন যা ফ্রন্টএন্ডের জন্য অত্যন্ত নমনীয়।
GraphQL হল একটি ডেটা কুয়েরি ভাষা এবং রUNTIME এর জন্য API-নির্ধারণ প্রযুক্তি যা Facebook দ্বারা তৈরি হয়েছে। এটি ক্লায়েন্ট সাইডে ডেটা প্রাপ্তির পদ্ধতি পরিবর্তন করে এবং API ডেভেলপমেন্টে একটি নতুন দৃষ্টিকোণ প্রদান করে। KoaJS-এ GraphQL ইন্টিগ্রেশন API ডেভেলপমেন্টে একটি অত্যন্ত শক্তিশালী এবং নমনীয় উপায় হতে পারে, যা ডেটার কাঠামো এবং প্রক্রিয়া সম্পূর্ণভাবে কাস্টমাইজ করার সুযোগ দেয়।
এই টিউটোরিয়ালে, আমরা GraphQL এর ভূমিকা এবং এর প্রয়োজনীয়তা KoaJS-এ কিভাবে কার্যকরভাবে ব্যবহৃত হতে পারে, তা আলোচনা করব।
১. GraphQL এর ভূমিকা
GraphQL একটি অত্যন্ত শক্তিশালী API প্রযুক্তি, যা ক্লায়েন্টদের সক্ষম করে কেবলমাত্র প্রয়োজনীয় ডেটা রিকোয়েস্ট করতে এবং সেই ডেটা সহজে এবং দ্রুত পেতে। এটি একটি query language হিসেবে কাজ করে, যেখানে ক্লায়েন্ট তাদের ডেটার কাঠামো এবং গঠন নির্ধারণ করতে পারে।
১.১. Traditional REST API এর তুলনায় GraphQL এর সুবিধা
GraphQL এর সাহায্যে আপনি:
- Request data with a specific shape: REST API এর তুলনায়, যেখানে একাধিক এন্ডপয়েন্টের মাধ্যমে বিভিন্ন ডেটা রিকোয়েস্ট করতে হয়, GraphQL কেবল একটি এন্ডপয়েন্টের মাধ্যমে সমস্ত রিকোয়েস্ট করতে দেয়।
- Fetch only the data needed: GraphQL ডেটা প্রয়োজন অনুসারে চয়ন করতে সহায়ক, যার ফলে প্রয়োজনীয় ডেটা একটিমাত্র রিকোয়েস্টে প্রাপ্ত হয়।
- Single request for multiple resources: একাধিক রিসোর্স বা রিসোর্সের সম্পর্কের ডেটা এক রিকোয়েস্টের মাধ্যমে পাওয়া যায়, যেখানে REST API তে একাধিক রিকোয়েস্টের প্রয়োজন হয়।
উদাহরণস্বরূপ, REST API-তে ডেটার জন্য একাধিক এন্ডপয়েন্ট হতে পারে:
/users- ইউজারদের তথ্য/posts- পোস্টের তথ্য/comments- কমেন্টের তথ্য
এমনকি যদি আপনি সব তথ্য একত্রে চান, তবে আপনার বিভিন্ন রিকোয়েস্ট করতে হবে, যেখানে GraphQL এর মাধ্যমে আপনি সব কিছু একটি রিকোয়েস্টে পেতে পারেন।
১.২. GraphQL Query Structure
GraphQL কুয়েরি করার পদ্ধতি:
{
user(id: 1) {
name
email
posts {
title
content
}
}
}
এখানে, আপনি user এর তথ্য চাচ্ছেন, এবং তার পোস্টের শিরোনাম ও কন্টেন্টও চাচ্ছেন। এই ধরনের কুয়েরি GraphQL এ করতে পারবেন, যা REST API তে সম্ভব নয়।
২. GraphQL এর প্রয়োজনীয়তা
GraphQL এর প্রয়োজনীয়তা বর্তমানে API ডেভেলপমেন্টে বড় আকারে বৃদ্ধি পেয়েছে এবং এটি কিছু গুরুত্বপূর্ণ কারণের জন্য অত্যন্ত জনপ্রিয়। KoaJS-এ GraphQL ইন্টিগ্রেট করার মাধ্যমে আপনি উন্নত ফিচার পাবেন যা REST API থেকে অনেক ক্ষেত্রে দ্রুত এবং কার্যকরী হতে পারে।
২.১. Reducing Over-fetching and Under-fetching
REST API তে প্রায়ই over-fetching (অতিরিক্ত ডেটা নেওয়া) এবং under-fetching (প্রয়োজনীয় ডেটা না পাওয়া) এর সমস্যা দেখা দেয়। এর মানে হচ্ছে, যখন আপনি একাধিক রিকোয়েস্ট করেন, তখন কখনও আপনি অতিরিক্ত ডেটা বা কম ডেটা পান যা আপনার প্রয়োজনের জন্য উপযুক্ত নয়।
GraphQL এই সমস্যা সমাধান করে, কারণ আপনি কেবলমাত্র সেই ডেটা রিকোয়েস্ট করতে পারেন যা আপনি চান। এই পদ্ধতিটি ডেটা লোডিংয়ের কার্যকারিতা এবং গতিকে উন্নত করে।
২.২. Easier API Evolution
GraphQL API বিকাশের ক্ষেত্রে আরও নমনীয়তা প্রদান করে। একটি REST API পরিবর্তন করতে হলে, আপনাকে নতুন এন্ডপয়েন্ট তৈরি করতে হতে পারে, যেটি ক্লায়েন্ট সাইডে ব্যাপক পরিবর্তন দাবি করে। GraphQL এর মধ্যে, আপনি কেবল নতুন ফিল্ড বা টাইপ সংযোজন করে API সংস্করণ পরিবর্তন করতে পারেন, এবং ক্লায়েন্ট সাইডে পরিবর্তন আসবে না।
২.৩. Strongly Typed Schema
GraphQL এর একটি শক্তিশালী টাইপ সিস্টেম রয়েছে যা API ডেভেলপমেন্টকে আরও নির্ভরযোগ্য এবং সুনির্দিষ্ট করে তোলে। এতে সার্ভার এবং ক্লায়েন্ট দুই পক্ষেই ডেটা কাঠামো খুব সহজে চিহ্নিত করা যায়, ফলে ডেভেলপারদের জন্য কোড লেখার এবং ট্র্যাক করা সহজ হয়।
২.৪. Real-time Data via Subscriptions
GraphQL সাবস্ক্রিপশনসের মাধ্যমে রিয়েল-টাইম ডেটা ফিচারও প্রদান করে। যেমন আপনি একটি চ্যাট অ্যাপ্লিকেশনে নতুন মেসেজ পেতে চান, এবং GraphQL সাবস্ক্রিপশনসের মাধ্যমে আপনি সেই তথ্য রিয়েল-টাইমে আপডেট করতে পারেন। এটা REST API তে সহজে করা সম্ভব নয়, যেখানে সাধারণত polling বা অন্যান্য পদ্ধতি ব্যবহার করতে হয়।
৩. KoaJS-এ GraphQL ইন্টিগ্রেশন
KoaJS-এ GraphQL ব্যবহার করার জন্য আমরা apollo-server-koa প্যাকেজটি ব্যবহার করতে পারি, যা KoaJS এর জন্য Apollo Server ইন্টিগ্রেশন সরবরাহ করে।
৩.১. Apollo Server-koa ইনস্টল করা
npm install apollo-server-koa graphql
৩.২. KoaJS-এ GraphQL ইন্টিগ্রেশন উদাহরণ
const Koa = require('koa');
const Router = require('koa-router');
const { ApolloServer, gql } = require('apollo-server-koa');
const app = new Koa();
const router = new Router();
// GraphQL Schema Definition
const typeDefs = gql`
type Query {
hello: String
}
`;
// Resolver Definition
const resolvers = {
Query: {
hello: () => 'Hello, GraphQL!',
},
};
// ApolloServer তৈরি করা
const server = new ApolloServer({ typeDefs, resolvers });
// Apollo Server কে KoaJS অ্যাপ্লিকেশনের সাথে যুক্ত করা
server.applyMiddleware({ app });
// রাউট মাউন্ট করা
app.use(router.routes()).use(router.allowedMethods());
// অ্যাপ চালু করা
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
এখানে:
- Apollo Server এবং GraphQL Schema ব্যবহার করে আমরা একটি সহজ API তৈরি করেছি, যেখানে
helloনামের একটি কুয়েরি রয়েছে, যা "Hello, GraphQL!" রিটার্ন করে। - ApolloServer.applyMiddleware এর মাধ্যমে Apollo Server কে KoaJS অ্যাপ্লিকেশনের সাথে ইন্টিগ্রেট করা হয়েছে।
৩.৩. GraphQL কুয়েরি ব্যবহার
এখন, আপনি GraphQL কুয়েরি করতে পারেন:
{
hello
}
এটি "Hello, GraphQL!" রিটার্ন করবে।
৪. Conclusion (সারাংশ)
GraphQL KoaJS-এ API ডেভেলপমেন্টের জন্য একটি শক্তিশালী এবং নমনীয় পদ্ধতি সরবরাহ করে। এটি over-fetching এবং under-fetching সমস্যা সমাধান করে, API ইভোলিউশন সহজ করে এবং রিয়েল-টাইম ডেটা শেয়ার করার ক্ষমতা দেয়। Apollo Server ব্যবহার করে সহজেই KoaJS-এ GraphQL ইন্টিগ্রেশন করা যায়। GraphQL ক্লায়েন্ট এবং সার্ভারের মধ্যে উন্নত কনট্রোল, ফ্লেক্সিবিলিটি, এবং ডেটার কাঠামো নিয়ন্ত্রণের সুবিধা প্রদান করে।
GraphQL হল একটি নতুন প্রজন্মের API প্রযুক্তি যা Facebook দ্বারা ডেভেলপ করা হয় এবং এটি REST API এর একটি বিকল্প হিসেবে ব্যবহৃত হয়। GraphQL আপনাকে আপনার ডেটা খুবই নির্দিষ্টভাবে এবং কার্যকরীভাবে পেতে সাহায্য করে, কারণ আপনি শুধু সেই ডেটা পাবেন যা আপনি চাইবেন, এবং যেটি অনেক বেশি স্কেলেবল। KoaJS-এ GraphQL ইন্টিগ্রেট করতে koa-graphql লাইব্রেরি ব্যবহার করা হয়।
এই টিউটোরিয়ালে, আমরা KoaJS-এ koa-graphql লাইব্রেরি ব্যবহার করে কিভাবে একটি GraphQL API ইন্টিগ্রেট করা যায়, তা শিখব।
১. KoaJS এবং koa-graphql ইনস্টলেশন
প্রথমে, আপনাকে koa-graphql এবং graphql প্যাকেজ দুটি ইনস্টল করতে হবে:
npm install koa-graphql graphql
- koa-graphql: KoaJS এর জন্য একটি মিডলওয়্যার যা GraphQL API পরিচালনা করে।
- graphql: GraphQL এর জন্য একটি কোর লাইব্রেরি যা Schema এবং Query Execution হ্যান্ডল করে।
২. GraphQL Schema ডিজাইন করা
GraphQL API তৈরি করতে প্রথমে আপনাকে একটি Schema ডিজাইন করতে হবে। Schema-তে আপনি ডেটার ধরন (Types) এবং তাদের সম্পর্ক (Resolvers) নির্ধারণ করবেন। এই Schema একটি প্রশ্ন বা মিউটেশন (Query or Mutation) দ্বারা কিভাবে ডেটা পরিচালিত হবে তা নির্ধারণ করে।
২.১. GraphQL Schema উদাহরণ
এখানে, আমরা একটি সিম্পল Product সম্পর্কিত GraphQL API তৈরি করব।
const Koa = require('koa');
const Router = require('koa-router');
const koaGraphQL = require('koa-graphql');
const { GraphQLSchema, GraphQLObjectType, GraphQLString, GraphQLInt } = require('graphql');
// Koa অ্যাপ্লিকেশন তৈরি করা
const app = new Koa();
const router = new Router();
// Product Type (Schema) তৈরি করা
const ProductType = new GraphQLObjectType({
name: 'Product',
fields: () => ({
id: { type: GraphQLInt },
name: { type: GraphQLString },
price: { type: GraphQLInt },
}),
});
// Root Query Type তৈরি করা
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
product: {
type: ProductType,
args: { id: { type: GraphQLInt } }, // Product ID আর্গুমেন্ট হিসাবে নেওয়া হবে
resolve(parent, args) {
// এখানে আপনি ডেটাবেস বা কোনো ডাটা সোর্স থেকে ডেটা রিটার্ন করবেন
return { id: args.id, name: 'Product ' + args.id, price: 100 };
},
},
},
});
// Mutation Type (Data Manipulation) তৈরি করা
const Mutation = new GraphQLObjectType({
name: 'Mutation',
fields: {
addProduct: {
type: ProductType,
args: {
name: { type: GraphQLString },
price: { type: GraphQLInt },
},
resolve(parent, args) {
// নতুন Product তৈরি করা (ডেটাবেসে ইনসার্টের মতো)
return { id: Math.floor(Math.random() * 1000), name: args.name, price: args.price };
},
},
},
});
// Schema তৈরি করা
const schema = new GraphQLSchema({
query: RootQuery,
mutation: Mutation,
});
// koa-graphql মিডলওয়্যার ব্যবহার করা
router.all('/graphql', koaGraphQL({ schema, graphiql: true }));
// রাউট মাউন্ট করা
app.use(router.routes()).use(router.allowedMethods());
// সার্ভার চালু করা
app.listen(3000, () => {
console.log('GraphQL API running on http://localhost:3000/graphql');
});
ব্যাখ্যা:
- ProductType: একটি গ্রাফকিউএল টাইপ, যা id, name, এবং price ফিল্ডগুলো ধারণ করে।
- RootQuery: একটি রুট কুয়েরি টাইপ যা
productনামক একটি ফিল্ড ধারণ করে, যেখানে আপনি একটিidআর্গুমেন্ট দিয়ে প্রোডাক্টের তথ্য নিতে পারেন। - Mutation: একটি মিউটেশন টাইপ যা
addProductনামক একটি ফিল্ড ধারণ করে, যেখানে আপনি নতুন প্রোডাক্ট যোগ করতে পারবেন। - graphql: koa-graphql মিডলওয়্যারকে
/graphqlএপিআই রাউটে যুক্ত করা হয়েছে, যা GraphQL কুয়েরি এবং মিউটেশন সমর্থন করবে।graphiql: trueদিয়ে GraphiQL ইনটারফেস সক্রিয় করা হয়েছে, যাতে আপনি ইন্টারেকটিভভাবে API টেস্ট করতে পারেন।
৩. GraphiQL ইনটারফেস
এই কোডে graphiql: true ব্যবহার করা হয়েছে, যার মাধ্যমে আপনি GraphiQL নামক একটি ইন্টারেকটিভ ডেভেলপার টুল পাবেন। এটি আপনাকে GraphQL কুয়েরি লেখার এবং API-টি টেস্ট করার সুবিধা দেয়।
আপনি যেহেতু /graphql রাউটে এই মিডলওয়্যার ব্যবহার করেছেন, সুতরাং, আপনি ব্রাউজারে http://localhost:3000/graphql URL-এ গিয়ে GraphiQL ইন্টারফেস ব্যবহার করতে পারবেন।
৪. GraphQL Query and Mutation উদাহরণ
৪.১. Query Example
গ্রাফকিউএল কুয়েরি দিয়ে আপনি কোনো প্রোডাক্টের তথ্য দেখতে পারেন। উদাহরণস্বরূপ:
Query:
query {
product(id: 1) {
id
name
price
}
}
এটি একটি প্রোডাক্টের id, name, এবং price তথ্য ফিরিয়ে দেবে।
৪.২. Mutation Example
নতুন প্রোডাক্ট তৈরি করার জন্য একটি মিউটেশন ব্যবহার করতে পারেন। উদাহরণস্বরূপ:
Mutation:
mutation {
addProduct(name: "New Product", price: 500) {
id
name
price
}
}
এটি নতুন একটি প্রোডাক্ট তৈরি করবে এবং তার id, name, এবং price ফিরিয়ে দেবে।
৫. Error Handling এবং Validation
GraphQL API তে ইনপুট ভ্যালিডেশন এবং ত্রুটি হ্যান্ডলিং খুব গুরুত্বপূর্ণ। আপনি args থেকে ইনপুট ভ্যালিডেশন করতে পারেন এবং এর ভিত্তিতে ত্রুটি ফেরত দিতে পারেন।
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
product: {
type: ProductType,
args: { id: { type: GraphQLInt } },
resolve(parent, args) {
if (!args.id) {
throw new Error('Product ID is required');
}
return { id: args.id, name: 'Product ' + args.id, price: 100 };
},
},
},
});
এখানে:
- যদি
idআর্গুমেন্ট না দেওয়া হয়, তাহলে একটি ত্রুটি ফিরে আসবে।
সারাংশ
KoaJS-এ GraphQL ইন্টিগ্রেট করা অনেক সহজ এবং koa-graphql মিডলওয়্যার ব্যবহারে আপনি খুব সহজেই GraphQL API তৈরি করতে পারেন। GraphQL Schema তৈরি করে আপনি আপনার ডেটার ধরন এবং কুয়েরি ও মিউটেশন রেজলভারের মাধ্যমে API-কে কাস্টমাইজ করতে পারবেন। KoaJS এবং GraphQL একত্রে ব্যবহার করলে আপনি দ্রুত, স্কেলেবল এবং কার্যকরী API তৈরি করতে পারবেন।
KoaJS একটি শক্তিশালী ওয়েব ফ্রেমওয়ার্ক যা Node.js পরিবেশে ব্যবহার করা হয়। যখন আপনি একটি GraphQL API তৈরি করতে চান, তখন Schema তৈরি করা এবং Resolver কনফিগার করা অত্যন্ত গুরুত্বপূর্ণ। GraphQL API-তে Schema ডেটার গঠন এবং কাঠামো নির্ধারণ করে এবং Resolvers ডেটার জন্য কার্যকর লজিক বাস্তবায়ন করে।
এই টিউটোরিয়ালে আমরা দেখব কিভাবে KoaJS-এ GraphQL Schema তৈরি করা যায় এবং কিভাবে Resolvers কনফিগার করা হয়।
১. KoaJS-এ GraphQL Schema তৈরি করা
GraphQL Schema একটি কাঠামো যা API-এর ডেটার গঠন নির্ধারণ করে। এটি ডেটার প্রকার এবং সম্পর্কের বিবরণ প্রদান করে। একটি GraphQL স্কিমা দুইটি প্রধান অংশে বিভক্ত:
- Types: যেগুলি ডেটার ধরণ বা গঠন নির্ধারণ করে (যেমন
User,Post, ইত্যাদি)। - Queries: API-তে ডেটা আনার জন্য ব্যবহার করা হয়।
- Mutations: API-তে ডেটা পরিবর্তন করার জন্য ব্যবহার করা হয়।
১.১. GraphQL এবং Apollo Server ইনস্টল করা
GraphQL API তৈরি করতে Apollo Server এবং GraphQL প্যাকেজ ব্যবহার করা হয়। প্রথমে, আপনাকে এই প্যাকেজগুলো ইনস্টল করতে হবে:
npm install koa graphql apollo-server-koa
১.২. KoaJS-এ GraphQL Schema তৈরি করা
এখন, আমরা একটি GraphQL স্কিমা তৈরি করব, যেখানে Query এবং Mutation থাকবে।
const Koa = require('koa');
const Router = require('koa-router');
const { ApolloServer, gql } = require('apollo-server-koa');
const app = new Koa();
const router = new Router();
// GraphQL Schema তৈরি করা
const typeDefs = gql`
type User {
id: ID!
username: String!
email: String!
}
type Query {
getUser(id: ID!): User
getUsers: [User]
}
type Mutation {
addUser(username: String!, email: String!): User
}
`;
// Resolver তৈরি করা
const resolvers = {
Query: {
getUser: async (_, { id }) => {
// উদাহরণস্বরূপ, ফিক্সড ইউজার ডেটা
const users = [
{ id: 1, username: 'john_doe', email: 'john@example.com' },
{ id: 2, username: 'jane_doe', email: 'jane@example.com' },
];
return users.find(user => user.id === parseInt(id));
},
getUsers: () => {
// সমস্ত ইউজার ডেটা ফেরত পাঠানো
return [
{ id: 1, username: 'john_doe', email: 'john@example.com' },
{ id: 2, username: 'jane_doe', email: 'jane@example.com' },
];
},
},
Mutation: {
addUser: async (_, { username, email }) => {
// নতুন ইউজার তৈরি (ফিক্সড ডেটা)
const newUser = { id: 3, username, email };
return newUser;
},
},
};
// Apollo Server কনফিগারেশন
const server = new ApolloServer({
typeDefs,
resolvers,
});
server.applyMiddleware({ app }); // KoaJS অ্যাপে Apollo Server যুক্ত করা
// রাউট মাউন্ট করা
app.use(router.routes()).use(router.allowedMethods());
// অ্যাপ চালু করা
app.listen(3000, () => {
console.log('Server running on http://localhost:3000/graphql');
});
এখানে:
- GraphQL Schema: আমরা
typeDefsএUser,QueryএবংMutationটাইপগুলো তৈরি করেছি।User: একটি ইউজার অবজেক্টের ডেটা গঠন নির্ধারণ করে।Query:getUserএবংgetUsersফাংশন ডেটা রিটার্ন করে।Mutation:addUserফাংশন নতুন ইউজার তৈরি করে।
- Resolvers:
QueryএবংMutationএর কার্যক্রম বাস্তবায়ন করা হয়েছে। উদাহরণস্বরূপ,getUserফাংশন একটি নির্দিষ্টidএর ইউজার ফেরত পাঠায় এবংaddUserনতুন ইউজার তৈরি করে।
GraphQL Endpoint: আপনি http://localhost:3000/graphql এ GraphQL Playground বা অন্য কোনো ক্লায়েন্ট ব্যবহার করে এই API-কে ইন্টারঅ্যাক্ট করতে পারবেন।
২. Resolvers কনফিগার করা
Resolvers হলো GraphQL স্কিমায় ডেটার জন্য কার্যকর লজিক যা বাস্তবায়ন করে। Resolvers এর মধ্যে আমরা ডেটার কুয়েরি, ইনসার্ট, আপডেট বা ডিলিট অপারেশন লিখি। এগুলি ডাটাবেস বা অন্যান্য API-এর সাথে সংযুক্ত হতে পারে।
২.১. Resolvers উদাহরণ
একটি getUser কুয়েরি resolver এবং addUser মিউটেশন resolver উদাহরণ:
const resolvers = {
Query: {
getUser: async (_, { id }) => {
// ডাটাবেস বা ফিক্সড ডেটা থেকে ইউজার খুঁজে বের করা
const users = [
{ id: 1, username: 'john_doe', email: 'john@example.com' },
{ id: 2, username: 'jane_doe', email: 'jane@example.com' },
];
return users.find(user => user.id === parseInt(id)); // id এর ভিত্তিতে ইউজার খোঁজা
},
getUsers: () => {
// সমস্ত ইউজার ফিরিয়ে দেওয়া
return [
{ id: 1, username: 'john_doe', email: 'john@example.com' },
{ id: 2, username: 'jane_doe', email: 'jane@example.com' },
];
},
},
Mutation: {
addUser: async (_, { username, email }) => {
// নতুন ইউজার তৈরি
const newUser = { id: 3, username, email };
// ফিক্সড ডেটা হিসাবে নতুন ইউজার রিটার্ন
return newUser;
},
},
};
এখানে:
getUser: একটি ইউজার নির্দিষ্টidদ্বারা খুঁজে বের করে।getUsers: সমস্ত ইউজারকে রিটার্ন করে।addUser: একটি নতুন ইউজার তৈরি করে এবং সেগুলিকে রিটার্ন করে।
আপনি এখানে ডাটাবেস বা অন্য API ব্যবহার করতে পারেন, যেমন MongoDB বা PostgreSQL, যেখান থেকে ইউজারদের ডেটা পাওয়ার জন্য একটি কুয়েরি লেখা যাবে।
৩. GraphQL Query এবং Mutation উদাহরণ
৩.১. Query Example
query {
getUser(id: 1) {
username
email
}
}
এই কুয়েরি id: 1 দিয়ে ইউজারকে খুঁজে বের করবে এবং username এবং email ফিরিয়ে দিবে।
৩.২. Mutation Example
mutation {
addUser(username: "new_user", email: "newuser@example.com") {
id
username
email
}
}
এই মিউটেশনটি একটি নতুন ইউজার তৈরি করবে এবং তার id, username এবং email ফেরত দিবে।
সারাংশ
KoaJS-এ GraphQL Schema এবং Resolver কনফিগারেশন খুবই সহজ। Apollo Server ব্যবহার করে GraphQL API তৈরি করা সম্ভব এবং Joi বা অন্যান্য প্যাকেজ ব্যবহার করে ইনপুট ভ্যালিডেশন করা যায়। Resolvers API-তে কুয়েরি বা মিউটেশন হ্যান্ডল করার জন্য ব্যবহৃত হয়। এই টিউটোরিয়ালের মাধ্যমে আপনি KoaJS-এ একটি সিম্পল GraphQL API তৈরি করতে পারবেন, যেখানে Schema এবং Resolvers কনফিগার করা হয়েছে।
REST API এবং GraphQL দুটি জনপ্রিয় API স্টাইল যা ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটা আদান-প্রদান করতে ব্যবহৃত হয়। KoaJS এর মাধ্যমে আপনি উভয় API স্টাইলের সাথে কাজ করতে পারেন। এই টিউটোরিয়ালে, আমরা REST API এবং GraphQL এর মধ্যে তুলনা করব, তাদের সুবিধা এবং অসুবিধা নিয়ে আলোচনা করব।
১. REST API
REST (Representational State Transfer) একটি আর্কিটেকচারাল স্টাইল যা HTTP প্রোটোকলের উপর নির্ভরশীল। এটি একটি নির্দিষ্ট নিয়মের মাধ্যমে সিস্টেমের মধ্যে রিকোয়েস্ট এবং রেসপন্স পরিচালনা করে। RESTful API-তে সাধারণত URL (Uniform Resource Locator) ব্যবহার করা হয়, এবং HTTP মেথডগুলি (GET, POST, PUT, DELETE) ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটার আদান-প্রদান পরিচালনা করতে ব্যবহৃত হয়।
১.১. REST API-এর মূল বৈশিষ্ট্য:
- সিম্পল এবং স্ট্যান্ডার্ডাইজড: REST API খুবই সিম্পল এবং এর জন্য HTTP মেথড এবং স্ট্যাটাস কোডের স্ট্যান্ডার্ড ব্যবহার করা হয়।
- Resourse-based: REST API ডেটা রিসোর্স (যেমন:
/users,/products) অনুযায়ী কাজ করে। - Stateless: প্রতি রিকোয়েস্টে সার্ভারকে সব তথ্য পাঠাতে হয়, কারণ প্রতিটি রিকোয়েস্ট একক এবং সার্ভার সেশন বজায় রাখে না।
- Caching: REST APIতে ডেটা ক্যাশিং সহজে করা যায়, যা সার্ভারের লোড কমাতে সাহায্য করে।
১.২. REST API উদাহরণ (KoaJS)
const Koa = require('koa');
const Router = require('koa-router');
const app = new Koa();
const router = new Router();
// GET রিকোয়েস্ট হ্যান্ডলিং
router.get('/users', async (ctx) => {
ctx.body = [{ id: 1, name: 'John Doe' }];
});
// POST রিকোয়েস্ট হ্যান্ডলিং
router.post('/users', async (ctx) => {
const user = ctx.request.body;
ctx.status = 201;
ctx.body = { message: 'User created', data: user };
});
app.use(router.routes()).use(router.allowedMethods());
app.listen(3000, () => {
console.log('Server running on http://localhost:3000');
});
এখানে:
/usersURL থেকে ব্যবহারকারীদের ডেটা ফেচ করার জন্য GET রিকোয়েস্ট পাঠানো হয়েছে।- POST রিকোয়েস্ট ব্যবহার করে নতুন ইউজার তৈরি করা হচ্ছে।
২. GraphQL
GraphQL একটি API কুয়েরি ভাষা যা ডেটা ফেচ করার জন্য একটি অত্যন্ত নমনীয় এবং শক্তিশালী পদ্ধতি প্রদান করে। এটি ক্লায়েন্টকে একসাথে একাধিক রিসোর্সের জন্য কুয়েরি পাঠানোর সুযোগ দেয়, এবং সার্ভার কেবলমাত্র প্রয়োজনীয় ডেটা ফেরত দেয়। GraphQL মূলত একটি নির্দিষ্ট স্কিমা অনুসরণ করে, যেখানে ডেটা টাইপ, কুয়েরি, এবং মিউটেশন সম্পর্কে স্পষ্টভাবে নির্ধারণ করা হয়।
২.১. GraphQL-এর মূল বৈশিষ্ট্য:
- একটি কুয়েরি ভাষা: GraphQL ক্লায়েন্টকে নির্দিষ্ট ডেটা কুয়েরি করতে দেয় এবং সার্ভার কেবলমাত্র প্রয়োজনীয় ডেটা রিটার্ন করে।
- ফ্লেক্সিবল ডেটা: একাধিক রিসোর্সের জন্য একযোগে কুয়েরি করা যায়, যা ক্লায়েন্টের জন্য সহজ এবং পারফরম্যান্সের উন্নতি করতে সাহায্য করে।
- Strongly Typed: GraphQL এ ডেটার টাইপ এবং স্কিমা স্পষ্টভাবে সংজ্ঞায়িত থাকে।
- Single Endpoint: REST API যেখানে একাধিক এন্ডপয়েন্ট থাকে, GraphQL শুধুমাত্র একটি এন্ডপয়েন্ট (এটি সাধারনত
/graphqlহয়) ব্যবহার করে।
২.২. GraphQL উদাহরণ (KoaJS)
const Koa = require('koa');
const Router = require('koa-router');
const { ApolloServer, gql } = require('apollo-server-koa');
const app = new Koa();
const router = new Router();
// GraphQL স্কিমা এবং রেজলভার
const typeDefs = gql`
type User {
id: ID!
name: String!
}
type Query {
users: [User]
}
type Mutation {
addUser(name: String!): User
}
`;
const resolvers = {
Query: {
users: () => [{ id: 1, name: 'John Doe' }]
},
Mutation: {
addUser: (_, { name }) => ({ id: 2, name })
}
};
// Apollo Server সেটআপ
const server = new ApolloServer({ typeDefs, resolvers });
server.applyMiddleware({ app }); // GraphQL এন্ডপয়েন্ট
app.listen(3000, () => {
console.log('GraphQL server running at http://localhost:3000/graphql');
});
এখানে:
- ApolloServer ব্যবহার করে GraphQL API তৈরি করা হয়েছে।
- typeDefs: ডেটার স্কিমা সংজ্ঞায়িত করা হয়েছে, যেখানে
Userটাইপ এবং Query ও Mutation নির্দেশনা দেওয়া হয়েছে। - resolvers: কুয়েরি এবং মিউটেশন হ্যান্ডল করার জন্য রেজলভার তৈরি করা হয়েছে।
৩. REST API এবং GraphQL এর তুলনা
| বৈশিষ্ট্য | REST API | GraphQL |
|---|---|---|
| ডেটার আউটপুট | নির্দিষ্ট এন্ডপয়েন্টে নির্দিষ্ট ডেটা আউটপুট | কাস্টম কুয়েরি অনুযায়ী কেবলমাত্র প্রয়োজনীয় ডেটা আউটপুট |
| এন্ডপয়েন্ট সংখ্যা | একাধিক এন্ডপয়েন্ট (বিভিন্ন রিসোর্সের জন্য) | একটি একক এন্ডপয়েন্ট /graphql |
| ডেটা ফেচ করার পদ্ধতি | একাধিক রিকোয়েস্ট (প্রত্যেক রিসোর্সের জন্য) | এক কুয়েরি দিয়ে একাধিক রিসোর্সের ডেটা ফেচ করা যায় |
| ডেটা পরিবর্তন | PUT, POST, DELETE, PATCH | Mutation কুয়েরি ব্যবহার করে ডেটা পরিবর্তন করা যায় |
| স্ট্রাকচার | রিসোর্স-ভিত্তিক (URL অনুযায়ী) | স্কিমা-ভিত্তিক (ডেটার টাইপ এবং কুয়েরি স্কিমা নির্ধারণ) |
| সার্ভারের পারফরম্যান্স | একাধিক রিকোয়েস্টের জন্য সার্ভারকে চাপ দেওয়া | এক কুয়েরি দিয়ে কম রিকোয়েস্ট এবং কম ব্যান্ডউইথ ব্যবহার |
৪. কোনটি বেছে নেবেন?
- REST API: যদি আপনি একটি সিম্পল, স্ট্যান্ডার্ড এবং পরিচিত API চান যা সহজেই বিভিন্ন ক্লায়েন্ট এবং সার্ভিসের সাথে কাজ করে, তবে REST API উপযুক্ত হতে পারে।
- GraphQL: যদি আপনার অ্যাপ্লিকেশনটির জটিল ডেটা কাঠামো থাকে এবং আপনি কেবলমাত্র প্রয়োজনীয় ডেটা চান যা একাধিক রিসোর্স থেকে আসবে, তবে GraphQL হবে একটি উন্নত বিকল্প।
সারাংশ
REST API এবং GraphQL উভয়ই শক্তিশালী এবং জনপ্রিয় API স্টাইল, তবে তাদের ব্যবহারের ক্ষেত্রে কিছু গুরুত্বপূর্ণ পার্থক্য রয়েছে। REST API সাধারণত সিম্পল এবং স্ট্যান্ডার্ড হয়, যেখানে GraphQL একটি নমনীয় এবং কাস্টমাইজড পদ্ধতি যা ক্লায়েন্টকে নির্দিষ্ট ডেটা কুয়েরি করার সুযোগ দেয়। KoaJS-এর মাধ্যমে উভয় API স্টাইলের সাথে কাজ করা সম্ভব এবং প্রতিটি ক্ষেত্রে আপনাকে প্রয়োজন অনুযায়ী API ডিজাইন করতে হবে।
Read more