সরাসরি প্রধান সামগ্রীতে চলে যান

স্প্রিং বুট ব্যবহার করে কুইজ অ্যাপ তৈরি: পার্ট ৩ (মাইক্রোসার্ভিসেস)

ভূমিকা (Introduction)

এই ভিডিওতে আমরা একটি কুইজ অ্যাপ্লিকেশন তৈরির পরবর্তী ধাপগুলো শিখব। মূলত এখানে দেখানো হয়েছে কীভাবে ডাটাবেস থেকে নির্দিষ্ট ক্যাটাগরি (যেমন: Java, Python) অনুযায়ী প্রশ্ন খুঁজে বের করা যায় এবং কীভাবে নতুন প্রশ্ন সিস্টেমে যোগ (Add) করা যায়। এটি একটি Microservices Tutorial সিরিজের অংশ, যেখানে Spring Boot এবং Spring Data JPA ব্যবহার করে ব্যাকএন্ডের কাজগুলো সহজ করা হয়েছে।


পার্ট ১: ক্যাটাগরি অনুযায়ী প্রশ্ন খোঁজা (Fetching Questions by Category)

আগের পর্বে আমরা সব প্রশ্ন একসাথে আনা শিখেছিলাম। কিন্তু বাস্তবে আমাদের হয়তো শুধু 'Java' বা 'Python'-এর প্রশ্ন দরকার হতে পারে।

রেফারেন্স: ভিডিওর শুরু থেকে ০৫:৫০ পর্যন্ত দেখুন

বিস্তারিত আলোচনা: ১. Controller-এ পরিবর্তন: আমরা একটি নতুন মেথড তৈরি করি যা ইউজার থেকে একটি 'Category' ইনপুট নেবে। ২. Path Variable: ব্রাউজারের লিঙ্কে (URL) যখন আমরা কোনো মান পাঠাই (যেমন: /question/category/java), তখন সেই 'java' শব্দটিকে কোডে ধরার জন্য @PathVariable অ্যানোটেশন ব্যবহার করা হয়। ৩. JPA Magic: মজার ব্যাপার হলো, আমাদের ডাটাবেসের জন্য কোনো কঠিন কুয়েরি (Query) লিখতে হয়নি। QuestionDao ইন্টারফেসে শুধু findByCategory নামে একটি মেথড লিখলেই Spring Data JPA নিজে থেকেই বুঝে নেয় যে তাকে 'category' কলামে সার্চ করতে হবে।

সহজ ব্যাখ্যা: * Path Variable: এটি একটি ঠিকানার মতো। মনে করুন আপনি একটি লাইব্রেরিতে গিয়ে বললেন "আমাকে বিজ্ঞানের বই দিন"। এখানে 'বিজ্ঞান' হলো পাথ ভেরিয়েবল।


পার্ট ২: নতুন প্রশ্ন যোগ করা (Adding a New Question)

সিস্টেমে নতুন প্রশ্ন ইনপুট দেওয়ার জন্য আমাদের একটি 'POST' রিকোয়েস্ট তৈরি করতে হবে।

রেফারেন্স: ভিডিওর ০৬:৫০ থেকে ১৫:২০ পর্যন্ত দেখুন

বিস্তারিত আলোচনা: ১. POST Mapping: ডাটাবেসে নতুন কিছু সেভ করার জন্য আমরা @PostMapping ব্যবহার করি। ২. Request Body: যখন ক্লায়েন্ট (যেমন মোবাইল অ্যাপ বা ব্রাউজার) থেকে কোনো ডাটা পাঠানো হয়, তখন সেটি JSON ফরম্যাটে থাকে। এই JSON ডাটাকে জাভা অবজেক্টে রূপান্তর করতে @RequestBody ব্যবহার করা হয়। ৩. Service & DAO: কন্ট্রোলার থেকে ডাটা সার্ভিসে যায়, আর সার্ভিস থেকে questionDao.save(question) মেথড কল করে ডাটাবেসে সেভ করা হয়।

সহজ ব্যাখ্যা:

  • JSON: এটি ডাটা আদান-প্রদানের একটি সহজ ভাষা। অনেকটা লিস্টের মতো যেখানে নাম এবং তার মান লেখা থাকে (যেমন: "question": "What is Java?").

কোডিং সেকশন (Coding Snippet)

নিচে ক্যাটাগরি অনুযায়ী প্রশ্ন খোঁজার জন্য কন্ট্রোলারের একটি সহজ উদাহরণ দেওয়া হলো:

Java

// Controller-এর কোড
@GetMapping("category/{category}")
public ResponseEntity<List<Question>> getQuestionsByCategory(@PathVariable String category) {
    // সার্ভিসকে বলা হচ্ছে নির্দিষ্ট ক্যাটাগরির প্রশ্ন দিতে
    return questionService.getQuestionsByCategory(category);
} 

