১. সংক্ষিপ্ত বিবরণ
গুগল ক্লাউড ডেটাস্টোর হলো একটি NoSQL ডকুমেন্ট ডেটাবেস, যা স্বয়ংক্রিয় স্কেলিং, উচ্চ কর্মক্ষমতা এবং অ্যাপ্লিকেশন তৈরির সুবিধার জন্য নির্মিত।
আপনি যা শিখবেন
- Spring Boot-এ Java অবজেক্ট সংরক্ষণ ও পুনরুদ্ধার করতে Cloud Datastore কীভাবে ব্যবহার করবেন
আপনার যা যা লাগবে
- একটি গুগল ক্লাউড প্ল্যাটফর্ম প্রকল্প
- একটি ব্রাউজার, যেমন ক্রোম বা ফায়ারফক্স
আপনি এই টিউটোরিয়ালটি কীভাবে ব্যবহার করবেন?
গুগল ক্লাউড প্ল্যাটফর্ম পরিষেবা ব্যবহারের অভিজ্ঞতাকে আপনি কীভাবে মূল্যায়ন করবেন?
২. সেটআপ এবং প্রয়োজনীয়তা
স্ব-গতিতে পরিবেশ সেটআপ
- Google Cloud Console- এ সাইন-ইন করুন এবং একটি নতুন প্রজেক্ট তৈরি করুন অথবা বিদ্যমান কোনো প্রজেক্ট পুনরায় ব্যবহার করুন। যদি আপনার আগে থেকে Gmail বা Google Workspace অ্যাকাউন্ট না থাকে, তবে আপনাকে অবশ্যই একটি তৈরি করতে হবে।



- প্রজেক্টের নামটি হলো এই প্রজেক্টের অংশগ্রহণকারীদের প্রদর্শিত নাম। এটি একটি ক্যারেক্টার স্ট্রিং যা গুগল এপিআই ব্যবহার করে না। আপনি যেকোনো সময় এটি আপডেট করতে পারেন।
- প্রজেক্ট আইডি সমস্ত গুগল ক্লাউড প্রজেক্ট জুড়ে অনন্য এবং অপরিবর্তনীয় (একবার সেট করার পর এটি পরিবর্তন করা যায় না)। ক্লাউড কনসোল স্বয়ংক্রিয়ভাবে একটি অনন্য স্ট্রিং তৈরি করে; সাধারণত এটি কী তা নিয়ে আপনার মাথা ঘামানোর দরকার নেই। বেশিরভাগ কোডল্যাবে, আপনাকে আপনার প্রজেক্ট আইডি উল্লেখ করতে হবে (যা সাধারণত
PROJECT_IDহিসাবে চিহ্নিত করা হয়)। তৈরি করা আইডিটি আপনার পছন্দ না হলে, আপনি এলোমেলোভাবে আরেকটি তৈরি করতে পারেন। বিকল্পভাবে, আপনি আপনার নিজের আইডি দিয়ে চেষ্টা করে দেখতে পারেন যে সেটি উপলব্ধ আছে কিনা। এই ধাপের পরে এটি পরিবর্তন করা যাবে না এবং প্রজেক্টের পুরো সময়কাল জুড়ে এটি অপরিবর্তিত থাকবে। - আপনার অবগতির জন্য জানাচ্ছি যে, তৃতীয় একটি ভ্যালু রয়েছে, যা হলো প্রজেক্ট নম্বর , এবং কিছু এপিআই এটি ব্যবহার করে থাকে। ডকুমেন্টেশনে এই তিনটি ভ্যালু সম্পর্কে আরও বিস্তারিত জানুন।
- এরপর, ক্লাউড রিসোর্স/এপিআই ব্যবহার করার জন্য আপনাকে ক্লাউড কনসোলে বিলিং চালু করতে হবে। এই কোডল্যাবটি সম্পন্ন করতে খুব বেশি খরচ হবে না, এমনকি আদৌ কোনো খরচ নাও হতে পারে। এই টিউটোরিয়ালের পর বিলিং এড়াতে রিসোর্সগুলো বন্ধ করার জন্য, আপনি আপনার তৈরি করা রিসোর্সগুলো অথবা প্রজেক্টটি ডিলিট করে দিতে পারেন। নতুন গুগল ক্লাউড ব্যবহারকারীরা ৩০০ মার্কিন ডলারের ফ্রি ট্রায়াল প্রোগ্রামের জন্য যোগ্য।
ক্লাউড শেল সক্রিয় করুন
- ক্লাউড কনসোল থেকে, Activate Cloud Shell-এ ক্লিক করুন।
.

