MapStruct হল একটি কোড জেনারেটর লাইব্রেরি যা source এবং target অবজেক্টগুলির মধ্যে ডেটা ম্যানিপুলেশন বা ম্যাপিং অত্যন্ত সহজভাবে এবং দ্রুতভাবে সম্পন্ন করতে ব্যবহৃত হয়। এটি compile-time কোড জেনারেটিং টুল হিসেবে কাজ করে, ফলে runtime এ অতিরিক্ত পারফরম্যান্স খরচ নেই। MapStruct ব্যবহার করে আপনি সহজেই ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ডেটা ম্যাপিং করতে পারেন।
এখানে, আমরা দেখব কিভাবে MapStruct এর মাধ্যমে source অবজেক্ট থেকে target অবজেক্টে ডেটা ম্যাপ করা যায়। এই টিউটোরিয়ালে source অবজেক্টকে target অবজেক্টে ম্যাপ করার জন্য একটি সাধারণ উদাহরণ দেওয়া হবে।
১. MapStruct এর মাধ্যমে Mapping করার মূল ধারণা
MapStruct-এ source object থেকে target object তে ডেটা ম্যাপিং একটি Mapper Interface এর মাধ্যমে সম্পন্ন হয়। এই ইন্টারফেসে @Mapper অ্যানোটেশন ব্যবহার করা হয় এবং @Mapping অ্যানোটেশন দিয়ে ম্যাপিং ফিল্ড গুলি কনফিগার করা হয়।
MapStruct মূলত source অবজেক্টের প্রপার্টি গুলোকে target অবজেক্টে ম্যাপ করার জন্য mapping methods ডিফাইন করে, এবং compile-time এ কোড জেনারেট করে।
২. প্রথম MapStruct প্রোগ্রাম: Source এবং Target Object এর Mapping
এখানে আমরা একটি Person ক্লাস এবং তার DTO PersonDTO ক্লাস তৈরি করব এবং MapStruct ব্যবহার করে এই দুটি ক্লাসের মধ্যে ডেটা ম্যাপিং করব।
২.১ Source Object: Person
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;
}
}
২.২ Target Object: PersonDTO
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;
}
}
এখানে, আমাদের Person এবং PersonDTO ক্লাস তৈরি করা হয়েছে। Person ক্লাসে firstName, lastName এবং age ফিল্ড রয়েছে, আর PersonDTO তে fullName এবং age ফিল্ড রয়েছে।
২.৩ Mapper Interface: PersonMapper
এখন, আমরা একটি Mapper Interface তৈরি করব যা Person থেকে PersonDTO তে ডেটা ম্যাপ করবে।
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 ইন্টারফেসে একটি personToPersonDTO মেথড তৈরি করা হয়েছে, যা Person অবজেক্ট থেকে PersonDTO অবজেক্টে ডেটা ম্যাপ করবে।
২.৪ Main Class: Mapping ব্যবহার করা
এখন, আমরা Main ক্লাসে ম্যাপিং কার্যক্রম বাস্তবায়ন করব।
public class Main {
public static void main(String[] args) {
// Source object (Person)
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());
}
}
এখানে:
- আমরা একটি Person অবজেক্ট তৈরি করেছি এবং এর ফিল্ডগুলি সেট করেছি।
- MapStruct এর মাধ্যমে Person থেকে PersonDTO তে ডেটা ম্যাপ করার জন্য
PersonMapper.INSTANCE.personToPersonDTO(person)মেথড ব্যবহার করা হয়েছে। - অবশেষে, আমরা PersonDTO এর
fullNameএবংageপ্রিন্ট করেছি।
৩. কাস্টম ম্যাপিং এবং ফিল্ড নাম পরিবর্তন
আপনি যদি চাইছেন যে, firstName এবং lastName এর মান যোগ করে fullName তৈরি করা হোক, তবে কাস্টম ম্যাপিং প্রয়োগ করতে পারেন। MapStruct এ এটি করার জন্য @Mapping অ্যানোটেশন ব্যবহার করা হয়।
৩.১ Custom Mapping Example
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
@Mapping(source = "firstName", target = "fullName")
PersonDTO personToPersonDTO(Person person);
}
এখানে, @Mapping অ্যানোটেশনের মাধ্যমে আমরা firstName কে fullName এ ম্যাপ করছি।
৩.২ Full Name Concatenation Example
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
@Mapping(target = "fullName", expression = "java(person.getFirstName() + \" \" + person.getLastName())")
PersonDTO personToPersonDTO(Person person);
}
এখানে, expression ব্যবহার করে firstName এবং lastName কে একত্রিত করে fullName তৈরি করা হয়েছে।
৪. Maven Dependency Configuration
MapStruct ব্যবহার করার জন্য, আপনাকে Maven এর pom.xml ফাইলে কিছু নির্দিষ্ট ডিপেনডেন্সি এবং প্লাগইন কনফিগার করতে হবে:
<dependencies>
<!-- MapStruct Dependency -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.2.Final</version>
</dependency>
<!-- MapStruct Processor Dependency (for Code Generation) -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.2.Final</version>
<scope>provided</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.2.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
সারাংশ
এই টিউটোরিয়ালে, আমরা MapStruct ব্যবহার করে source object এবং target object এর মধ্যে ডেটা ম্যাপিং করার প্রক্রিয়া শিখেছি। MapStruct এর মাধ্যমে আপনি সহজে ডোমেইন অবজেক্ট এবং DTO এর মধ্যে ডেটা কপি করতে পারেন, যা কোডিংয়ের পরিমাণ কমিয়ে দেয় এবং পারফরম্যান্স উন্নত করে।
এছাড়া, custom mapping এবং field transformations এর মাধ্যমে আরও দক্ষ ডেটা ম্যাপিং করা সম্ভব। MapStruct কোড জেনারেট করার মাধ্যমে টাইপ সেফ এবং দ্রুত ম্যাপিং সম্পন্ন করতে সাহায্য করে।
Read more