এই কোড দিয়ে আমরা কী পেলাম? এই কোডটি যখনই ব্রাউজারে /question/category/java লিখে সার্চ করা হবে, তখনই ডাটাবেস থেকে শুধু জাভার প্রশ্নগুলো খুঁজে এনে ইউজারের সামনে সুন্দরভাবে সাজিয়ে দেবে।


কঠিন শব্দের সহজ ব্যাখ্যা

১. Annotation (অ্যানোটেশন): এটি জাভাতে @ চিহ্ন দিয়ে শুরু হয়। এটি স্প্রিং বুটকে বলে দেয় যে কোনো একটি ক্লাস বা মেথড কী কাজ করবে। যেমন: @GetMapping মানে এটি ডাটা পড়ার কাজ করবে। ২. JPA (Java Persistence API): এটি একটি টুল যা আমাদের ডাটাবেসের সাথে কথা বলতে সাহায্য করে। আমাদের নিজের হাতে SQL কুয়েরি লিখতে হয় না, এটি নিজেই সব করে দেয়। ৩. Postman: এটি একটি সফটওয়্যার যা দিয়ে আমরা আমাদের তৈরি করা API গুলো চেক করে দেখতে পারি যে সেগুলো ঠিকঠাক কাজ করছে কি না।


বিশ্লেষণ ও বাস্তব ধারণা (Analysis & Thinking)

সৃষ্টিকর্তার উদ্দেশ্য: এই ভিডিওর মাধ্যমে ইন্সট্রাকটর বোঝাতে চেয়েছেন যে, স্প্রিং বুট ব্যবহার করলে ব্যাকএন্ড ডেভেলপমেন্ট কতটা দ্রুত এবং সহজ হতে পারে। বিশেষ করে 'Convention over Configuration' (অর্থাৎ নির্দিষ্ট নিয়ম মেনে চললে কনফিগারেশন কম করতে হয়) বিষয়টি এখানে স্পষ্ট।

বাস্তব প্রেক্ষাপট ও আমার চিন্তা: বাস্তবে যখন আপনি একটি বড় কুইজ অ্যাপ বানাবেন, তখন শুধু ডাটা যোগ বা দেখলেই হবে না। আপনাকে 'Error Handling' বা ভুল হলে কী হবে সেটা নিয়েও ভাবতে হবে। যেমন: যদি কেউ এমন ক্যাটাগরি সার্চ করে যা ডাটাবেসে নেই, তবে যেন একটি সুন্দর মেসেজ দেখায় (যেমন: "No questions found")।

বিকল্প ও পরামর্শ:

  • ভাল বিকল্প: ডাটাবেসে ডাটা যোগ করার সময় সরাসরি ID না দিয়ে 'Auto-increment' বা 'Identity' ব্যবহার করা উচিত, যা ভিডিওতে দেখানো হয়েছে। এতে ডুপ্লিকেট ID হওয়ার ভয় থাকে না।

  • পরামর্শ: আপনি চাইলে আরও দুটি ফিচার যোগ করতে পারেন—Update (পুরানো প্রশ্ন ঠিক করা) এবং Delete (ভুল প্রশ্ন মুছে ফেলা)। স্প্রিং বুটে এগুলো করাও প্রায় একই রকম সহজ।

পরবর্তী পদক্ষেপ: আগামী পর্বে 'Exception Handling' বা ত্রুটি মোকাবিলা করার উপায় নিয়ে কাজ করা হবে, যা একটি প্রফেশনাল অ্যাপের জন্য খুবই জরুরি।

