Repository এবং Service Layers এর ধারণা
Repository এবং Service Layers দুটি গুরুত্বপূর্ণ ডিজাইন প্যাটার্ন যা TypeORM সহ অনেক আধুনিক অ্যাপ্লিকেশন ডিজাইন ও আর্কিটেকচারতে ব্যবহৃত হয়। এই দুটি স্তরের ব্যবহার অ্যাপ্লিকেশনের কোডকে আরও শুদ্ধ, পুনঃব্যবহারযোগ্য এবং স্কেলযোগ্য করে তোলে।
- Repository Layer: ডেটাবেস অপারেশন এবং ডেটা ম্যানিপুলেশন এর জন্য ব্যবহৃত হয়। এটি TypeORM-এ ডেটাবেস থেকে ডেটা সংগ্রহ, আপডেট, ডিলিট, এবং সেভ করা পরিচালনা করে। সাধারণভাবে, Repository layer ডেটাবেস সম্পর্কিত সমস্ত লজিক একত্রিত করে।
- Service Layer: এটি অ্যাপ্লিকেশনের বিজনেস লজিক ধারণ করে। সার্ভিস লেয়ার ডেটাবেস অপারেশন পরিচালনা না করে, বরং Repository Layer থেকে ডেটা নিয়ে বিজনেস লজিক প্রয়োগ করে। এটি মূলত ক্লায়েন্টের রিকোয়েস্টের ওপর বিজনেস লজিক প্রয়োগ করতে সহায়তা করে।
এই দুটি স্তরের আলাদা করা অ্যাপ্লিকেশনকে ডি-কাপলড এবং আরও ম্যানেজেবল করে তোলে, যেহেতু Repository শুধুমাত্র ডেটাবেসের সাথে সম্পর্কিত কাজ করবে এবং Service Layer বিজনেস লজিক পরিচালনা করবে।
TypeORM এ Repository এবং Service Layers এর Separation
১. Repository Layer
Repository Layer TypeORM এর Entity সম্পর্কিত সমস্ত ডেটাবেস অপারেশন পরিচালনা করবে। TypeORM এর getRepository() ফাংশন ব্যবহার করে আপনি ডেটাবেস টেবিলের উপর CRUD (Create, Read, Update, Delete) অপারেশন পরিচালনা করতে পারবেন।
উদাহরণ: User Entity এর জন্য Repository তৈরি:
import { EntityRepository, Repository } from "typeorm";
import { User } from "./User";
@EntityRepository(User)
export class UserRepository extends Repository<User> {
// কাস্টম কুয়েরি এবং ফাংশন এখানে যোগ করা যেতে পারে
}
এখানে, UserRepository এর মধ্যে আপনি কাস্টম কুয়েরি বা অন্যান্য ডেটাবেস সম্পর্কিত অপারেশন যুক্ত করতে পারেন। এতে সার্ভিস লেয়ারের কাজ সহজ হয়ে যাবে কারণ সার্ভিস লেয়ার শুধু এই রেপোজিটরি ব্যবহার করবে।
২. Service Layer
Service Layer হলো এমন একটি লেয়ার যা অ্যাপ্লিকেশনের বিজনেস লজিক ধারণ করে। এখানে আমরা Repository এর মাধ্যমে ডেটা রিটার্ন করি, তার পর সেই ডেটার ওপর বিজনেস লজিক প্রয়োগ করি এবং ফলাফল রিটার্ন করি।
উদাহরণ: User Service এর জন্য একটি Service ক্লাস:
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { UserRepository } from './user.repository';
import { User } from './user.entity';
@Injectable()
export class UserService {
constructor(
@InjectRepository(UserRepository)
private userRepository: UserRepository
) {}
// ইউজার তৈরি করা
async createUser(name: string, email: string): Promise<User> {
const user = new User();
user.name = name;
user.email = email;
return this.userRepository.save(user);
}
// ইউজার পাওয়া
async getUserById(id: number): Promise<User | undefined> {
return this.userRepository.findOne(id);
}
// সব ইউজার পাওয়া
async getAllUsers(): Promise<User[]> {
return this.userRepository.find();
}
}
এখানে, UserService একটি সার্ভিস ক্লাস যা UserRepository এর মাধ্যমে ডেটাবেসের সাথে যোগাযোগ করছে। সার্ভিস লেয়ারকে বিজনেস লজিক পরিচালনা করতে বলা হয়েছে এবং Repository কে শুধুমাত্র ডেটা রিটার্ন বা ম্যানিপুলেট করার দায়িত্ব দেওয়া হয়েছে।
৩. Controller Layer (Optional)
অ্যাপ্লিকেশন অ্যাক্সেস করার জন্য একটি কন্ট্রোলার লেয়ার হতে পারে (যেমন, NestJS-এ)। কন্ট্রোলার রিকোয়েস্ট গ্রহণ করবে এবং সার্ভিস লেয়ারকে কল করবে।
উদাহরণ: UserController:
import { Controller, Get, Param, Post, Body } from '@nestjs/common';
import { UserService } from './user.service';
import { User } from './user.entity';
@Controller('users')
export class UserController {
constructor(private readonly userService: UserService) {}
@Post()
create(@Body() createUserDto: { name: string; email: string }): Promise<User> {
return this.userService.createUser(createUserDto.name, createUserDto.email);
}
@Get(':id')
getUser(@Param('id') id: number): Promise<User | undefined> {
return this.userService.getUserById(id);
}
@Get()
getAllUsers(): Promise<User[]> {
return this.userService.getAllUsers();
}
}
এখানে, UserController সার্ভিস লেয়ারের ফাংশনগুলোকে কল করছে এবং রিকোয়েস্টের মাধ্যমে ডেটা রিটার্ন করছে।
Service Layer এবং Repository Layer এর মধ্যে পার্থক্য
| ফিচার | Repository Layer | Service Layer |
|---|---|---|
| কাজ | ডেটাবেস অপারেশন পরিচালনা (CRUD) | বিজনেস লজিক পরিচালনা |
| ফোকাস | ডেটাবেস এবং Entity এর উপর | অ্যাপ্লিকেশনের বিজনেস লজিক এবং কাজের প্রবাহ |
| রোল | ডেটা ম্যানিপুলেশন এবং ডেটাবেস সম্পর্কিত কাজ | Repository থেকে ডেটা নিয়ে বিজনেস লজিক প্রয়োগ করা |
| ডিপেন্ডেন্সি | Entity এবং TypeORM অপারেশনগুলোর উপর নির্ভরশীল | Repository এবং অন্যান্য সার্ভিসের উপর নির্ভরশীল |
| প্রধান উদ্দেশ্য | ডেটাবেসের সাথে সংযুক্ত থাকা | ব্যবসায়িক ফাংশনগুলো এবং কার্যকরী লজিক তৈরি করা |
সারাংশ
Repository এবং Service Layers এর আলাদা করা অ্যাপ্লিকেশনের উন্নয়ন প্রক্রিয়া সহজ করে, কোড আরও পরিষ্কার এবং ম্যানেজযোগ্য করে তোলে। Repository Layer শুধুমাত্র ডেটাবেসের সাথে কাজ করে, এবং Service Layer বিজনেস লজিক পরিচালনা করে। TypeORM-এ এই দুটির ব্যবহার অ্যাপ্লিকেশন কোডের সংরক্ষণযোগ্যতা এবং স্কেলেবিলিটি বাড়ায়, কারণ এগুলো একে অপর থেকে স্বাধীন থাকে। Service Layer ডেটার সাথে সম্পর্কিত সমস্ত বিজনেস লজিক রাখবে এবং Repository Layer শুধুমাত্র ডেটা সংরক্ষণ, রিট্রিভ, আপডেট এবং ডিলিট করবে।
Read more