গ্রাফকিউএল (GraphQL)-এ Schema এবং Type System দুটি অত্যন্ত গুরুত্বপূর্ণ উপাদান যা সার্ভারের ডেটা গঠন এবং কার্যকারিতা নির্ধারণ করে। Schema গ্রাফকিউএলের কাঠামো এবং ডেটার গঠন বর্ণনা করে, এবং Type System এর মাধ্যমে নির্ধারিত হয় কী ধরনের ডেটা সার্ভার এবং ক্লায়েন্টের মধ্যে আদান-প্রদান হবে। এই দুটি উপাদান একসাথে কাজ করে সার্ভার এবং ক্লায়েন্টের মধ্যে সুসংগঠিত ও কার্যকরী ডেটা ট্রান্সফার নিশ্চিত করে।
GraphQL Schema
Schema হল একটি চুক্তি যা সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটার আদান-প্রদান কীভাবে হবে তা নির্ধারণ করে। এটি সমস্ত কুয়েরি, মিউটেশন এবং সাবস্ক্রিপশনের জন্য রুট ডিফাইনেশন প্রদান করে এবং ডেটার গঠন, টাইপ এবং সম্পর্ক বর্ণনা করে।
Schema এর মূল উপাদান:
- Query Type:
Queryহল একটি প্রধান টাইপ যা ক্লায়েন্টের ডেটা পড়ার অনুরোধগুলো পরিচালনা করে। এটি সার্ভারের ডেটা এক্সেস করার জন্য সবচেয়ে সাধারণ উপায়। - Mutation Type:
Mutationটাইপটি সার্ভারের ডেটা পরিবর্তন করার জন্য ব্যবহৃত হয়। এটি ক্লায়েন্টের ডেটা তৈরি, আপডেট বা মুছে ফেলার জন্য ব্যবহৃত হয়। - Subscription Type:
Subscriptionটাইপটি রিয়েল-টাইম ডেটা আপডেট হ্যান্ডেল করার জন্য ব্যবহৃত হয়। এটি ক্লায়েন্টদের সার্ভারের পরিবর্তন বা নতুন ডেটা সম্পর্কে অবহিত করতে সাহায্য করে। - Root Types:
গ্রাফকিউএল-এ সাধারণত তিনটি root type থাকে:- Root Query: ডেটা পড়ার জন্য ব্যবহৃত হয়।
- Root Mutation: ডেটা লেখার জন্য ব্যবহৃত হয়।
- Root Subscription: রিয়েল-টাইম ডেটা আপডেটের জন্য ব্যবহৃত হয়।
Schema Definition Example:
type Query {
user(id: ID!): User
}
type Mutation {
createUser(name: String!): User
}
type Subscription {
newUserAdded: User
}
type User {
id: ID!
name: String!
email: String!
}
এই উদাহরণে, Query-তে একটি user নামক ফিল্ড রয়েছে, যা একটি ইউজারকে id অনুসারে রিটার্ন করবে। Mutation-এ createUser ফিল্ড রয়েছে, যা একটি নতুন ইউজার তৈরি করবে। Subscription-এ newUserAdded ফিল্ড রয়েছে, যা একটি নতুন ইউজার যোগ হলে রিয়েল-টাইমে এটি সার্ভার থেকে ক্লায়েন্টকে জানাবে।
GraphQL Type System
Type System হল গ্রাফকিউএল-এর একটি প্রধান বৈশিষ্ট্য, যা সার্ভারের ডেটার গঠন এবং টাইপ নির্ধারণ করে। এটি গ্রাফকিউএল স্কিমাতে ডেটার ধরনগুলির মধ্যে সম্পর্ক স্থাপন করতে সহায়ক হয়। গ্রাফকিউএল-এর টাইপ সিস্টেম অত্যন্ত শক্তিশালী এবং ডেটার ভ্যালিডেশন, ডেটা প্রসেসিং এবং কোড জেনারেশন সহজ করে তোলে।
গ্রাফকিউএল-এর মূল টাইপগুলো:
- Scalar Types:
গ্রাফকিউএল-এর স্কেলার টাইপগুলো হল মৌলিক ডেটার ধরন, যেমনInt,Float,String,Boolean,ID। এই টাইপগুলো ডেটার মৌলিক উপাদান এবং তাদের মান সরাসরি ফেরত দেয়।- Int: পূর্ণসংখ্যা
- Float: দশমিক সংখ্যা
- String: স্ট্রিং মান
- Boolean: সঠিক বা ভুল
- ID: একটি বিশেষ ধরন যা ইউনিক আইডেন্টিফায়ার হিসেবে ব্যবহৃত হয়
- Object Types:
Object Typeএকটি গ্রাফকিউএল টাইপ যা ফিল্ডের একটি গ্রুপ নিয়ে গঠিত। এটি অন্যান্যObject TypesবাScalar Typesধারণ করতে পারে। উদাহরণস্বরূপ,UserএকটিObject Typeযাid,name, এবংemailফিল্ড ধারণ করতে পারে। - List Types:
Listটাইপে একাধিক মান রাখা যায়। একটি লিস্ট টাইপ গ্রাফকিউএল স্কিমাতে ঐ একাধিক মানের একটি সিরিজ হিসাবে ব্যবহার করা হয়। উদাহরণস্বরূপ, যদি আপনি ইউজারের একাধিক পোস্ট ফেরত চান, তবে আপনি একটি লিস্ট টাইপ ব্যবহার করতে পারেন। - Non-Null Types:
Non-Nullটাইপ নিশ্চিত করে যে একটি ফিল্ড কখনওnullহবে না। এটি ব্যবহৃত হলে, ওই ফিল্ডের মান অবশ্যই থাকতে হবে এবংnullফেরত আসবে না।
Type Definition Example:
type User {
id: ID!
name: String!
email: String!
posts: [Post]!
}
type Post {
id: ID!
title: String!
content: String!
}
এখানে User এবং Post দুটি Object Type। User টাইপের মধ্যে posts একটি List টাইপ, যেটি Post টাইপের একাধিক আইটেম ধারণ করতে পারে। ID! এবং String! মানে যে এই ফিল্ডগুলো Non-Null এবং অবশ্যই মান থাকবে।
সারাংশ
GraphQL Schema এবং Type System সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটার আদান-প্রদান নিয়ন্ত্রণ করে এবং ডেটার কাঠামো নির্ধারণ করে। Schema গ্রাফকিউএল এর একটি মূল চুক্তি, যা কুয়েরি, মিউটেশন এবং সাবস্ক্রিপশন পরিচালনা করে, এবং Type System ডেটার ধরন এবং সম্পর্ক সংজ্ঞায়িত করে। এই দুটি উপাদান একসাথে গ্রাফকিউএল অ্যাপ্লিকেশনগুলোর কার্যকারিতা, নমনীয়তা এবং দক্ষতা বৃদ্ধি করে।
গ্রাফকিউএল (GraphQL)-এর Schema একটি অত্যন্ত গুরুত্বপূর্ণ উপাদান যা GraphQL API এর ডেটা কাঠামো, অপারেশন এবং টাইপের গঠন নির্ধারণ করে। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের মূল কাঠামো হিসেবে কাজ করে। Schema এর মাধ্যমে, GraphQL সার্ভার জানিয়ে দেয় কোন ধরনের ডেটা পাওয়া যাবে এবং কিভাবে সেই ডেটা অ্যাক্সেস করা যাবে।
GraphQL Schema কী?
GraphQL Schema হল একটি নির্দিষ্ট গঠন যা API তে উপলব্ধ ডেটা টাইপ, কুয়েরি (Query), মিউটেশন (Mutation), এবং সাবস্ক্রিপশন (Subscription)-এর নিয়ম এবং কাঠামো বর্ণনা করে। এটি API-র সমস্ত ফিচার এবং ডেটার গঠন স্পষ্টভাবে উল্লেখ করে, যাতে ক্লায়েন্টরা নির্দিষ্ট ডেটার জন্য কুয়েরি করতে পারে এবং সার্ভার সেই অনুযায়ী সঠিক ফলাফল প্রদান করতে পারে।
Schema-তে সাধারণত নিম্নলিখিত উপাদানগুলো থাকে:
- Query Types: ডেটা পড়তে ব্যবহৃত অপারেশন
- Mutation Types: ডেটা পরিবর্তন, তৈরি বা মুছে ফেলার অপারেশন
- Subscription Types: রিয়েল-টাইম আপডেট পাওয়ার অপারেশন
- Types: Object types, Scalar types, Enum types, Input types, এবং অন্যান্য টাইপ
GraphQL Schema এর ভূমিকা
ডেটা গঠন এবং টাইপ নির্ধারণ (Data Structure and Type Definition):
Schema GraphQL API তে ব্যবহৃত ডেটার গঠন এবং টাইপগুলি নির্ধারণ করে। এটি কী ধরনের ডেটা পাওয়া যাবে এবং ক্লায়েন্টরা কীভাবে সেই ডেটার জন্য প্রশ্ন করবে তা স্পষ্ট করে দেয়। উদাহরণস্বরূপ, একটি User নামক Object Type থাকতে পারে যার মধ্যে name, email, এবং age ফিল্ড থাকবে।
ক্লায়েন্ট এবং সার্ভারের মধ্যে যোগাযোগের নির্দিষ্টতা (Clear Communication Between Client and Server):
Schema API তে ডেটার ধরন এবং প্রকার সম্পর্কিত স্পষ্ট নির্দেশনা প্রদান করে। এটি সার্ভার এবং ক্লায়েন্টের মধ্যে ডেটার আদান-প্রদান নিশ্চিত করে এবং কোনো ধরনের বিভ্রান্তি বা ত্রুটি ঘটার সম্ভাবনা কমায়।
কুয়েরি এবং মিউটেশন অপারেশন (Query and Mutation Operations):
Schema ডিফাইন করে যে ক্লায়েন্টরা কোন কুয়েরি (যেমন ডেটা পড়তে) বা মিউটেশন (যেমন ডেটা পরিবর্তন করতে) করতে পারে। এটি সার্ভারকে জানায় কী ধরনের অপারেশন প্রত্যাশিত এবং কীভাবে সেই অপারেশন পরিচালিত হবে।
টেমপ্লেটের মতো কাজ করা (Acts as a Template):
GraphQL Schema একটি টেমপ্লেট হিসেবে কাজ করে যা সমস্ত API কলের জন্য গাইডলাইন হিসেবে কাজ করে। যখন একটি কুয়েরি বা মিউটেশন করা হয়, Schema সেই কুয়েরি বা মিউটেশনটির বৈধতা পরীক্ষা করে এবং ডেটার কাঠামো অনুযায়ী ফলাফল প্রদান করে।
ডেটার নিরাপত্তা (Data Security):
Schema API এর মাধ্যমে ক্লায়েন্টরা যেসব ডেটার অ্যাক্সেস চাইবে তা নির্দিষ্টভাবে ডিফাইন করা থাকে, যা সার্ভারকে নির্দিষ্ট সীমার মধ্যে ডেটা ফেরত পাঠাতে সহায়তা করে। এটি ডেটার নিরাপত্তা নিশ্চিত করতে সহায়ক।
GraphQL Schema এর উপাদানসমূহ
Object Types:
Object types হল গ্রাফকিউএল এর এমন টাইপ যেগুলোর মধ্যে এক বা একাধিক ফিল্ড থাকে, এবং প্রত্যেকটি ফিল্ডের একটি নির্দিষ্ট ডেটা টাইপ থাকে। উদাহরণস্বরূপ, User একটি Object type হতে পারে, যার মধ্যে name (String), email (String), এবং age (Int) ফিল্ড থাকবে।
Query Types:
Query types হল এমন টাইপ যা গ্রাহককে ডেটা পড়ার জন্য প্রশ্ন করার সুযোগ দেয়। এটি ক্লায়েন্টদের সার্ভার থেকে নির্দিষ্ট ডেটা রিট্রিভ করার পদ্ধতি নির্ধারণ করে।
Mutation Types:
Mutation types হল টাইপ যেগুলি ডেটা পরিবর্তন, তৈরি বা মুছে ফেলার জন্য ব্যবহৃত হয়। এটি ক্লায়েন্টদের সার্ভারের ডেটার সঙ্গে ইনপুট নিয়ে পরিবর্তন করতে সাহায্য করে।
Input Types:
Input types ব্যবহার করা হয় যখন কোন মিউটেশন বা কুয়েরি ইনপুট ডেটা গ্রহণ করে। এগুলি ডেটার কাঠামো নির্ধারণ করে এবং ক্লায়েন্ট থেকে ইনপুট ডেটা প্রেরণ করার পদ্ধতি বর্ণনা করে।
Enum Types:
Enum types হল এমন টাইপ যা একটি সীমিত সেটের মান ধারণ করে। যেমন, একটি Status enum থাকতে পারে যার মান হতে পারে ACTIVE, INACTIVE, অথবা PENDING।
Scalar Types:
Scalar types হল মৌলিক ডেটা টাইপ যেমন Int, Float, String, Boolean, এবং ID, যা ডেটার বেসিক ইউনিটকে নির্দেশ করে।
Interface Types:
Interface types হলো টাইপ যা একাধিক Object types এর মধ্যে সাধারণ ফিল্ডগুলি শেয়ার করে, যাতে ঐ Object types গুলি একই ফিল্ডে ডেটা ব্যবহার করতে পারে।
সারাংশ
GraphQL Schema API এর কাঠামো এবং ডেটার গঠন নির্ধারণ করে। এটি ক্লায়েন্ট এবং সার্ভারের মধ্যে ডেটার আদান-প্রদান পরিষ্কারভাবে নির্ধারণ করে এবং কুয়েরি, মিউটেশন, ও সাবস্ক্রিপশন অপারেশনের জন্য দিকনির্দেশনা প্রদান করে। Schema-এর মাধ্যমে, API-র কার্যকারিতা এবং নিরাপত্তা নিশ্চিত করা হয়, এবং এটি ডেটা টাইপ ও গঠনের মধ্যে সুনির্দিষ্ট নিয়ম প্রতিষ্ঠা করে।
গ্রাফকিউএল (GraphQL) স্কেলার টাইপগুলি হল সেই ডেটা ধরনের যা গ্রাফকিউএল স্কিমায় ব্যবহার করা হয় এবং তারা শুধুমাত্র একক ভ্যালু ধারণ করতে পারে। এই স্কেলার টাইপগুলি মূলত ডেটার মৌলিক ধরনগুলি (যেমন স্ট্রিং, ইন্টিজার, বুলিয়ান, ফ্লোট এবং আইডি) প্রতিনিধিত্ব করে। গ্রাফকিউএল স্কিমায় বিভিন্ন ধরনের ডেটার জন্য স্কেলার টাইপগুলি ব্যবহৃত হয় এবং এগুলি সার্ভারের মাধ্যমে ক্লায়েন্টের কাছে ফেরত আসা ডেটার ফরম্যাট নির্ধারণ করে।
Scalar Types এর প্রকারভেদ
String
- বর্ণনা:
Stringটাইপ গ্রাফকিউএল-এ ব্যবহার করা হয় টেক্সট বা স্ট্রিং ডেটা প্রতিনিধিত্ব করতে। এটি এক বা একাধিক অক্ষরের একটি সিকোয়েন্স হতে পারে। সাধারণত ইউজারের নাম, ইমেইল ঠিকানা, বা অন্য কোনও টেক্সট ইনপুটের জন্য ব্যবহৃত হয়। - উদাহরণ:
"Hello, World!"
Int
- বর্ণনা:
Intটাইপটি পুরো সংখ্যাকে (integer) প্রতিনিধিত্ব করে। এটি সাধারণত গাণিতিক অপারেশন এবং কাউন্টিং এর জন্য ব্যবহৃত হয়। - উদাহরণ:
42,-100
Boolean
- বর্ণনা:
Booleanটাইপটি দুটি ভ্যালু গ্রহণ করতে পারে:trueবাfalse। এটি শর্তপূর্ণ প্রশ্ন, ফ্ল্যাগ বা বুলিয়ান লজিকের জন্য ব্যবহৃত হয়। উদাহরণস্বরূপ, কোনো ব্যবহারকারী লগ ইন করেছে কিনা, অথবা একটি পণ্য উপলভ্য কিনা ইত্যাদি। - উদাহরণ:
true,false
Float
- বর্ণনা:
Floatটাইপটি দশমিক সংখ্যা (ফ্লোটিং পয়েন্ট সংখ্যা) প্রতিনিধিত্ব করে। এটি সাধারণত মুদ্রা, গড়, শতাংশ বা যেকোনো ভগ্নাংশের মান বোঝাতে ব্যবহৃত হয়। - উদাহরণ:
3.14,-0.001
ID
- বর্ণনা:
IDটাইপটি একটি বিশেষ স্কেলার টাইপ যা কোনো একটি ইউনিক আইডেন্টিফায়ার বা প্রাথমিক কী প্রতিনিধিত্ব করে। এটি সাধারণত একটি রেকর্ড বা অবজেক্টের পরিচিতি হিসেবে ব্যবহৃত হয়, যা ডেটাবেসে একাধিক অবজেক্টের মধ্যে আলাদা আলাদা হতে সাহায্য করে।IDভ্যালু সাধারণত স্ট্রিং বা সংখ্যার মাধ্যমে দেওয়া হয়, তবে এর কোনো নির্দিষ্ট ফরম্যাট নেই। - উদাহরণ:
"user123","product456"
Scalar Types এর ব্যবহার
গ্রাফকিউএল স্কিমায়, আপনি স্কেলার টাইপগুলি ব্যবহার করে আপনার ডেটার কাঠামো বা মডেল তৈরি করতে পারেন। নিচে একটি সাধারণ উদাহরণ দেখানো হলো যেখানে বিভিন্ন স্কেলার টাইপ ব্যবহার করা হয়েছে:
type User {
id: ID
name: String
age: Int
isActive: Boolean
balance: Float
}
এখানে:
idএকটি ইউনিক আইডি প্রতিনিধিত্ব করছে (IDটাইপ),nameব্যবহারকারীর নামের জন্য একটি স্ট্রিং (Stringটাইপ),ageব্যবহারকারীর বয়সের জন্য একটি পূর্ণসংখ্যা (Intটাইপ),isActiveব্যবহারকারীর সক্রিয় অবস্থা জানাতে একটি বুলিয়ান (Booleanটাইপ),balanceব্যবহারকারীর ব্যালেন্সের জন্য একটি ফ্লোটিং পয়েন্ট সংখ্যা (Floatটাইপ)।
সারাংশ
গ্রাফকিউএল-এর Scalar Types (String, Int, Boolean, Float, ID) হল মৌলিক ডেটা টাইপ যা গ্রাফকিউএল স্কিমায় ব্যবহৃত হয়। এগুলি সিস্টেমে ডেটার ভ্যালু নির্ধারণ করে এবং ক্লায়েন্টের কাছে ডেটার যথাযথ ফরম্যাট প্রেরণের জন্য ব্যবহৃত হয়। এই টাইপগুলির মাধ্যমে ডেটার বিভিন্ন রকমের মান যেমন স্ট্রিং, সংখ্যা, দশমিক মান, এবং বুলিয়ান মান সহজেই পরিচালনা করা যায়।
GraphQL-এ, ডেটা গঠন করার জন্য Object Types এবং Fields গুরুত্বপূর্ণ ভূমিকা পালন করে। এগুলি সাহায্যে, আপনি কিভাবে ডেটা ফেরত পাবে এবং ডেটার কাঠামো কেমন হবে, তা নির্ধারণ করতে পারেন। Object Types হল GraphQL স্কিমার মৌলিক নির্মাণ, যেখানে আপনি ডেটার ধরন এবং সম্পর্ক নির্ধারণ করতে পারেন। Fields হল Object Types এর ভেতরে থাকা নির্দিষ্ট ডেটা বা মেথড যা ক্লায়েন্টদের জন্য অ্যাক্সেসযোগ্য হয়।
Object Types
Object Types হল GraphQL স্কিমায় একটি নির্দিষ্ট ডেটা টাইপ বা অবজেক্টের বর্ণনা। প্রতিটি Object Type-এর মধ্যে এক বা একাধিক Field থাকে, যা ক্লায়েন্টরা কুয়েরি করতে পারে।
ধরা যাক, আমাদের একটি User নামক Object Type রয়েছে, যেটি একটি ব্যবহারকারীর তথ্য ধারণ করবে। এই Object Type-এর মধ্যে কিছু Fields থাকবে যেমন id, name, email, এবং age।
Object Type উদাহরণ:
type User {
id: ID
name: String
email: String
age: Int
}
এখানে:
Userএকটি Object Type যা ইউজারের তথ্য ধারণ করবে।- এর মধ্যে রয়েছে চারটি Field:
id,name,email, এবংage, যেখানে প্রতিটি ফিল্ডের ধরন নির্ধারণ করা হয়েছে (যেমন:String,Int,ID)।
Fields
Fields হল Object Type-এর ভেতরে থাকা ডেটা বা ফাংশন যেগুলি ক্লায়েন্ট কুয়েরি করতে পারে। প্রতিটি ফিল্ডের সাথে একটি নির্দিষ্ট ডেটা টাইপ যুক্ত থাকে। ক্লায়েন্ট যেকোনো ফিল্ড কুয়েরি করতে পারে এবং সেই ফিল্ডের জন্য সংশ্লিষ্ট ডেটা ফিরে পাবে।
উদাহরণস্বরূপ, একটি User Object Type-এ আমরা name, email, এবং age ফিল্ড থাকতে পারি, এবং ক্লায়েন্ট শুধুমাত্র যেটি চায় সেটি কুয়েরি করতে পারবে। যদি ক্লায়েন্ট শুধু name এবং email চায়, তাহলে শুধু ওই দুটি ফিল্ডের ডেটা ফেরত আসবে।
Fields উদাহরণ:
type Query {
users: [User]
}
এখানে:
Queryহল একটি Object Type, যা API-এর প্রধান এন্ট্রি পয়েন্ট হিসেবে কাজ করে।usersএকটি ফিল্ড যা অনেক User অবজেক্টের একটি অ্যারে ফিরিয়ে আনে। এখানেusersফিল্ডের ডেটা টাইপ হল[User], যা একটি User Object Type-এর অ্যারে।
Object Types এবং Fields এর সাথে কুয়েরি করা
একবার যখন আপনি Object Types এবং Fields সংজ্ঞায়িত করেন, তখন ক্লায়েন্ট কেবল প্রয়োজনীয় ফিল্ডগুলো কুয়েরি করে ডেটা পেতে পারে।
কুয়েরি উদাহরণ:
query {
users {
name
email
}
}
এই কুয়েরি সার্ভারকে বলছে যে, "আমাকে users এর তালিকা দিন, এবং প্রতিটি ব্যবহারকারীর name এবং email ফেরত দিন।" এখানে, age বা id ফিল্ডগুলো চাওয়া হয়নি, তাই সেগুলো ফিরিয়ে আনা হবে না।
স্নেহপূর্ণ ডেটার সাথে Object Types এবং Fields এর ব্যবহার
গ্রাফকিউএল স্কিমাতে আপনি একাধিক Object Type তৈরি করতে পারেন যেগুলোর মধ্যে সম্পর্ক থাকতে পারে। এটি GraphQL-কে সম্পর্কিত ডেটার জন্য শক্তিশালী ও নমনীয় করে তোলে। আপনি যদি কোনো ডেটার মধ্যে সম্পর্ক দেখতে চান, তাহলে Object Types এবং Fields কে রিলেটেড করে ব্যবহার করতে পারেন।
উদাহরণ (Relationship between Object Types):
type User {
id: ID
name: String
posts: [Post]
}
type Post {
id: ID
title: String
content: String
author: User
}
এখানে:
- User Object Type-এ একটি
postsফিল্ড রয়েছে, যা একটি Post Object Type-এর অ্যারে রিটার্ন করে। এটি বলে যে, একটি ব্যবহারকারীর এক বা একাধিক পোস্ট থাকতে পারে। - Post Object Type-এ একটি
authorফিল্ড রয়েছে, যা একটি User Object Type ফিরিয়ে আনে, এটি বলে যে, প্রতিটি পোস্টের একজন লেখক বা author থাকবে।
কুয়েরি উদাহরণ:
query {
users {
name
posts {
title
content
}
}
}
এই কুয়েরি সার্ভারকে বলছে, "মনে করুন, আমি সব User এর নাম চাচ্ছি এবং তাদের সব Post এর শিরোনাম এবং কনটেন্ট চাচ্ছি।"
সারাংশ
Object Types এবং Fields হল GraphQL স্কিমার প্রধান উপাদান যা ডেটার গঠন এবং ক্লায়েন্টের কুয়েরি করার পদ্ধতি নির্ধারণ করে। Object Types হল ডেটার ধরন এবং সম্পর্কের বর্ণনা, এবং Fields হল সেই Object Types-এর মধ্যে থাকা ডেটা বা মেথড। GraphQL এ আপনি Object Types এবং Fields ব্যবহার করে ডেটার কাঠামো তৈরি করতে পারেন, এবং ক্লায়েন্টরা শুধু তাদের প্রয়োজনীয় ডেটা কুয়েরি করে পেতে পারে।
গ্রাফকিউএল (GraphQL) এর মধ্যে Non-null এবং List টাইপ ডেটা মডেলিং এর গুরুত্বপূর্ণ অংশ। এগুলি আপনাকে ডেটার ধরন এবং তার আচরণ নির্ধারণ করতে সহায়ক। Non-null টাইপ নির্দিষ্ট করে যে একটি ফিল্ড কখনোই null হতে পারে না, এবং List টাইপ ব্যবহার করে একাধিক মানের একটি সংগ্রহ সংজ্ঞায়িত করা হয়। এই দুটি ধারণা GraphQL স্কিমা ডিজাইনকে আরও শক্তিশালী এবং সুনির্দিষ্ট করে তোলে।
Non-null টাইপ
Non-null টাইপ গ্রাফকিউএল এর এমন একটি বৈশিষ্ট্য যা নিশ্চিত করে যে, একটি ফিল্ড কখনও null হবে না। এটি নিশ্চিত করতে, টাইপের শেষে ! চিহ্ন যুক্ত করা হয়। এর মাধ্যমে আপনি বলছেন যে, এই ফিল্ডটির জন্য অবশ্যই একটি মান প্রদান করা হবে, তা null হতে পারবে না।
Non-null টাইপের ব্যবহার
যেমন ধরুন, আপনি একটি ইউজারের নাম এবং বয়স ইনফরমেশন চান, এবং আপনি চান যে নাম কখনও null না হয়, তবে বয়স null হতে পারে (অর্থাৎ, বয়স ঐচ্ছিক হতে পারে)। তখন আপনি Non-null টাইপ ব্যবহার করতে পারেন।
উদাহরণ:
type User {
name: String!
age: Int
}
এখানে:
name: String!–nameফিল্ডটি কখনোnullহতে পারবে না, এটি একটি অপরিহার্য মান হিসেবে চিহ্নিত।age: Int–ageফিল্ডটিnullহতে পারে, কারণ এটি অপরিহার্য নয়।
এটি একটি শক্তিশালী পদ্ধতি, যা ডেটা গ্রহণের সময় নির্দিষ্ট মানের অগ্রাধিকারের ওপর জোর দেয়।
Non-null এর সুবিধা
- ডেটা ভ্যালিডেশন: এটি নিশ্চিত করে যে আপনি কখনো অকার্যকর বা অসম্পূর্ণ ডেটা গ্রহণ করছেন না।
- আগ্রহপূর্ণ তথ্য: ব্যবহারকারীদের এমন ফিল্ডে
nullমান না দিতে বাধ্য করা, যেগুলি গুরুত্বপূর্ণ তথ্য হিসেবে গণ্য হয়।
List টাইপ
List টাইপ ব্যবহার করে আপনি একাধিক মানের একটি সংগ্রহ সংজ্ঞায়িত করতে পারেন। GraphQL এ, একটি List টাইপ তৈরি করতে, একটি টাইপের সঙ্গে [] ব্যবহার করা হয়। এটি ক্লায়েন্টকে একাধিক আইটেমের তালিকা ফেরত পাঠানোর অনুমতি দেয়।
List টাইপের ব্যবহার
ধরুন, আপনি একটি User টাইপ তৈরি করেছেন এবং আপনি চান যে একজন ইউজারের একাধিক ফোন নম্বর থাকতে পারে। এখানে আপনি List টাইপ ব্যবহার করতে পারেন।
উদাহরণ:
type User {
name: String!
phoneNumbers: [String]
}
এখানে:
phoneNumbers: [String]– এটি একটি List টাইপ, যা String মানগুলির একটি তালিকা হবে। এখানে আপনি একটি বা একাধিক ফোন নম্বর প্রদান করতে পারেন।nullমান গ্রহণ করার সুযোগও রয়েছে।
Non-null List টাইপ
এছাড়া, আপনি যদি চান যে একটি List কখনও খালি (empty) না থাকে এবং প্রত্যেকটি আইটেম অবশ্যই উপস্থিত থাকতে হবে, তবে আপনি Non-null List ব্যবহার করতে পারেন। এর জন্য আপনি ! চিহ্নের মাধ্যমে List-এর মধ্যে থাকা প্রতিটি আইটেমের মানকে অপরিহার্য করতে পারেন।
উদাহরণ:
type User {
name: String!
phoneNumbers: [String!]!
}
এখানে:
[String!]!– এটি একটি Non-null List টাইপ, যেখানে তালিকা কখনোnullহতে পারবে না এবং এর প্রতিটি আইটেম (যেমন ফোন নম্বর) অবশ্যইnullহতে পারবে না। এর মানে হলো, ইউজারের অবশ্যই একাধিক ফোন নম্বর থাকতে হবে এবং কোনো ফোন নম্বরnullহতে পারবে না।
List টাইপের সুবিধা
- একাধিক মানের সংগ্রহ: এটি ব্যবহার করে আপনি একাধিক মান বা আইটেম ফেরত পাঠাতে পারবেন, যা সাধারণত অ্যারের মতো কাজ করে।
- ডেটা ফিল্ডের অতি নমনীয়তা: List টাইপ ডেটার গঠন আরো নমনীয় করে তোলে, যেমন একাধিক ফোন নম্বর বা পছন্দের তালিকা।
Non-null এবং List টাইপের একত্রিত ব্যবহার
এখন, যদি আপনি চান যে একটি ফিল্ডে একাধিক মান (List) থাকতে হবে এবং প্রতিটি মান Non-null হওয়া উচিত, তাহলে আপনি Non-null List টাইপ ব্যবহার করতে পারেন।
উদাহরণ:
type User {
name: String!
phoneNumbers: [String!]!
}
এখানে:
name: String!– ইউজারের নাম কখনোnullহতে পারে না।phoneNumbers: [String!]!– ইউজারের একাধিক ফোন নম্বর থাকতে হবে এবং প্রতিটি ফোন নম্বরnullহতে পারবে না।
এভাবে আপনি আরও স্পেসিফিক ডেটা যাচাই এবং শ্রেণীবদ্ধকরণ করতে পারেন।
সারাংশ
Non-null এবং List টাইপগুলি GraphQL স্কিমার মধ্যে গুরুত্বপূর্ণ ভূমিকা পালন করে, যেখানে Non-null টাইপ ফিল্ডের জন্য মানের অপরিহার্যতা নির্ধারণ করে এবং List টাইপ একাধিক মানের তালিকা পরিচালনা করতে সহায়ক। এই দুটি বৈশিষ্ট্য ক্লায়েন্টের ডেটার গুণগত মান এবং ডেটার কাঠামো সুনির্দিষ্টভাবে নিশ্চিত করতে সাহায্য করে। Non-null টাইপ ডেটার অভাব এবং List টাইপ একাধিক মানের সাপোর্ট প্রদান করে, যা GraphQL এর ডেটা মডেলিংকে আরও শক্তিশালী এবং নমনীয় করে তোলে।
GraphQL-এ Custom Types তৈরি করা হল একটি গুরুত্বপূর্ণ অংশ যা ডেটা মডেল এবং স্কিমাকে আরও নমনীয় এবং শক্তিশালী করে তোলে। Custom Types ব্যবহার করে আপনি আপনার API-তে নতুন ডেটা ধরন এবং সম্পর্ক তৈরি করতে পারেন, যা ক্লায়েন্টদের নির্দিষ্ট প্রয়োজনীয়তা অনুযায়ী ডেটা ফিল্ড প্রদান করে।
Custom Types তৈরি করার জন্য প্রয়োজনীয় উপাদান
GraphQL-এ Custom Types তৈরি করতে, আপনি GraphQLObjectType, GraphQLString, GraphQLInt, GraphQLBoolean ইত্যাদি ব্যবহার করতে পারেন, যা আপনার ডেটার ধরন নির্ধারণ করে। সাধারণত Object Types, Input Types, Enum Types, এবং Scalar Types GraphQL-এ কাস্টম টাইপ তৈরি করার জন্য ব্যবহৃত হয়।
১. Object Types তৈরি করা
Object Types হল GraphQL-এর মূল ডেটা ধরনের মধ্যে একটি, যা বিভিন্ন ফিল্ড ধারণ করে। এগুলি মূলত ডেটার কাঠামো (structure) এবং সম্পর্ক নির্দেশ করে।
উদাহরণ:
ধরা যাক, আমরা একটি User টাইপ তৈরি করতে চাই, যেখানে ব্যবহারকারীর নাম, ইমেইল এবং বয়স থাকবে।
const { GraphQLObjectType, GraphQLString, GraphQLInt } = require('graphql');
// User টাইপ তৈরি করা
const UserType = new GraphQLObjectType({
name: 'User', // টাইপের নাম
fields: () => ({
id: { type: GraphQLString }, // id ফিল্ড
name: { type: GraphQLString }, // নাম ফিল্ড
email: { type: GraphQLString }, // ইমেইল ফিল্ড
age: { type: GraphQLInt } // বয়স ফিল্ড
})
});
এখানে আমরা UserType নামে একটি কাস্টম টাইপ তৈরি করেছি, যা চারটি ফিল্ড ধারণ করে: id, name, email, এবং age।
২. Input Types তৈরি করা
Input Types হল বিশেষ ধরনের কাস্টম টাইপ যা ডেটা গ্রহণ করতে ব্যবহৃত হয়। এটি সাধারণত মিউটেশন (Mutation) এর ক্ষেত্রে ব্যবহার হয়, যেখানে ক্লায়েন্ট সার্ভারে ডেটা পাঠানোর জন্য এই টাইপ ব্যবহার করতে পারে।
উদাহরণ:
ধরা যাক, আমরা একটি UserInputType তৈরি করতে চাই, যা নতুন ইউজার তৈরি করার জন্য তথ্য গ্রহণ করবে।
const { GraphQLInputObjectType } = require('graphql');
// UserInputType তৈরি করা
const UserInputType = new GraphQLInputObjectType({
name: 'UserInput',
fields: () => ({
name: { type: GraphQLString },
email: { type: GraphQLString },
age: { type: GraphQLInt }
})
});
এখানে UserInputType ব্যবহারকারীকে নাম, ইমেইল এবং বয়সের জন্য ইনপুট নিতে সহায়ক হবে।
৩. Enum Types তৈরি করা
Enum Types হল ডেটার একটি পূর্বনির্ধারিত সেট যা কেবলমাত্র নির্দিষ্ট মান ধারণ করতে পারে। এটি ডেটার নির্দিষ্ট মান সীমাবদ্ধ করার জন্য ব্যবহার করা হয়।
উদাহরণ:
ধরা যাক, আমরা একটি Status নামের Enum টাইপ তৈরি করতে চাই, যেখানে ব্যবহারকারীর স্ট্যাটাস হবে "Active", "Inactive", বা "Pending"।
const { GraphQLEnumType } = require('graphql');
// Status Enum টাইপ তৈরি করা
const StatusEnumType = new GraphQLEnumType({
name: 'Status',
values: {
ACTIVE: { value: 'Active' },
INACTIVE: { value: 'Inactive' },
PENDING: { value: 'Pending' }
}
});
এখানে StatusEnumType শুধুমাত্র তিনটি মান গ্রহণ করতে পারবে: Active, Inactive, এবং Pending।
৪. Scalar Types তৈরি করা
Scalar Types হল ডেটার প্রাথমিক ধরনের জন্য ব্যবহৃত। GraphQL-এ কিছু ডিফল্ট Scalar Types রয়েছে যেমন String, Int, Float, Boolean, এবং ID। তবে আপনি কাস্টম Scalar Typesও তৈরি করতে পারেন।
উদাহরণ:
ধরা যাক, আমরা একটি কাস্টম Scalar টাইপ তৈরি করতে চাই, যা একটি Date টাইপ হবে এবং তার মান একটি তারিখের স্ট্রিং (যেমন 2024-12-22) হবে।
const { GraphQLScalarType, Kind } = require('graphql');
// Date Scalar টাইপ তৈরি করা
const DateScalarType = new GraphQLScalarType({
name: 'Date',
description: 'A custom scalar type for dates',
serialize(value) {
return value.toISOString(); // serialize ডেটা স্ট্রিং হিসাবে
},
parseValue(value) {
return new Date(value); // ইনপুট ডেটা হিসেবে নতুন Date অবজেক্ট তৈরি করা
},
parseLiteral(ast) {
if (ast.kind === Kind.STRING) {
return new Date(ast.value); // স্ট্রিং ডেটা হিসেবে তারিখে রূপান্তর করা
}
return null;
}
});
এখানে DateScalarType কাস্টম Scalar টাইপ হিসেবে তৈরি করা হয়েছে, যা ডেটা স্ট্রিং রূপে গ্রহণ এবং প্রদান করতে সক্ষম।
৫. কাস্টম টাইপ GraphQL স্কিমায় ব্যবহার করা
এখন যে কাস্টম টাইপগুলি তৈরি করা হয়েছে, সেগুলি GraphQL Schema-এ ব্যবহার করা যায়। নিচে একটি সাধারণ উদাহরণ দেওয়া হলো যেখানে UserType এবং StatusEnumType ব্যবহার করা হয়েছে।
const { GraphQLSchema, GraphQLObjectType, GraphQLString } = require('graphql');
// Root Query তৈরি করা
const RootQuery = new GraphQLObjectType({
name: 'RootQueryType',
fields: {
user: {
type: UserType,
resolve(parent, args) {
return {
id: '1',
name: 'John Doe',
email: 'john.doe@example.com',
age: 30
};
}
},
status: {
type: StatusEnumType,
resolve() {
return 'ACTIVE'; // Enums এর মান ফেরত দেওয়া
}
}
}
});
// Schema তৈরি করা
const schema = new GraphQLSchema({
query: RootQuery
});
এখানে, RootQuery তে আমরা UserType এবং StatusEnumType ফিল্ডগুলি ব্যবহার করেছি।
সারাংশ
GraphQL-এ কাস্টম টাইপ তৈরি করা ডেটার কাঠামো এবং API এর কার্যকারিতা বাড়াতে গুরুত্বপূর্ণ ভূমিকা পালন করে। আপনি Object Types, Input Types, Enum Types, এবং Scalar Types তৈরি করে আপনার API-কে আরও নমনীয় এবং শক্তিশালী করতে পারেন। এই কাস্টম টাইপগুলি স্কিমার মাধ্যমে ক্লায়েন্টের জন্য উপযোগী ডেটা সরবরাহ করতে সাহায্য করে।
Read more