আপনি যদি প্রথমবারের মতো ক্লাউড শেল চালু করেন, তাহলে এটি কী তা বর্ণনা করে একটি মধ্যবর্তী স্ক্রিন আপনার সামনে আসবে। যদি একটি মধ্যবর্তী স্ক্রিন আসে, তাহলে 'চালিয়ে যান' (Continue) এ ক্লিক করুন।

ক্লাউড শেল প্রস্তুত করতে এবং এর সাথে সংযোগ স্থাপন করতে মাত্র কয়েক মুহূর্ত সময় লাগা উচিত।

এই ভার্চুয়াল মেশিনটিতে প্রয়োজনীয় সমস্ত ডেভেলপমেন্ট টুলস লোড করা আছে। এটি একটি স্থায়ী ৫ জিবি হোম ডিরেক্টরি প্রদান করে এবং গুগল ক্লাউডে চলে, যা নেটওয়ার্ক পারফরম্যান্স ও অথেনটিকেশনকে ব্যাপকভাবে উন্নত করে। এই কোডল্যাবে আপনার প্রায় সমস্ত কাজই একটি ব্রাউজার দিয়ে করা সম্ভব।
ক্লাউড শেলে সংযুক্ত হওয়ার পর, আপনি দেখতে পাবেন যে আপনাকে প্রমাণীকৃত করা হয়েছে এবং প্রজেক্টটি আপনার প্রজেক্ট আইডিতে সেট করা আছে।
- আপনি প্রমাণীকৃত কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud auth list
কমান্ড আউটপুট
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
- gcloud কমান্ডটি আপনার প্রজেক্ট সম্পর্কে জানে কিনা তা নিশ্চিত করতে ক্লাউড শেলে নিম্নলিখিত কমান্ডটি চালান:
gcloud config list project
কমান্ড আউটপুট
[core] project = <PROJECT_ID>
যদি তা না থাকে, তবে আপনি এই কমান্ডটি দিয়ে এটি সেট করতে পারেন:
gcloud config set project <PROJECT_ID>
কমান্ড আউটপুট
Updated property [core/project].
৩. ক্লাউড ডেটাস্টোর চালু করুন
GCP কনসোলে , মেনু -> ডেটাস্টোর (স্টোরেজ বিভাগে) যান অথবা এখানে ক্লিক করুন ।
আপনি যদি বর্তমান প্রজেক্টে আগে কখনো ডেটাস্টোর ব্যবহার না করে থাকেন, তাহলে আপনি "একটি ক্লাউড ফায়ারস্টোর মোড নির্বাচন করুন" স্ক্রিনটি দেখতে পাবেন। "ডেটাস্টোর মোড" বিকল্পটি নির্বাচন করুন।

এরপরে, আপনি "আপনার ডেটা কোথায় সংরক্ষণ করবেন তা বেছে নিন" স্ক্রিনটি দেখতে পাবেন। us-east1 বা অন্য কোনো আঞ্চলিক অবস্থান নির্বাচন করুন এবং "ডেটাবেস তৈরি করুন"-এ ক্লিক করুন:

৪. একটি নতুন স্প্রিং বুট জাভা অ্যাপ্লিকেশন বুটস্ট্র্যাপ করুন
CloudShell পরিবেশ থেকে, একটি নতুন Spring Boot অ্যাপ্লিকেশন ইনিশিয়ালাইজ এবং বুটস্ট্র্যাপ করতে নিম্নলিখিত কমান্ডটি ব্যবহার করুন:
$ curl https://start.spring.io/starter.tgz \ -d packaging=war \ -d dependencies=cloud-gcp \ -d type=maven-project \ -d baseDir=datastore-example \ -d bootVersion=3.0.5 | tar -xzvf -
এটি একটি নতুন datastore-example/ ডিরেক্টরি তৈরি করবে, যেখানে একটি নতুন Maven প্রজেক্ট, Maven-এর pom.xml , একটি Maven র্যাপার এবং একটি অ্যাপ্লিকেশন এন্ট্রি পয়েন্ট থাকবে।
আমাদের অ্যাপ্লিকেশনটি ব্যবহারকারীদের কমান্ড প্রবেশ করাতে এবং ফলাফল দেখতে একটি CLI প্রদান করবে। আমরা একটি বইকে উপস্থাপন করার জন্য একটি ক্লাস তৈরি করব এবং তারপর ডেটাস্টোর রিপোজিটরি ব্যবহার করে এটিকে ক্লাউড ডেটাস্টোরে সংরক্ষণ করব।
আমাদের pom.xml এ আরও একটি প্রয়োজনীয় ডিপেন্ডেন্সি যোগ করতে হবে।
ক্লাউড শেল মেনু থেকে 'ওপেন এডিটর'-এ ক্লিক করে ওয়েব কোড এডিটরটি খুলুন।

