TypeORM এবং Design Patterns
TypeORM হল একটি শক্তিশালী ORM (Object-Relational Mapping) লাইব্রেরি যা TypeScript এবং JavaScript দিয়ে ডেটাবেস ম্যানেজমেন্ট এবং মডেলিং সহজ করে তোলে। যখন আপনি একটি Large Scale Application (বিশাল আকারের অ্যাপ্লিকেশন) তৈরি করেন, তখন কোডের স্কেল, পরিচালনাযোগ্যতা, এবং রক্ষণাবেক্ষণ অত্যন্ত গুরুত্বপূর্ণ হয়ে ওঠে। এই ধরনের অ্যাপ্লিকেশন তৈরি করার সময় Design Patterns ব্যবহার করলে আপনার কোড আরও পরিষ্কার, রিডেবল এবং টেকসই হয়। Design Patterns এমন পদ্ধতি বা রুলস যা কোডের পুনঃব্যবহারযোগ্যতা এবং প্রজেক্টের স্কেলেবলিটি বাড়ায়।
TypeORM এর সাথে Large Scale অ্যাপ্লিকেশন তৈরি করার সময় বিভিন্ন Design Patterns ব্যবহার করা হয়, যাতে কোড আরও মডুলার, রক্ষণাবেক্ষণযোগ্য এবং উন্নত হয়।
Design Patterns Types
TypeORM ব্যবহার করে Large Scale অ্যাপ্লিকেশন তৈরি করার সময় কিছু গুরুত্বপূর্ণ Design Patterns রয়েছে, যেমন:
- Repository Pattern
- Service Layer Pattern
- Singleton Pattern
- Factory Pattern
- Decorator Pattern
- Observer Pattern
এখানে প্রতিটি প্যাটার্ন কীভাবে কাজ করে এবং TypeORM অ্যাপ্লিকেশনে কিভাবে প্রয়োগ করা যায় তা আলোচনা করা হবে।
১. Repository Pattern
Repository Pattern ডেটাবেসে ডেটা অ্যাক্সেসের জন্য একটি বিশেষ অবজেক্ট বা ক্লাস তৈরি করার কৌশল। এটি ডেটাবেস অপারেশনগুলিকে অ্যাপ্লিকেশন লজিক থেকে আলাদা করে এবং কোডকে পরিষ্কার ও রক্ষণাবেক্ষণযোগ্য করে তোলে।
TypeORM-এ Repository Pattern ব্যবহারের মাধ্যমে আপনি ডেটাবেসের সাথে সম্পর্কিত সমস্ত অপারেশন একটি নির্দিষ্ট ক্লাসে রাখেন। এতে কোডে উন্নত বিচ্ছিন্নতা (separation of concerns) পাওয়া যায়।
উদাহরণ:
import { EntityRepository, Repository } from "typeorm";
import { User } from "./entity/User";
@EntityRepository(User)
export class UserRepository extends Repository<User> {
async findByEmail(email: string): Promise<User | undefined> {
return this.findOne({ where: { email } });
}
}
এখানে, UserRepository ক্লাস User Entity এর সাথে সম্পর্কিত সমস্ত ডেটাবেস অপারেশন পরিচালনা করে। এটি Repository Pattern ব্যবহার করে findByEmail ফাংশন তৈরি করেছে।
২. Service Layer Pattern
Service Layer Pattern হল একটি প্যাটার্ন যেখানে অ্যাপ্লিকেশনের ব্যবসায়িক লজিক আলাদা একটি service ক্লাসে রাখা হয়, যা ডেটা অ্যাক্সেস লেয়ারের (repository) সাথে কাজ করে। এটি অ্যাপ্লিকেশনের বিভিন্ন অংশের মধ্যে যোগাযোগের একটি মজবুত স্তর তৈরি করে, এবং কোডের রক্ষণাবেক্ষণ এবং এক্সটেনশন সহজ হয়।
উদাহরণ:
import { Injectable } from "@nestjs/common";
import { UserRepository } from "./repository/UserRepository";
import { User } from "./entity/User";
@Injectable()
export class UserService {
constructor(private userRepository: UserRepository) {}
async getUserByEmail(email: string): Promise<User | undefined> {
return this.userRepository.findByEmail(email);
}
}
এখানে, UserService ক্লাসটি UserRepository ব্যবহার করে ডেটা অ্যাক্সেস করার কাজটি করছে। এতে অ্যাপ্লিকেশনের ব্যবসায়িক লজিক আলাদা হয়ে যায় এবং অন্য অংশগুলো থেকে বিচ্ছিন্ন থাকে।
৩. Singleton Pattern
Singleton Pattern এমন একটি প্যাটার্ন যেখানে একটি ক্লাসের একটি মাত্র ইনস্ট্যান্স তৈরি হয় এবং তা একাধিক জায়গায় ব্যবহৃত হয়। TypeORM অ্যাপ্লিকেশনে এটি ব্যবহার করা যেতে পারে যেখানে একটি ডাটাবেস কানেকশন বা কনফিগারেশন একাধিক জায়গায় ব্যবহৃত হয়, কিন্তু আমরা চাই যে এটি একটি মাত্র ইনস্ট্যান্স হোক।
উদাহরণ:
import { createConnection } from "typeorm";
let connection;
export async function getDatabaseConnection() {
if (!connection) {
connection = await createConnection();
}
return connection;
}
এখানে, Singleton Pattern ব্যবহার করে ডাটাবেস কানেকশন নিশ্চিত করা হয়েছে যাতে একাধিক কানেকশন তৈরি না হয়।
৪. Factory Pattern
Factory Pattern এমন একটি প্যাটার্ন যেখানে অবজেক্ট তৈরির কাজ আলাদা একটি ফ্যাক্টরি ক্লাস বা ফাংশনের মাধ্যমে করা হয়। এটি অবজেক্ট তৈরি করার সময় এর কনফিগারেশন বা তৈরির পদ্ধতিকে অ্যাবস্ট্রাক্ট করে, যার ফলে কোডে এক্সটেনশন এবং রক্ষণাবেক্ষণ সহজ হয়।
উদাহরণ:
class UserFactory {
static createUser(name: string, email: string): User {
const user = new User();
user.name = name;
user.email = email;
return user;
}
}
এখানে, UserFactory একটি ফ্যাক্টরি ক্লাস যা User অবজেক্ট তৈরি করে।
৫. Decorator Pattern
Decorator Pattern হল একটি ডিজাইন প্যাটার্ন যা একটি অবজেক্টের আচরণে পরিবর্তন আনতে ব্যবহার করা হয়, কিন্তু তার প্রকৃত ক্লাসে পরিবর্তন না করে। TypeORM-এ Decorator Pattern ব্যবহৃত হয় যখন আমরা অ্যাসোসিয়েশন (Relations), ভ্যালিডেশন, বা কাস্টম লজিক যোগ করতে চাই।
উদাহরণ:
import { Entity, PrimaryGeneratedColumn, Column } from "typeorm";
@Entity()
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column()
name: string;
@Column()
email: string;
}
এখানে, @Entity(), @PrimaryGeneratedColumn(), এবং @Column() ডেকোরেটরগুলি Decorator Pattern ব্যবহার করে Entity এবং Column তৈরি করছে।
৬. Observer Pattern
Observer Pattern হল একটি প্যাটার্ন যেখানে একটি অবজেক্ট তার পরিবর্তনের জন্য অন্যান্য অবজেক্টকে অবহিত করে। TypeORM-এ এটি সাধারণত Event Listeners বা Subscribers এর মাধ্যমে ব্যবহৃত হয়, যা ডেটাবেসের পরিবর্তন বা ট্রানজ্যাকশন সম্পর্কে অবহিত করে।
উদাহরণ:
import { EntitySubscriberInterface, EventSubscriber, InsertEvent } from "typeorm";
import { User } from "./User";
@EventSubscriber()
export class UserSubscriber implements EntitySubscriberInterface<User> {
listenTo() {
return User;
}
afterInsert(event: InsertEvent<User>) {
console.log(`User inserted: ${event.entity.name}`);
}
}
এখানে, UserSubscriber ব্যবহার করে আমরা Observer Pattern প্রয়োগ করেছি যাতে ইউজার ইনসার্ট হওয়ার পর অবহিত হওয়া যায়।
সারাংশ
Design Patterns ব্যবহার করে TypeORM-এ Large Scale Applications তৈরি করলে অ্যাপ্লিকেশনটির স্থিতিশীলতা, রক্ষণাবেক্ষণযোগ্যতা, এবং স্কেলেবিলিটি বৃদ্ধি পায়। Repository Pattern, Service Layer Pattern, Singleton Pattern, Factory Pattern, Decorator Pattern এবং Observer Pattern এগুলোর মধ্যে কিছু গুরুত্বপূর্ণ প্যাটার্ন যা TypeORM ব্যবহার করে Large Scale অ্যাপ্লিকেশন ডিজাইন এবং উন্নত করার জন্য কার্যকর। এই প্যাটার্নগুলো অ্যাপ্লিকেশনের কাঠামো পরিষ্কার করে এবং ভবিষ্যতে এক্সটেনশন এবং পরিবর্তন সহজ করে তোলে।
Read more