শুরুতেই সবার ক্ষমা চেয়ে নিচ্ছি, কারণ আমার লেখা-লেখির একদমই অভ্যাস নেই। ভুল-ভ্রান্তি হলে ক্ষমা সুন্দর দৃষ্টিতে দেখবেন। সাহস করে GraphQL নিয়ে লিখতে বসে পড়লাম। আশা করছি কয়েকটি পর্বে Laravel + GraphQL + ReactJS + React Native দিয়ে আমরা একটি ওয়েব এবং মোবাইল অ্যাপ বানাতে চেষ্টা করবো। চলুন তাহলে শুরু করা যাক।
GraphQL কি ?
GraphQL হলো একটি কোয়েরি ল্যাঙ্গুয়েজ যা API ডেটা ফেচ করতে ব্যবহার হয়। এটি ২০১৫ সালে ফেসবুক রিলিজ করে। REST API-তে আলাদা আলাদা ডেটা ফেচ করার জন্য আলাদা আলাদা এন্ডপয়েন্ট থাকে, কিন্তু GraphQL-এ একটি মাত্র এন্ডপয়েন্ট দিয়েই সব ডেটা ফেচ করা যায়।
কেন GraphQL ব্যবহার করবেন?
ধরুন, আপনি একটি API থেকে ইউজার ডেটা ফেচ করবেন, কিন্তু আপনার দরকার শুধু নাম আর ইমেল। REST API আপনাকে ইউজারের সব ইনফো রেসপন্স হিসেবে দেবে, যা আপনি আগেই ডিফাইন করেছেন। ফলে আপনার নেটওয়ার্কে অপ্রয়োজনীয় ডেটা আসছে, যা আপনার দরকারই নেই। এতে ব্যান্ডউইথ খরচ বাড়ছে এবং ট্রাফিক জ্যাম হচ্ছে। GraphQL-এর মাধ্যমে আপনি ইচ্ছে মতো নির্দিষ্ট ডেটা ফেচ করতে পারেন, যা এই সমস্যাগুলো সমাধান করে।
GraphQL উদাহরণ:
REST API-এর উদাহরণ:
GET /users/1
Response:
{
"id": 1,
"name": "John Doe",
"email": "[email protected]",
"address": "123 Main St",
"city": "Anytown",
"zipcode": "12345",
"phone": "123-456-7890",
"website": "johndoe.com"
}
এই রেসপন্সে পুরো ইউজার ইনফো পাচ্ছেন, কিন্তু আপনার দরকার ছিল শুধু নাম আর ইমেল। এতে অপ্রয়োজনীয় ডেটা আসছে যা ব্যান্ডউইথ খরচ বাড়াচ্ছে।
GraphQL-এর উদাহরণ:
query {
user(id: 1) {
name
email
}
}
Response:
{
"data": {
"user": {
"name": "John Doe",
"email": "[email protected]"
}
}
}
এখানে আপনি শুধু দরকারি তথ্য (নাম আর ইমেল) ফেচ করছেন, ফলে অপ্রয়োজনীয় ডেটা আসছে না।
GraphQL-এর সুবিধা ও অসুবিধা:
সুবিধা:
১) নির্দিষ্ট ডেটা কোয়েরি: GraphQL-এর মাধ্যমে আপনি নির্দিষ্ট ডেটা ফেচ করতে পারবেন। যেমন, যদি আপনার শুধু ইউজারের আইডি আর নাম দরকার হয়, তবে শুধু ওই ডেটাই ফেচ করতে পারবেন। আবার, যদি আপনার ইউজারের আইডি, নাম ও ফোন নাম্বার দরকার হয়, তবে সেটাও ফেচ করতে পারবেন। অর্থাৎ, GraphQL আপনি যা চাইবেন তাই রিটার্ন করবে, অপ্রয়োজনীয় কিছু নয়।
উদাহরণ:
query {
user(id: 1) {
id
name
}
}
এখানে শুধু ইউজারের আইডি আর নাম ফেচ করা হচ্ছে।
২) একাধিক রিসোর্সের ডেটা একবারেই আনা: REST API-তে একাধিক রিসোর্সের ডেটা পেতে হলে একাধিক এন্ডপয়েন্ট কল করতে হয়। কিন্তু GraphQL-এ একটি মাত্র কোয়েরির মাধ্যমে একাধিক রিসোর্স থেকে প্রয়োজনীয় ডেটা একসঙ্গে ফেচ করা যায়, যা সময় ও প্রচেষ্টা সাশ্রয় করে।
উদাহরণ:
query {
user(id: 1) {
name
posts {
title
comments {
content
}
}
}
}
এখানে একটি কোয়েরির মাধ্যমে ইউজারের নাম, পোস্টের শিরোনাম এবং কমেন্টের কনটেন্ট একসঙ্গে ফেচ করা হচ্ছে।
৩) টাইপ সিস্টেম: GraphQL টাইপ সিস্টেম ব্যবহার করে, যা ডেভেলপারদের জন্য সুবিধাজনক। এতে সহজেই বুঝতে পারবেন কোন ফিল্ড থেকে কোন টাইপের ডেটা আসছে এবং কোন ফিল্ডগুলো ফেচ করতে পারবেন। এটি কোডের উপর কন্ট্রোল বজায় রাখতে এবং বাগ ধরতে সাহায্য করে।
৪) কমিউনিটি সাপোর্ট ও ডেভেলপার এক্সপেরিয়েন্স: GraphQL-এর কমিউনিটি সাপোর্ট ও ডেভেলপার এক্সপেরিয়েন্স ভালো। এর সাহায্যে API ডকুমেন্টেশন তৈরি করা সহজ এবং ইনটিউটিভ, ফলে ডেভেলপাররা সহজেই বুঝতে পারে কোন ডেটা কীভাবে ফেচ করতে হবে।
অসুবিধা:
১) কমপ্লেক্সিটি: GraphQL শেখা এবং ইমপ্লিমেন্ট করা REST API থেকে কিছুটা জটিল হতে পারে। বিশেষ করে বড় স্কেল এপ্লিকেশনের জন্য এটি ঠিকমতো সেটআপ করা সময়সাপেক্ষ হতে পারে।
২) ক্যাশিং: REST API তে সহজে URL ভিত্তিক ক্যাশিং করা যায়, কিন্তু GraphQL তে সবকিছু একটি এন্ডপয়েন্টের মাধ্যমে হবার কারণে এই ধরনের ক্যাশিং করা কিছুটা কঠিন হতে পারে। এজন্য GraphQL-এ ক্যাশিং ব্যবস্থার জন্য বাড়তি কনফিগারেশন বা টুলিং প্রয়োজন হয়।
৩) সার্ভার লোড: GraphQL সার্ভার সাইডের লোড কিছুটা বাড়িয়ে দিতে পারে, কারণ প্রতিটি কোয়েরির ক্ষেত্রে একটি ডাইনামিক ডেটা ফেচ প্রসেসিং হয়। যদি কোয়েরিগুলো খুব কমপ্লেক্স হয় বা একসঙ্গে অনেক বেশি ডেটা ফেচ করতে হয়, তাহলে সার্ভারের উপর চাপ বাড়তে পারে।
৪) অতিরিক্ত ফ্লেক্সিবিলিটি: GraphQL-এর ফ্লেক্সিবিলিটি কিছু সময় সমস্যার কারণ হতে পারে। উদাহরণস্বরূপ, ব্যবহারকারীরা যদি ভুল কোয়েরি তৈরি করে, তাহলে তারা এমন ডেটা ফেচ করতে পারে যা আদৌ দরকার নেই, যা অতিরিক্ত লোডের কারণ হতে পারে।
আশা করছি পরের পর্বে আবার দেখা অতি শীঘ্রই।
ধন্যবাদ সবাইকে
পরের পর্ব
GraphQL শুরু করার জন্য যা যা জানা দরকার। GraphQL পার্ট - ২