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

স্প্রিং বুট ব্যবহার করে কুইজ অ্যাপের রেজাল্ট ক্যালকুলেশন

কুইজ অ্যাপ্লিকেশন তৈরির এই পর্যায়ে আমরা শিখব কীভাবে একজন ইউজার বা ক্লায়েন্ট যখন তার উত্তরগুলো সাবমিট (Submit) করবে, তখন সার্ভার সাইডে সেই উত্তরগুলো যাচাই করে স্কোর বা ফলাফল বের করতে হয়। এটি একটি কুইজ সিস্টেমের অন্যতম গুরুত্বপূর্ণ অংশ।

প্রজেক্ট রেফারেন্স

এই টিউটোরিয়ালটি Telusko চ্যানেলের "Quiz App Using Spring Boot #8 | Microservices Tutorial" ভিডিওর ওপর ভিত্তি করে তৈরি। ভিডিও লিঙ্ক


১. ইউজার রেসপন্স এবং ডেটা ফরম্যাট (User Response & Data Format)

প্রথমে আমাদের বুঝতে হবে ক্লায়েন্ট (যেমন: মোবাইল অ্যাপ বা ওয়েবসাইট) সার্ভারে কী পাঠাবে। ক্লায়েন্ট সাধারণত প্রতিটি প্রশ্নের ID এবং ইউজারের দেওয়া উত্তর (Response) পাঠায়।

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

  • Client: যে অ্যাপ ব্যবহার করছে।

  • JSON: এটি ডেটা আদান-প্রদান করার একটি সহজ ফরম্যাট। যেমন: { "id": 18, "response": "Java" }।


২. রেসপন্স মডেল তৈরি (Creating Response Model)

ইউজারের পাঠানো ডেটা গ্রহণ করার জন্য জাভাতে একটি ক্লাস তৈরি করতে হবে। একে আমরা বলছি Response ক্লাস।

কোড স্নপেট:

Java

@Data
@RequiredArgsConstructor
public class Response {
    private Integer id;
    private String response;
} 

ব্যাখ্যা: এখানে @Data অ্যানোটেশন ব্যবহার করা হয়েছে যাতে আমাদের কষ্ট করে Getter/Setter লিখতে না হয়। এই ক্লাসে দুটি ফিল্ড আছে: প্রশ্নের আইডি (id) এবং ইউজারের দেওয়া উত্তর (response)।


৩. কন্ট্রোলার তৈরি (Controller Implementation)

সার্ভারে ডেটা পাঠানোর জন্য একটি এন্ডপয়েন্ট (Endpoint) দরকার। এখানে আমরা @PostMapping ব্যবহার করব।

কোড স্নপেট:

Java

@PostMapping("submit/{id}")
public ResponseEntity<Integer> submitQuiz(@PathVariable Integer id, @RequestBody List<Response> responses) {
    return quizService.calculateResult(id, responses);
} 

ব্যাখ্যা:

  • @PostMapping: যখন আমরা সার্ভারে কোনো ডেটা পাঠাই বা জমা দেই।

  • @PathVariable: ইউআরএল থেকে কুইজ আইডি নেওয়ার জন্য।

  • @RequestBody: ক্লায়েন্ট যে উত্তরগুলোর লিস্ট পাঠাচ্ছে তা ধরার জন্য।


৪. সার্ভিস লেয়ার এবং লজিক (Service Layer & Logic)

আসল হিসাব-নিকাশ এখানেই হয়। ডাটাবেস থেকে সঠিক উত্তরগুলো এনে ইউজারের উত্তরের সাথে মেলানো হয়।

কঠিন শব্দ ও সহজ মানে:

  • Iterate (ইটারেট): একটি লিস্টের প্রতিটি আইটেম একে একে চেক করা। অনেকটা লাইনে দাঁড়িয়ে সবার রোল নাম্বার চেক করার মতো।

  • Database (ডাটাবেস): যেখানে সব তথ্য স্থায়ীভাবে জমা থাকে।

লজিক কোড:

Java

public ResponseEntity<Integer> calculateResult(Integer id, List<Response> responses) {
    Quiz quiz = quizDao.findById(id).get();
    List<Question> questions = quiz.getQuestions();
    int right = 0;
    int i = 0;
    for(Response response : responses) {
        if(response.getResponse().equals(questions.get(i).getRightAnswer()))
            right++;
        i++;
    }
    return new ResponseEntity<>(right, HttpStatus.OK);
} 

আমার ভাবনা: এখানে একটি লুপ চালানো হয়েছে। প্রতিবার দেখা হচ্ছে ইউজারের দেওয়া উত্তর এবং ডাটাবেসের RightAnswer এক কি না। যদি মিলে যায়, তবে right ভেরিয়েবল ১ করে বাড়ছে। শেষে এই right সংখ্যাটিই হলো ইউজারের স্কোর।


