GraphQL কি এবং কেন? GraphQL পার্ট - ১

শুরুতেই সবার ক্ষমা চেয়ে নিচ্ছি, কারণ আমার লেখা-লেখির একদমই অভ্যাস নেই। ভুল-ভ্রান্তি হলে ক্ষমা সুন্দর দৃষ্টিতে দেখবেন। সাহস করে GraphQL নিয়ে লিখতে বসে পড়লাম। আশা করছি কয়েকটি পর্বে Laravel + GraphQL + ReactJS + React Native দিয়ে আমরা একটি ওয়েব এবং মোবাইল অ্যাপ বানাতে চেষ্টা করবো। চলুন তাহলে শুরু করা যাক।

graphql_logo_icon_171045

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 পার্ট - ২

36 Likes

দারুণ সিরিজ শুরু করেছেন ভাই। জিনিসটা আমার অত্যাধিক পছন্দের। আমার কাজগুলাকে সহজ এবং স্কেলেবল করে দেয়। আরও লেখা পাওয়ার অপেক্ষায় থাকলাম।

4 Likes

@ruhulameen রুহুল ভাই জিন্দাবাদ :muscle::muscle:

4 Likes

দারুন হয়েছে, আমিও কয়েকদিন ধরে ভাবছিলাম লারাভেলের সাথে GraphQL শুরু করব।

3 Likes

@rasel ভাই ধন্যবাদ। :heart_eyes:

I love GraphQL all day :heart:

আসাধরন লিখেছেন ভাই। আপনার সাথে কাজ করার সময়ে আমি প্রথম আপনার থেকে Graph QL সম্পর্কে জানতে পেরেছিলাম :heavy_heart_exclamation:

1 Like

@ruhulameen

আপনি একটি API থেকে ইউজার ডেটা ফেচ করবেন, কিন্তু আপনার দরকার শুধু নাম আর ইমেল। REST API আপনাকে ইউজারের সব ইনফো রেসপন্স হিসেবে দেবে

vai, eta to amra REST API diyeo korte pari. database e data query korar somoy iccha moto thik korte pari kon field nibo ar kon field nibo na. abar different collection / table theke data combine koreo ante pari agrregator use kore. tahole ektu specificly bolben ki asholei graphQL ki sudhu ei specific data ana ar single endpoint er jonnoi more preferred ?

1 Like

দারুন। আশা করি আরও পার্ট আসবে।

না, শুধু মাত্র সিঙ্গেল এন্ডপয়েন্টের জন্য না। আশা করছি তৃতীয় পর্বে বুঝতে পারবেন।

Graphql ব্যবহার করতেছি। সেইম প্রজেক্টে রেস্ট এপিআই ও ব্যবহার করেছি। সমস্যা হল রেস্ট এপিআই হলে আমি যদি একটা লিস্ট ফেচ করি তাহলে তার ডাটা গুলা ডিটেইলস পেজে পাঠাতে পারি without api calling. কিন্তু গ্রাফ এ যেহেতু লিমিটেড ডাটা কুয়েরি করেছি ডিটেইলস পেইজে গিয়ে আবার কুয়েরি করতে হচ্ছে। এছাড়া আগে যেই মডেল গুলা ছিল নালেবল না ফিল্ড গুলায় এরর খাচ্ছি। আবার সব ফিল্ড নালেবল করতে হচ্ছে। এই আরকি।

1 Like

রিয়্যাক্ট এপ্লিকেশনে কিভাবে ইমপ্লিমেন্ট করা যায় GraphQL সেটা নিয়ে একটা বিস্তারিত আলোচনা চাই।

2 Likes

@sohrab09 জ্বি অবশ্যই থাকবে ভাই। আমরা ফ্রন্ট-এন্ড হিসেবে ReactJS ইউজ করবো এই সিরিজে।

1 Like

Thank you so much vai. I’m waiting for this article or series.

1 Like