এডিটর লোড হওয়ার পরে, Google Cloud Datastore Starter এবং Spring Shell Starter ডিপেন্ডেন্সিগুলো যোগ করতে pom.xml ফাইলটি পরিবর্তন করুন:
pom.xml
<project>
...
<dependencies>
...
<!-- Add GCP Datastore Starter -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>spring-cloud-gcp-starter-data-datastore</artifactId>
</dependency>
<!-- Add Spring Shell Starter -->
<dependency>
<groupId>org.springframework.shell</groupId>
<artifactId>spring-shell-starter</artifactId>
<version>3.0.2</version>
</dependency>
</dependencies>
</project>
৫. বই ক্লাস তৈরি করুন
এডিটর ব্যবহার করে নিম্নলিখিত বিষয়বস্তু সহ Book ক্লাসটি তৈরি করুন:
datastore-example/src/main/java/com/example/demo/Book.java
package com.example.demo;
import com.google.cloud.spring.data.datastore.core.mapping.Entity;
import org.springframework.data.annotation.Id;
@Entity(name = "books")
public class Book {
@Id
Long id;
String title;
String author;
int year;
public Book(String title, String author, int year) {
this.title = title;
this.author = author;
this.year = year;
}
public long getId() {
return this.id;
}
@Override
public String toString() {
return "Book{" +
"id=" + this.id +
", title='" + this.title + '\'' +
", author='" + this.author + '\'' +
", year=" + this.year +
'}';
}
}
যেমনটি দেখতে পাচ্ছেন, এটি একটি সাধারণ POJO। ক্লাসটিকে @Entity দিয়ে অ্যানোটেট করা হয়েছে এটা বোঝাতে যে এটিকে ডেটাস্টোরে সংরক্ষণ করা যাবে এবং কাইন্ড নেম প্রদান করতে হবে (কাইন্ডকে SQL ডেটাবেসের একটি টেবিল হিসেবে ভাবুন, আরও বিস্তারিত জানতে ডকুমেন্টেশন দেখুন)। কাইন্ড নেমটি ঐচ্ছিক — যদি এটি বাদ দেওয়া হয়, তাহলে ক্লাসের নামের উপর ভিত্তি করে কাইন্ড নেমটি তৈরি করা হবে।
লক্ষ্য করুন যে আমরা id প্রপার্টিকে @Id দিয়ে টীকাযুক্ত করেছি। এর মানে হলো, আমরা এই ফিল্ডটিকে ডেটাস্টোর কী-এর শনাক্তকারী অংশ হিসেবে ব্যবহার করতে চাই। প্রতিটি ডেটাস্টোর এনটিটির একটি শনাক্তকারী প্রয়োজন। সমর্থিত টাইপগুলো হলো String এবং Long ।
অবজেক্টগুলোর স্ট্রিং রূপকে আরও সহজে পাঠযোগ্য করার জন্য আমরা toString মেথডটি ওভাররাইড করি; এটি প্রিন্ট করার সময় কাজে আসবে।
৬. BookRepository ইন্টারফেস তৈরি করুন
নিম্নলিখিত বিষয়বস্তু দিয়ে BookRepository ক্লাসটি তৈরি করুন:
datastore-example/src/main/java/com/example/demo/BookRepository.java
package com.example.demo;
import java.util.List;
import com.google.cloud.spring.data.datastore.repository.DatastoreRepository;
public interface BookRepository extends DatastoreRepository<Book, Long> {
List<Book> findByAuthor(String author);
List<Book> findByYearGreaterThan(int year);
List<Book> findByAuthorAndYear(String author, int year);
}
ইন্টারফেসটি DatastoreRepository<Book, Long> কে এক্সটেন্ড করে, যেখানে Book হলো ডোমেইন ক্লাস এবং Long হলো Id টাইপ। আমরা আমাদের রিপোজিটরিতে তিনটি কোয়েরি মেথড ডিক্লেয়ার করি, যেগুলোর ইমপ্লিমেন্টেশন নেপথ্যে স্বয়ংক্রিয়ভাবে তৈরি হয়ে যায়।
প্রথমটি হলো findByAuthor । যেমনটা আপনি অনুমান করতে পারছেন, এই মেথডটির বাস্তবায়ন এমন একটি কোয়েরি চালাবে যা author ফিল্ডের সাথে সমতা যাচাই করার জন্য কন্ডিশন ফিল্টারে ব্যবহারকারীর দেওয়া একটি ভ্যালু ব্যবহার করবে।
findByYearGreaterThan মেথডটি এমন একটি কোয়েরি চালায় যা ব্যবহারকারীর দেওয়া মানের চেয়ে বড় বছরগুলোকে ফিল্টার করে।
findByAuthorAndYear এমন একটি কোয়েরি চালায় যা সেইসব এনটিটি খুঁজে বের করে, যেখানে author এবং year ফিল্ড ব্যবহারকারীর দেওয়া মানের সাথে মেলে।
৭. ইন্টারেক্টিভ CLI অ্যাপ্লিকেশনটি তৈরি করুন।
মূল অ্যাপ্লিকেশন DemoApplication ক্লাসটি খুলুন এবং এটিকে এইরকম দেখতে পরিবর্তন করুন:
datastore-example/src/main/java/com/example/demo/DemoApplication.java
package com.example.demo;
import java.util.List;
import com.google.common.collect.Lists;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.shell.standard.ShellComponent;
import org.springframework.shell.standard.ShellMethod;
@ShellComponent
@SpringBootApplication
public class DemoApplication {
@Autowired
BookRepository bookRepository;
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@ShellMethod("Saves a book to Cloud Datastore: save-book <title> <author> <year>")
public String saveBook(String title, String author, int year) {
Book savedBook = this.bookRepository.save(new Book(title, author, year));
return savedBook.toString();
}
@ShellMethod("Loads all books")
public String findAllBooks() {
Iterable<Book> books = this.bookRepository.findAll();
return Lists.newArrayList(books).toString();
}
@ShellMethod("Loads books by author: find-by-author <author>")
public String findByAuthor(String author) {
List<Book> books = this.bookRepository.findByAuthor(author);
return books.toString();
}
@ShellMethod("Loads books published after a given year: find-by-year-after <year>")
public String findByYearAfter(int year) {
List<Book> books = this.bookRepository.findByYearGreaterThan(year);
return books.toString();
}
@ShellMethod("Loads books by author and year: find-by-author-year <author> <year>")
public String findByAuthorYear(String author, int year) {
List<Book> books = this.bookRepository.findByAuthorAndYear(author, year);
return books.toString();
}
@ShellMethod("Removes all books")
public void removeAllBooks() {
this.bookRepository.deleteAll();
}
}
লক্ষ্য করুন, আমরা কীভাবে ক্লাসটিকে @ShellComponent দিয়ে অ্যানোটেট করেছি। এটি Spring-কে জানিয়ে দেয় যে আমরা এই ক্লাসটিকে CLI কমান্ডের উৎস হিসেবে ব্যবহার করতে চাই। @ShellMethod দিয়ে অ্যানোটেট করা মেথডগুলো আমাদের অ্যাপ্লিকেশনে CLI কমান্ড হিসেবে উন্মুক্ত করা হবে।
এখানে আমরা BookRepository ইন্টারফেসে ঘোষিত মেথডগুলো ব্যবহার করি: findByAuthor , findByYearGreaterThan , findByAuthorAndYear । এছাড়াও আমরা তিনটি বিল্ট-ইন মেথড ব্যবহার করি: save , findAll এবং deleteAll ।
চলুন saveBook মেথডটি দেখি। আমরা title, author এবং year-এর জন্য ব্যবহারকারীর দেওয়া মান ব্যবহার করে একটি Book অবজেক্ট তৈরি করি। যেমনটা দেখতে পাচ্ছেন, আমরা কোনো id ভ্যালু দিই না, তাই সেভ করার সময় এটি স্বয়ংক্রিয়ভাবে id ফিল্ডে বরাদ্দ এবং নির্ধারিত হয়ে যাবে। save মেথডটি Book টাইপের একটি অবজেক্ট গ্রহণ করে এবং সেটিকে ক্লাউড ডেটাস্টোরে সেভ করে। এটি id ফিল্ডসহ সমস্ত ফিল্ড পূরণ করা একটি Book অবজেক্ট রিটার্ন করে। সবশেষে আমরা এই অবজেক্টটির একটি স্ট্রিং রিপ্রেজেন্টেশন রিটার্ন করি।
বাকি পদ্ধতিগুলোও একইভাবে কাজ করে: এগুলো উপযুক্ত রিপোজিটরি পদ্ধতিগুলোতে পাস করা প্যারামিটার গ্রহণ করে এবং ফলাফলকে স্ট্রিং-এ রূপান্তর করে ফেরত দেয়।
৮. অ্যাপ্লিকেশনটি চালান।
অ্যাপ্লিকেশনটি বিল্ড ও চালু করতে, প্রথমে নিশ্চিত করুন যে JAVA_HOME সঠিক ভার্সনে সেট করা আছে:
$ export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
ক্লাউড শেলে এই কমান্ডটি চালান (প্রজেক্ট datastore-example/ এর রুট থেকে, যেখানে pom.xml ফাইলটি অবস্থিত):
$ ./mvnw spring-boot:run export JAVA_HOME=/usr/lib/jvm/java-1.17.0-openjdk-amd64
বিল্ড পর্যায় সফল হওয়ার পর, স্প্রিং লোগোটি দেখা যাবে এবং শেল প্রম্পট প্রদর্শিত হবে:
. ____ _ __ _ _ /\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \ ( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \ \\/ ___)| |_)| | | | | || (_| | ) ) ) ) ' |____| .__|_| |_|_| |_\__, | / / / / =========|_|==============|___/=/_/_/_/ :: Spring Boot :: (v3.0.5) shell:>
এখন আপনি পূর্বে সংজ্ঞায়িত কমান্ডগুলো নিয়ে পরীক্ষা করতে পারেন। কমান্ডের তালিকা দেখতে, help কমান্ডটি ব্যবহার করুন:
shell:> help ... find-all-books: Loads all books find-by-author: Loads books by author: find-by-author <author> find-by-author-year: Loads books by author and year: find-by-author-year <author> <year> find-by-year-after: Loads books published after a given year: find-by-year-after <year> remove-all-books: Removes all books save-book: Saves a book to Cloud Datastore: save-book <title> <author> <year>
নিম্নলিখিতগুলি চেষ্টা করুন:
-
save-bookকমান্ড ব্যবহার করে কয়েকটি বই তৈরি করুন। -
find-all-booksকমান্ড ব্যবহার করে একটি অনুসন্ধান চালান। - নির্দিষ্ট লেখকের বই খুঁজুন:
find-by-author <author> - নির্দিষ্ট বছরের পরে প্রকাশিত বই খুঁজুন:
find-by-year-after <year> - নির্দিষ্ট লেখক ও বছর অনুযায়ী বই খুঁজুন:
find-by-author-year <author> <year>
৯. ওয়েব ইন্টারফেস ব্যবহার করে ডেটাস্টোরে কী সংরক্ষিত আছে তা দেখুন।
ক্লাউড ডেটাস্টোরে এনটিটিগুলো কীভাবে সংরক্ষিত আছে তা দেখতে, জিসিপি কনসোলে যান। প্রয়োজনে, কাইন্ড ফিল্ডে 'books' ইনপুট করুন।

