MapStruct হল একটি শক্তিশালী এবং কার্যকরী টুল যা Source এবং Target অবজেক্টের মধ্যে ডেটা ম্যাপিং সহজ করে তোলে। MapStruct ব্যবহার করে আপনি খুব সহজে JavaBeans বা POJOs এর মধ্যে ডেটা ম্যাপ করতে পারেন। এর মাধ্যমে DTO (Data Transfer Object) এবং Entity ক্লাসের মধ্যে ডেটা ট্রান্সফরমেশন করা খুবই সহজ এবং দ্রুত হয়।
এখানে আমরা MapStruct এর মাধ্যমে Source এবং Target Object এর মধ্যে Mapping করার একটি উদাহরণ দেখব এবং একটি Mapper Interface তৈরি করব।
১. MapStruct এর মাধ্যমে Source এবং Target Object এর Mapping
ধরা যাক, আপনার একটি Source Object (যেমন, Person) এবং একটি Target Object (যেমন, PersonDTO) রয়েছে। MapStruct ব্যবহার করে আপনি Source Object থেকে Target Object এ ডেটা ম্যাপ করতে চান।
১.১ Person (Source Object)
public class Person {
private String firstName;
private String lastName;
private int age;
// Getters and Setters
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
এখানে, Person একটি Source Object যা firstName, lastName, এবং age প্রোপার্টি ধারণ করে।
১.২ PersonDTO (Target Object)
public class PersonDTO {
private String fullName;
private int age;
// Getters and Setters
public String getFullName() {
return fullName;
}
public void setFullName(String fullName) {
this.fullName = fullName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
এখানে, PersonDTO একটি Target Object যা fullName এবং age প্রোপার্টি ধারণ করে।
১.৩ PersonMapper (Mapper Interface)
MapStruct এর মাধ্যমে Source Object (Person) থেকে Target Object (PersonDTO) তে ডেটা ম্যাপ করতে, আপনি একটি Mapper Interface তৈরি করবেন। নিচে তার উদাহরণ দেখানো হল:
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
// Mapping method
PersonDTO personToPersonDTO(Person person);
}
এখানে, PersonMapper একটি Mapper Interface যা @Mapper অ্যানোটেশন দ্বারা চিহ্নিত করা হয়েছে। personToPersonDTO মেথডটি Person অবজেক্ট থেকে PersonDTO তে ডেটা ম্যাপ করবে।
১.৪ Mapping Process
এখন, আপনি PersonMapper.INSTANCE.personToPersonDTO(person) মেথড ব্যবহার করে Person থেকে PersonDTO তে ডেটা ট্রান্সফার করতে পারেন। MapStruct এর মাধ্যমে এটি স্বয়ংক্রিয়ভাবে সম্পন্ন হবে।
১.৫ Main Class (Usage Example)
public class Main {
public static void main(String[] args) {
// Creating Person instance
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
person.setAge(30);
// Using MapStruct to map Person to PersonDTO
PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);
// Print PersonDTO
System.out.println("Full Name: " + personDTO.getFullName());
System.out.println("Age: " + personDTO.getAge());
}
}
এখানে, PersonMapper.INSTANCE.personToPersonDTO(person) মেথডটি MapStruct এর মাধ্যমে Person অবজেক্ট থেকে PersonDTO তে ডেটা ম্যাপ করবে। PersonDTO এর fullName ফিল্ডে firstName এবং lastName যোগ করা হবে এবং age একই থাকবে।
২. MapStruct এর মাধ্যমে কাস্টম ম্যাপিং
MapStruct কাস্টম ম্যাপিং সমর্থন করে, যার মাধ্যমে আপনি নিজের লজিক প্রয়োগ করতে পারেন। উদাহরণস্বরূপ, আপনি যদি চান যে Person অবজেক্টের firstName এবং lastName থেকে fullName তৈরি করতে, তবে আপনি MapStruct এর @Mapping অ্যানোটেশন ব্যবহার করতে পারেন।
২.১ Custom Mapping Example
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
@Mapping(target = "fullName", expression = "java(person.getFirstName() + \" \" + person.getLastName())")
PersonDTO personToPersonDTO(Person person);
}
এখানে, fullName ফিল্ডটি firstName এবং lastName থেকে কাস্টম expression ব্যবহার করে তৈরি করা হচ্ছে।
৩. MapStruct এর প্রধান সুবিধা
- Compile-time Code Generation: এটি compile-time এ কোড জেনারেট করে, ফলে রানটাইমে কোনো অতিরিক্ত খরচ হয় না, এবং পারফরম্যান্স উন্নত হয়।
- Type Safety: Type-safe ম্যাপিং প্রক্রিয়া, যেখানে runtime ত্রুটি কমে যায় এবং ডেটা ম্যানিপুলেশন সঠিকভাবে হয়।
- No Reflection: MapStruct রিফ্লেকশন ব্যবহার না করায় পারফরম্যান্সে কোনো নেতিবাচক প্রভাব পড়ে না।
- Custom Mappings: কাস্টম ম্যাপিং ফাংশন সহ ম্যাপিংয়ের সুযোগ প্রদান করে।
- Integration with Spring: Spring Framework এর সাথে সহজে ইন্টিগ্রেট করা যায়।
সারাংশ
MapStruct হল একটি শক্তিশালী এবং কার্যকরী টুল যা Source এবং Target Object এর মধ্যে ডেটা মাপিং দ্রুত এবং টাইপ সেফভাবে সম্পন্ন করতে সহায়তা করে। আপনি একটি Mapper Interface তৈরি করে, @Mapper অ্যানোটেশন ব্যবহার করে মডেল ডেটা ট্রান্সফার করতে পারেন। MapStruct কোড জেনারেট করে, যা compile-time এ কাজ করে এবং runtime পারফরম্যান্সে কোনো নেতিবাচক প্রভাব ফেলে না। এর কাস্টম ম্যাপিং, Spring এর সাথে ইন্টিগ্রেশন এবং type safety এর মতো সুবিধাগুলি এটি ব্যবহারের জন্য আরও উপযোগী করে তোলে।
Read more