[

Quiz App Using Spring Boot #3 | Microservices Tutorial

Telusko · 42K views

](http://www.youtube.com/watch?v=aoAdMc7-XBQ)

মন্তব্যসমূহ

এই ব্লগটি থেকে জনপ্রিয় পোস্টগুলি

সিজ্জিন (Sijjin) vs ইল্লিয়িন (Illiyin) পার্থক্য Difference

Sijjin (سِجِّين) এবং Illiyin (عِلِّيِّين) —এ দুটি শব্দ কুরআনে এসেছে এবং দুটোই মানুষের আমলনামা সংরক্ষণ সম্পর্কিত স্থানকে নির্দেশ করে। ১. সিজ্জিন (Sijjin) সিজ্জিন হলো পাপীদের (কাফের, মুনাফিক ও দুরাচারীদের) আমলনামা সংরক্ষণের স্থান। এটি সাত তলদেশের নীচে এক কারাগার বা অন্ধকার জগতে অবস্থিত বলে উল্লেখ রয়েছে। সূরা আল-মুতাফফিফীন (৮৩:৭-৯) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْفُجَّارِ لَفِي سِجِّينٍ ۝ وَمَا أَدْرَاكَ مَا سِجِّينٌ ۝ كِتَابٌ مَرْقُومٌ" অর্থ: "না, পাপীদের আমলনামা সিজ্জিনে সংরক্ষিত। তুমি কি জানো, সিজ্জিন কী? এটি এক লিখিত দলিল।" সিজ্জিনকে একটি কারাগার, সংকীর্ণ স্থান, বা নিচের স্তরে অবস্থিত এক অন্ধকার দুনিয়া হিসেবে ব্যাখ্যা করা হয়। ২. ইল্লিয়িন (Illiyin) ইল্লিয়িন হলো সৎকর্মশীলদের (মুমিন ও নেককারদের) আমলনামা সংরক্ষণের স্থান । এটি সপ্তম আসমানের ওপরে সংরক্ষিত এক সম্মানিত স্থান। সূরা আল-মুতাফফিফীন (৮৩:১৮-২১) তে বলা হয়েছে: "كَلَّا إِنَّ كِتَابَ الْأَبْرَارِ لَفِي عِلِّيِّينَ ۝ وَمَا أَدْرَاكَ مَا عِلِّيُّونَ ۝ كِتَابٌ مَرْقُومٌ ۝ يَش...

জাভা ফিডব্যাক এবং স্ট্রাকচার্ড কনকারেন্সি: বিবর্তনের গল্প

Introduction এই ভিডিওর নির্দিষ্ট অংশে জাভা ল্যাঙ্গুয়েজ আর্কিটেক্ট ব্রায়ান গোয়েটজ (Brian Goetz) আলোচনা করেছেন কীভাবে জাভার নতুন ফিচারগুলো তৈরি হয় এবং এতে সাধারণ ডেভেলপারদের মতামতের গুরুত্ব কতটুকু। বিশেষ করে Structured Concurrency -এর মতো জটিল ফিচারগুলো কেন বারবার 'Preview' অবস্থায় থাকে এবং কীভাবে কমিউনিটির ফিডব্যাক সেই ফিচারগুলোকে আরও নিখুঁত করতে সাহায্য করে, তা এখানে সহজভাবে বোঝানো হয়েছে। ১. ভালো ফিডব্যাক আসলে কী? ভিডিও রেফারেন্স: [ 34:53 ] ব্রায়ান গোয়েটজ বলছেন যে, জাভা টিম যখন কোনো নতুন ফিচারের খসড়া (Draft) বা প্রস্তাব (JEP) প্রকাশ করে, তখন তারা এমন কিছু জানতে চায় যা তারা নিজেরা আগে ভাবেনি। বিস্তারিত: একজন ডেভেলপার হিসেবে আমরা যখন কোনো নতুন ফিচার দেখি, আমাদের প্রথম প্রতিক্রিয়া হয় সেটার Syntax বা লেখার ধরন নিয়ে। কিন্তু ব্রায়ানের মতে, "এই লেখাটা কেন এমন হলো?" বা "এটা কোটলিন বা স্কালা-র মতো কেন নয়?"—এই ধরনের ফিডব্যাক খুব একটা কাজে আসে না। আসল দামী ফিডব্যাক হলো সেইটা, যা নতুন কোনো বাস্তব সমস্যা (Edge Case) তুলে ধরে। আমার চিন্তা: আপনি যদি কেবল দ...

Microservice Error Handling

একদম ঠিক বলেছেন ভাই 💯 — তুমি এখন microservice design-এর আসল beauty ধরেছো 👏 ✅ হ্যাঁ — যদি প্রতিটা service independent হয় (loosely coupled architecture), তাহলে একটা service fail করলে আরেকটা fail করবে না (at least directly না)। তবে, এখানে একটু গভীর বিষয় আছে — “independent” মানে কি logical independence, নাকি runtime independence?” এইটা বোঝা খুব জরুরি। চলো ধাপে ধাপে পরিষ্কারভাবে দেখি 👇 ⚙️ ১️⃣ Microservice Independence মানে কী? একটা system এ একাধিক service থাকে, যেমন: 🧾 Order Service 💳 Payment Service 🚚 Delivery Service ✉️ Notification Service 🔹 Logical Independence: প্রতিটা service এর নিজের data, business logic, আর deploy pipeline আলাদা। 📌 উদাহরণ: Payment service down থাকলেও Order service order create করতে পারবে (pending state এ রাখবে)। Delivery service নিজের data manage করবে, Payment এর DB access করবে না। 👉 মানে “tight coupling” নেই — service গুলা নিজের domain handle করে। 🔹 Runtime Independence: প্রতিটা service run হয় আলাদা instance/container এ। তাদের মধ্যে ...