১০. পরিষ্কার করুন
পরিষ্কার করার জন্য, অ্যাপ্লিকেশন শেল থেকে remove-all-books নামের কমান্ডটি ব্যবহার করে সমস্ত বই মুছে ফেলুন।
shell:> remove-all-books
অ্যাপ্লিকেশনটি থেকে বের হতে quit কমান্ড ব্যবহার করুন, তারপর Ctrl+C ।
১১. অভিনন্দন!
এই কোডল্যাবে, আপনি একটি ইন্টারেক্টিভ CLI অ্যাপ্লিকেশন তৈরি করেছেন যা ক্লাউড ডেটাস্টোর থেকে অবজেক্ট সংরক্ষণ এবং পুনরুদ্ধার করতে পারে!
আরও জানুন
- ক্লাউড ডেটাস্টোর: https://cloud.google.com/datastore/
- স্প্রিং শেল: https://projects.spring.io/spring-shell/
- GCP-তে Spring প্রজেক্ট: https://spring.io/projects/spring-cloud-gcp
- GCP-তে Spring গিটহাব রিপোজিটরি: https://github.com/GoogleCloudPlatform/spring-cloud-gcp
- গুগল ক্লাউড প্ল্যাটফর্মে জাভা: https://cloud.google.com/java/
লাইসেন্স
এই কাজটি ক্রিয়েটিভ কমন্স অ্যাট্রিবিউশন ২.০ জেনেরিক লাইসেন্সের অধীনে রয়েছে।