ভূমিকা
এই ভিডিওটিতে আমরা শিখব কীভাবে স্প্রিং বুট (Spring Boot) ব্যবহার করে একটি কুইজ অ্যাপ্লিকেশনের জন্য Quiz Service তৈরি করা যায়। আগের পর্বগুলোতে আমরা প্রশ্ন (Questions) নিয়ে কাজ করেছি, আর এই পর্বে আমরা সেই প্রশ্নগুলোকে একত্রিত করে একটি নির্দিষ্ট বিষয়ের ওপর কুইজ তৈরি করার লজিক দেখব। মূলত ডেটাবেসে কীভাবে কুইজ এবং প্রশ্নের মধ্যে সম্পর্ক তৈরি করা হয় এবং কুইজ সেভ করা হয়, সেটিই এখানে মূল আলোচনার বিষয়।
কুইজ সার্ভিস এবং ডেটা মডেল তৈরি (Quiz Service & Model)
এই অংশে কুইজের জন্য প্রয়োজনীয় ক্লাস এবং সার্ভিস তৈরি করা হয়েছে।
রেফারেন্স: [00:22]
বিস্তারিত আলোচনা: একটি কুইজ তৈরি করতে হলে আমাদের একটি Quiz ক্লাস দরকার। এই ক্লাসে মূলত তিনটি জিনিস থাকে:
-
ID: কুইজের একটি ইউনিক নম্বর (Primary Key)।
-
Title: কুইজের নাম (যেমন: Java Quiz 1)।
-
Questions: ওই কুইজের আন্ডারে থাকা প্রশ্নগুলোর একটি তালিকা।
সহজ ব্যাখ্যা: * Entity (এনটিটি): জাভাতে যখন আমরা কোনো ক্লাসকে ডেটাবেস টেবিলের সাথে যুক্ত করি, তখন তাকে এনটিটি বলে।
- Lombok (লম্বক): এটি একটি লাইব্রেরি যা কোডে বারবার Getter এবং Setter মেথড লেখার ঝামেলা কমিয়ে দেয়।
মেনি-টু-মেনি রিলেশনশিপ (Many-to-Many Relationship)
এখানে কুইজ এবং প্রশ্নের মধ্যে সম্পর্ক স্থাপনের উপায় নিয়ে আলোচনা করা হয়েছে।
রেফারেন্স: [01:57]
বিস্তারিত আলোচনা: একটি কুইজে অনেকগুলো প্রশ্ন থাকতে পারে, আবার একটি প্রশ্ন বিভিন্ন কুইজে থাকতে পারে। এই ধরণের সম্পর্ককে ডেটাবেসের ভাষায় Many-to-Many বলা হয়। এর ফলে ডেটাবেসে একটি নতুন টেবিল তৈরি হয় যা কুইজ আইডি এবং প্রশ্ন আইডির ম্যাপিং ধরে রাখে।
কুইজ দাও (Quiz DAO) এবং রিপোজিটরি
ডেটাবেসের সাথে কথা বলার জন্য আমাদের একটি ইন্টারফেস দরকার।
রেফারেন্স: [02:31]
বিস্তারিত আলোচনা: QuizDao ইন্টারফেসটি JpaRepository কে এক্সটেন্ড (Extend) করে। এর ফলে আমাদের নিজে থেকে ডেটাবেসে ডাটা সেভ বা ডিলিট করার কোড লিখতে হয় না, স্প্রিং জেপিএ (Spring JPA) নিজেই তা করে দেয়।
কাস্টম কুয়েরি দিয়ে প্রশ্ন খোঁজা (Custom Query)
নির্দিষ্ট ক্যাটাগরি থেকে কিছু সংখ্যক র্যান্ডম (Random) প্রশ্ন তোলার জন্য আমরা কাস্টম কুয়েরি ব্যবহার করেছি।
রেফারেন্স: [08:45]
বিস্তারিত আলোচনা: সব প্রশ্ন তো আর এক কুইজে দেওয়া যাবে না। তাই আমরা ক্যাটাগরি অনুযায়ী নির্দিষ্ট সংখ্যক প্রশ্ন ডাইনামিকভাবে তুলে আনি। এর জন্য @Query অ্যানোটেশন ব্যবহার করে SQL এর মতো কুয়েরি লেখা হয়েছে।
কোড উদাহরণ:
Java
@Query(value = "SELECT * FROM question q WHERE q.category=:category ORDER BY RANDOM() LIMIT :numQ", nativeQuery = true)
List<Question> findRandomQuestionsByCategory(String category, int numQ);
ব্যাখ্যা:
-
SELECT * FROM question: প্রশ্ন টেবিল থেকে সব ডাটা নাও। -
WHERE q.category=:category: শুধুমাত্র ওই ক্যাটাগরির প্রশ্ন নাও যা ইউজার চেয়েছে। -
ORDER BY RANDOM(): প্রশ্নগুলোকে এলোমেলো করে দাও যাতে প্রতিবার নতুন সেট পাওয়া যায়। -
LIMIT :numQ: ব্যবহারকারী যতগুলো প্রশ্ন চেয়েছে (যেমন ৫টি বা ১০টি), ঠিক ততগুলোই দাও।
কুইজ তৈরির লজিক (Creating Quiz Logic)
সার্ভিস লেয়ারে কুইজ অবজেক্ট তৈরি এবং সেভ করার ধাপ।
রেফারেন্স: [06:27]
বিস্তারিত আলোচনা: কন্ট্রোলার থেকে ক্যাটাগরি, প্রশ্নের সংখ্যা এবং কুইজের নাম আসার পর সার্ভিস মেথডটি প্রথমে ডেটাবেস থেকে ওই ক্যাটাগরির র্যান্ডম প্রশ্নগুলো খুঁজে বের করে। এরপর একটি নতুন কুইজ অবজেক্ট তৈরি করে তাতে প্রশ্নগুলো সেট করে এবং শেষে quizDao.save(quiz) দিয়ে ডেটাবেসে জমা রাখে।
বিশ্লেষণ ও লেখকের ভাবনা (Analysis & Perception)
বাস্তব প্রেক্ষাপট: বাস্তব জীবনে একটি বড় কুইজ প্ল্যাটফর্ম (যেমন: Coursera বা Udemy) এভাবেই কাজ করে। সেখানে হাজার হাজার প্রশ্নের মধ্য থেকে সিস্টেম স্বয়ংক্রিয়ভাবে প্রশ্ন সেট তৈরি করে।
বিকল্প ও পরামর্শ:
-
Exception Handling: ভিডিওতে বলা হয়েছে এক্সেপশন হ্যান্ডেলিং পরে করা হবে। তবে প্রোডাকশন লেভেল অ্যাপে সবসময়
try-catchব্লক ব্যবহার করা উচিত যাতে ডেটাবেসে কোনো ভুল হলে অ্যাপ ক্রাশ না করে। -
Performance: যদি ডাটাবেসে লাখ লাখ ডাটা থাকে, তবে
ORDER BY RANDOM()কিছুটা ধীর হতে পারে। সেক্ষেত্রে অন্য কোনো অ্যালগরিদম দিয়ে প্রশ্ন বাছাই করা ভালো।
মূল উদ্দেশ্য: কন্টেন্ট ক্রিয়েটর এখানে মূলত মাইক্রোসার্ভিস আর্কিটেকচারের একটি ছোট অংশ অর্থাৎ কীভাবে ডেটা ম্যাপিং এবং কাস্টম কুয়েরি কাজ করে তা প্র্যাকটিক্যালি দেখাতে চেয়েছেন।
ভিডিও লিংক: YouTube Video Link
[
Quiz App Using Spring Boot #6 | Microservices Tutorial
Telusko · 33K views
](http://www.youtube.com/watch?v=6tzuXRFliqo)

মন্তব্যসমূহ
একটি মন্তব্য পোস্ট করুন
আপনার সমস্যাটি কমেন্ট করে আমাদের জানান :-d