Auditing স্প্রিং বুট JPA-তে একটি কার্যকরী ফিচার, যা আপনাকে Entity ক্লাসের উপর ডেটা ম্যানিপুলেশন (যেমন, তৈরি করা, আপডেট করা, মুছে ফেলা) সম্পর্কে লগ রাখতে সহায়তা করে। Auditing আপনাকে createdDate, lastModifiedDate, createdBy, lastModifiedBy ইত্যাদি ফিল্ডগুলি স্বয়ংক্রিয়ভাবে ট্র্যাক করতে সাহায্য করে। এই ফিচারটি ব্যবহারের মাধ্যমে আপনি Entity-এর যেকোনো পরিবর্তন সম্পর্কিত মেটাডেটা সংগ্রহ করতে পারেন, যেমন: কখন এবং কিভাবে ডেটা পরিবর্তিত হয়েছে, এবং কে ডেটা পরিবর্তন করেছে।
স্প্রিং বুট JPA-তে Auditing কনফিগারেশন করতে কিছু নির্দিষ্ট ধাপ অনুসরণ করতে হয়। এটি সাধারণত @CreatedDate, @LastModifiedDate, @CreatedBy, এবং @LastModifiedBy অ্যানোটেশন ব্যবহার করে করা হয়।
স্প্রিং বুট JPA Auditing কনফিগারেশন
1. Auditing কনফিগারেশন ক্লাস তৈরি করা
স্প্রিং বুট JPA তে auditing সক্ষম করার জন্য প্রথমে একটি কনফিগারেশন ক্লাস তৈরি করতে হয়, যেখানে @EnableJpaAuditing অ্যানোটেশন ব্যবহার করা হয়।
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
@Configuration
@EnableJpaAuditing
public class JpaConfig {
// Enable JPA Auditing
}
ব্যাখ্যা:
- @EnableJpaAuditing: এই অ্যানোটেশনটি স্প্রিং বুটকে নির্দেশ দেয় যে এটি JPA Auditing সক্ষম করবে।
2. Entity ক্লাসে Auditing ফিল্ড যোগ করা
এখন, আপনাকে Entity ক্লাসে auditing ফিল্ড যোগ করতে হবে। এই ফিল্ডগুলো @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy অ্যানোটেশন দ্বারা চিহ্নিত হবে।
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.*;
import java.util.Date;
@Entity
@EntityListeners(AuditingEntityListener.class) // Enable Auditing
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Double price;
@CreatedDate // Automatically set the creation date
private Date createdDate;
@LastModifiedDate // Automatically set the last modified date
private Date lastModifiedDate;
@CreatedBy // Automatically set the creator of the entity
private String createdBy;
@LastModifiedBy // Automatically set the last modifier of the entity
private String lastModifiedBy;
// Getters and Setters
}
ব্যাখ্যা:
- @CreatedDate: এই ফিল্ডটি Entity তৈরির সময় স্বয়ংক্রিয়ভাবে সেট হবে।
- @LastModifiedDate: এই ফিল্ডটি Entity আপডেট হওয়ার সময় স্বয়ংক্রিয়ভাবে সেট হবে।
- @CreatedBy: এই ফিল্ডটি Entity তৈরি করার সময় ইউজার দ্বারা স্বয়ংক্রিয়ভাবে ইনজেক্ট হবে।
- @LastModifiedBy: এই ফিল্ডটি Entity আপডেট হওয়ার সময় ইউজার দ্বারা স্বয়ংক্রিয়ভাবে ইনজেক্ট হবে।
- @EntityListeners(AuditingEntityListener.class): এটি Entity ক্লাসে auditing সক্রিয় করতে ব্যবহার করা হয়।
3. AuditorAware Interface ইমপ্লিমেন্ট করা
এখন, @CreatedBy এবং @LastModifiedBy ফিল্ডগুলির জন্য আপনি AuditorAware ইন্টারফেসটি ইমপ্লিমেন্ট করবেন, যাতে আপনি ট্র্যাক করতে পারেন createdBy এবং lastModifiedBy এর মান। সাধারণত, এটি লগিন ইউজারের নাম সংরক্ষণ করতে ব্যবহৃত হয়।
import org.springframework.data.domain.AuditorAware;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class CustomAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
// Here you would retrieve the current logged-in user
return Optional.of("admin"); // Placeholder for the logged-in user
}
}
ব্যাখ্যা:
- getCurrentAuditor() মেথডটি ইউজারের তথ্য ফেরত দেয়, যেমন ইউজারনেম। বাস্তব অ্যাপ্লিকেশনে, আপনি এখানে লগিন ইউজারের তথ্য অ্যাক্সেস করতে পারেন (যেমন, Spring Security ব্যবহার করে)।
4. Spring Security (Optional)
যদি আপনি Spring Security ব্যবহার করেন, তাহলে আপনি SecurityContextHolder থেকে লগিন করা ইউজারের নাম নিতে পারেন।
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
public class CustomAuditorAware implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
User principal = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
return Optional.of(principal.getUsername());
}
}
ব্যাখ্যা:
এখানে SecurityContextHolder থেকে ইউজারের নাম টেনে নেওয়া হচ্ছে, যা getCurrentAuditor() মেথডে ব্যবহার হচ্ছে।
5. Audit ফিল্ডগুলোর জন্য Getter এবং Setter
এখন, Entity ক্লাসে createdDate, lastModifiedDate, createdBy, এবং lastModifiedBy ফিল্ডগুলির জন্য Getter এবং Setter মেথড যুক্ত করতে হবে।
public Date getCreatedDate() {
return createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
public Date getLastModifiedDate() {
return lastModifiedDate;
}
public void setLastModifiedDate(Date lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
public String getCreatedBy() {
return createdBy;
}
public void setCreatedBy(String createdBy) {
this.createdBy = createdBy;
}
public String getLastModifiedBy() {
return lastModifiedBy;
}
public void setLastModifiedBy(String lastModifiedBy) {
this.lastModifiedBy = lastModifiedBy;
}
6. Transaction Configuration
স্প্রিং বুট জেপিএতে ট্রানজ্যাকশন ব্যবস্থাপনা করার জন্য @Transactional অ্যানোটেশন ব্যবহার করা হয়। এতে auditing ফিল্ডগুলো স্বয়ংক্রিয়ভাবে আপডেট হয় যখন ডেটাবেসে সংশোধন করা হয়।
import org.springframework.transaction.annotation.Transactional;
@Transactional
public void saveProduct(Product product) {
productRepository.save(product);
}
ব্যাখ্যা:
এখানে @Transactional অ্যানোটেশন ব্যবহৃত হয়েছে যাতে saveProduct মেথডে ডেটাবেসে তথ্য সংরক্ষিত করার সময় ট্রানজ্যাকশন পরিচালিত হয় এবং auditing ফিল্ডগুলোও স্বয়ংক্রিয়ভাবে আপডেট হয়।
উপসংহার
Auditing স্প্রিং বুট JPA-তে একটি শক্তিশালী ফিচার, যা Entity ক্লাসের পরিবর্তন ট্র্যাক করতে সহায়তা করে। এটি @CreatedDate, @LastModifiedDate, @CreatedBy, এবং @LastModifiedBy অ্যানোটেশন ব্যবহার করে ডেটাবেসের মধ্যে পরিবর্তনগুলির সময় এবং ইউজার সংক্রান্ত তথ্য সংরক্ষণ করে। স্প্রিং বুট JPA-তে auditing কনফিগার করার মাধ্যমে ডেটাবেসের পরিবর্তন সম্পর্কিত তথ্য অ্যাপ্লিকেশনের মেটাডেটা হিসেবে সংরক্ষণ করা সম্ভব হয়, যা পরে লগিং, ইতিহাস ট্র্যাকিং, বা অডিট রিপোর্ট তৈরিতে ব্যবহার করা যেতে পারে।
Read more