৫. এনালাইসিস এবং বাস্তবসম্মত ধারণা (Analysis & Real-world Perception)

সৃষ্টিকর্তার উদ্দেশ্য: ভিডিও নির্মাতা এখানে দেখিয়েছেন কীভাবে একটি মোনোলিথিক (Monolithic) অ্যাপ্লিকেশনে লজিক কাজ করে। মোনোলিথিক মানে হলো পুরো সফটওয়্যারটি একটি বড় প্রজেক্টের মধ্যে থাকা।

বাস্তবতা ও সম্ভাবনা: ১. নিরাপত্তা: ভিডিওতে সরাসরি উত্তর মেলানো হয়েছে। বাস্তবে অপশন নম্বর (A, B, C, D) ব্যবহার করা ভালো, তবে অপশন র‍্যান্ডমাইজ (Randomize) করলে আবার সমস্যা হতে পারে। ২. মাইক্রোসার্ভিস (Microservices): এটি একটি ছোট অংশ। ভবিষ্যতে যখন কুইজ সার্ভিস এবং কোয়েশ্চেন সার্ভিস আলাদা করা হবে, তখন এই লজিকটি আরও উন্নত হবে। ৩. বিকল্প পদ্ধতি: লুপ চালানোর সময় ইনডেক্স (i++) ব্যবহার না করে সরাসরি আইডি দিয়ে ম্যাপ (Map) ব্যবহার করলে পারফরম্যান্স আরও ভালো হতো, কারণ এতে উত্তরের ক্রম ভুল হওয়ার ভয় থাকে না।

পরামর্শ: আপনি যদি বিগিনার হন, তবে প্রথমে এই সাধারণ লজিকটি আয়ত্ত করুন। এরপর শিখুন কীভাবে ডাটাবেস কোয়েরি অপ্টিমাইজ করা যায় যাতে বড় কুইজের ক্ষেত্রেও অ্যাপটি দ্রুত কাজ করে। [13:31] এ যেমন বলা হয়েছে, এটি একটি মোনোলিথিক সিস্টেম, যা পরবর্তীতে মাইক্রোসার্ভিসে রূপান্তর করা শিখতে হবে।

[

Quiz App Using Spring Boot #8 | Microservices Tutorial

Telusko · 31K views

](http://www.youtube.com/watch?v=mcxXxrTAIiw)

মন্তব্যসমূহ

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

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

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

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

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

ইমেজ ক্লাসিফিকেশন মডেল তৈরি ও প্রশিক্ষণ

ভূমিকা এই ভিডিওটিতে আমরা দেখবো কিভাবে একটি ইমেজ ক্লাসিফিকেশন মডেলকে প্রশিক্ষণ (Train) দিতে হয়। সহজ কথায়, আমাদের কাছে থাকা ছবিগুলো থেকে কম্পিউটারকে শেখানো যে, কোন ছবিটিতে কোন ব্যক্তি আছেন। এখানে আমরা ডাটাগুলোকে প্রসেস করা, মডেল নির্বাচন, এবং মডেলটি কতটা নির্ভুলভাবে কাজ করছে তা যাচাই করার প্রক্রিয়া শিখবো। ডাটা প্রিপারেশন বা প্রস্তুতি রেফারেন্স: [ 00:00 ] থেকে [ 01:03 ] মডেলকে প্রশিক্ষণ দেওয়ার আগে ডাটা ঠিকঠাক করা খুব জরুরি। ভিডিওতে দেখানো হয়েছে কিভাবে ছবিগুলো থেকে একটি ডিকশনারি বা তালিকার মতো স্ট্রাকচার তৈরি করা হয়েছে। সহজ ব্যাখ্যা: এখানে ইমেজগুলোকে সংখ্যায় রূপান্তর করা হয়েছে। কম্পিউটার সরাসরি ছবি বোঝে না, তাই সেগুলোকে ছোট ছোট ডাটা পয়েন্টের (Array) তালিকা হিসেবে সাজানো হয়েছে। যাতে মডেল বুঝতে পারে একটি ছবিতে কী কী বৈশিষ্ট্য আছে। মডেল নির্বাচন ও প্রশিক্ষণ (SVM) রেফারেন্স: [ 01:03 ] থেকে [ 04:43 ] এখানে Support Vector Machine (SVM) নামক একটি অ্যালগরিদম ব্যবহার করা হয়েছে। এটি সাধারণত ক্লাসিফিকেশনের কাজে খুব ভালো ফলাফল দেয়। পাইপলাইন (Pipeline): ডাটাকে স্কেল (Scale) করার জন্...