Introduction
এই কন্টেন্টটি মূলত একটি Quiz Application তৈরির সিরিজ টিউটোরিয়ালের অংশ। এখানে শেখানো হয়েছে কীভাবে ডেটাবেস থেকে একটি নির্দিষ্ট কুইজের প্রশ্নগুলো খুঁজে বের করে (fetch) ব্যবহারকারীর সামনে উপস্থাপন করা যায়। বিশেষ করে সিকিউরিটি বা নিরাপত্তার কথা মাথায় রেখে, কীভাবে সঠিক উত্তর (Right Answer) লুকিয়ে রেখে শুধু প্রশ্ন এবং অপশনগুলো ইউজারকে পাঠানো হয়, তা এখানে বিস্তারিত দেখানো হয়েছে।
কুইজ ডেটা ফেচ করার প্রক্রিয়া (Fetching Quiz Data)
আগের পর্বে কুইজ তৈরি করা হয়েছিল, এবার সেই কুইজটিকে আইডি (ID) দিয়ে খুঁজে বের করার পালা।
রেফারেন্স: [00:00]
বিস্তারিত আলোচনা: যখন আমরা একটি কুইজ তৈরি করি, তখন সেটি ডেটাবেসের quiz এবং quiz_questions টেবিলে জমা হয়। এখন একজন ইউজার যখন কোনো কুইজে অংশ নিতে চাইবে, তখন আমাদের এমন একটি সিস্টেম দরকার যা ওই কুইজের আইডি অনুযায়ী সব প্রশ্ন তুলে আনবে।
সহজ ভাষায় ব্যাখ্যা: মনে করুন, একটি লাইব্রেরিতে অনেকগুলো বইয়ের তাক আছে। প্রতিটি তাকের একটি নম্বর (ID) আছে। আপনি যখন লাইব্রেরিয়ানকে বলবেন "আমাকে ২ নম্বর তাকের বইগুলো দাও", তখন তিনি আপনাকে শুধু ওই তাকের বইগুলোই দেবেন। এখানে কোডিংয়ের মাধ্যমে আমরা ঠিক এই কাজটিই করছি।
কন্ট্রোলার সেটআপ এবং পাথ ভেরিয়েবল (Controller & Path Variable)
ইউজার যখন কোনো রিকোয়েস্ট পাঠাবে, সেটি হ্যান্ডেল করার জন্য কন্ট্রোলারে একটি মেথড তৈরি করতে হয়।
রেফারেন্স: [01:22]
কোড স্নিপেট:
Java
@GetMapping("get/{id}")
public ResponseEntity<List<QuestionWrapper>> getQuizQuestions(@PathVariable Integer id) {
return quizService.getQuizQuestions(id);
}
ব্যাখ্যা:
-
@GetMapping("get/{id}"): এটি একটি নির্দিষ্ট ইউআরএল (URL) তৈরি করে।{id}অংশটি পরিবর্তনশীল, অর্থাৎ ইউজার এখানে ১, ২ বা ৩ যেকোনো নম্বর দিতে পারে। -
@PathVariable: ইউআরএল থেকে ওই আইডি নম্বরটি সংগ্রহ করে কোডের ভেতরে ব্যবহার করার জন্য এটি লাগে। -
ResponseEntity: এটি ব্যবহার করা হয় যাতে আমরা রেজাল্টের সাথে সাথে এইচটিটিপি স্ট্যাটাস (যেমন: OK বা 404) পাঠাতে পারি।
কোয়েশ্চেন র্যাপার: নিরাপত্তার জন্য বিশেষ ক্লাস (Question Wrapper for Security)
ডেটাবেসে প্রশ্নের সাথে সঠিক উত্তরও থাকে। কিন্তু ইউজারকে যদি প্রশ্ন পাঠানোর সময় উত্তরও পাঠিয়ে দেওয়া হয়, তবে সে সহজেই চিটিং করতে পারবে। এটি ঠেকানোর জন্য QuestionWrapper ব্যবহার করা হয়।
রেফারেন্স: [03:19]
বিস্তারিত: আমাদের মেইন Question ক্লাসে আইডি, টাইটেল, অপশন এবং সঠিক উত্তর থাকে। আমরা একটি নতুন ক্লাস তৈরি করি যার নাম QuestionWrapper। এখানে শুধু আইডি, টাইটেল এবং চারটি অপশন থাকবে, কিন্তু কোনো উত্তর (Right Answer) থাকবে না।
সহজ উদাহরণ: পরীক্ষার হলের প্রশ্নপত্রের মতো। প্রশ্নপত্রে প্রশ্ন থাকে কিন্তু উত্তর থাকে না। আমরা সার্ভার থেকে ইউজারকে শুধু এই 'প্রশ্নপত্র' (Wrapper) পাঠাব।
সার্ভিস লেয়ার এবং লজিক (Service Layer Logic)
এখানেই আসল কাজটা হয়—ডেটাবেস থেকে ডেটা আনা এবং সেটিকে র্যাপারে কনভার্ট করা।
রেফারেন্স: [05:06]
কোড স্নিপেট:
Java
public ResponseEntity<List<QuestionWrapper>> getQuizQuestions(Integer id) {
Optional<Quiz> quiz = quizDao.findById(id);
List<Question> questionsFromDB = quiz.get().getQuestions();
List<QuestionWrapper> questionsForUser = new ArrayList<>();
for(Question q : questionsFromDB) {
QuestionWrapper qw = new QuestionWrapper(q.getId(), q.getQuestionTitle(), q.getOption1(), q.getOption2(), q.getOption3(), q.getOption4());
questionsForUser.add(qw);
}
return new ResponseEntity<>(questionsForUser, HttpStatus.OK);
}
ব্যাখ্যা: ১. OptionalOptional ব্যবহার করা হয়েছে। ২. For Loop: ডেটাবেস থেকে আসা প্রতিটি আসল প্রশ্ন থেকে শুধু প্রয়োজনীয় অংশগুলো (আইডি, টাইটেল, অপশন) নিয়ে নতুন একটি QuestionWrapper লিস্টে রাখা হচ্ছে। ৩. শেষে এই নিরাপদ লিস্টটি ইউজারের কাছে পাঠিয়ে দেওয়া হচ্ছে।
কঠিন শব্দের সহজ ব্যাখ্যা:
-
DAO (Data Access Object): এটি এমন একটি টুল যা কোডকে ডেটাবেসের সাথে কথা বলতে সাহায্য করে।
-
Loop: কোনো কাজ বারবার করার পদ্ধতি। এখানে প্রতিটি প্রশ্নের জন্য একই কাজ বারবার করা হচ্ছে।
বিশ্লেষণ ও আমার মতামত (Analysis & Perception)
সৃষ্টিকর্তা যা বোঝাতে চেয়েছেন: ভিডিওর মূল উদ্দেশ্য ছিল মাইক্রোসার্ভিস আর্কিটেকচারে ডেটা সিকিউরিটি বজায় রাখা। সরাসরি ডেটাবেস মডেল ইউজারকে না পাঠিয়ে একটি 'র্যাপার' বা 'DTO' (Data Transfer Object) পাঠানো কেন জরুরি, তা এখানে স্পষ্টভাবে ফুটে উঠেছে।
বাস্তবতা ও সম্ভাবনা: বর্তমানে বড় বড় সব কুইজ বা এক্সাম অ্যাপ (যেমন: GRE, IELTS অনলাইন পোর্টাল) এই পদ্ধতি অনুসরণ করে। এতে হ্যাকাররা চাইলেও নেটওয়ার্ক ট্রাফিক থেকে উত্তর চুরি করতে পারে না।
উন্নত বিকল্প বা পরামর্শ:
-
Stream API: এখানে ডেটা কনভার্ট করার জন্য সাধারণ
for loopএর বদলে জাভা ৮-এরStream APIব্যবহার করলে কোড আরও ছোট এবং আধুনিক হতো। -
Exception Handling: যদি ডেটাবেসে ওই আইডির কোনো কুইজ না থাকে, তবে সরাসরি
get()ব্যবহার না করে একটি সুন্দর এরর মেসেজ দেখানো ভালো।
পরবর্তী পদক্ষেপ: এর পরের ধাপে ইউজার যখন উত্তর সাবমিট করবে, তখন কীভাবে সেই উত্তরগুলো সার্ভারে চেক করে রেজাল্ট বা স্কোর তৈরি করা যায়, তা নিয়ে কাজ করা উচিত।
[
Quiz App Using Spring Boot #7 | Microservices Tutorial
Telusko · 28K views
](http://www.youtube.com/watch?v=OTqNjZGaJgc)

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