MapStruct একটি শক্তিশালী কোড জেনারেশন টুল যা Java Beans এর মধ্যে ডেটা ট্রান্সফরমেশন সহজ এবং দ্রুত করার জন্য ব্যবহৃত হয়। এটি সাধারণত DTO (Data Transfer Object) এবং Entity ক্লাসের মধ্যে ডেটা ম্যাপিং করতে ব্যবহৃত হয়। এখানে, আমরা একটি সাধারণ Object Mapping উদাহরণের মাধ্যমে দেখাবো কিভাবে MapStruct ব্যবহার করে দুটি Java Beans এর মধ্যে ডেটা ম্যাপ করা যায়।
১. MapStruct কী এবং কেন ব্যবহার করবেন?
MapStruct একটি কোড জেনারেটর যা compile-time এ Java Beans এর মধ্যে ডেটা ম্যাপিং সম্পন্ন করে। এটি reflection ব্যবহার না করে, তাই দ্রুত এবং পারফরম্যান্সে কার্যকরী। MapStruct স্বয়ংক্রিয়ভাবে Java Beans এর মধ্যে ডেটা স্থানান্তর করার জন্য ম্যাপিং কোড জেনারেট করে, ফলে ডেভেলপারদের ম্যানুয়ালি ডেটা ট্রান্সফরমেশন কোড লিখতে হয় না।
এখানে আমরা MapStruct এর মাধ্যমে দুটি ক্লাসের মধ্যে একটি বেসিক Object Mapping দেখব।
২. উদাহরণ: বেসিক Object Mapping
ধরা যাক, আমাদের দুটি ক্লাস রয়েছে — Person এবং PersonDTO। আমরা Person ক্লাস থেকে PersonDTO ক্লাসে ডেটা ম্যাপ করতে চাই।
২.১ Person.java ক্লাস
public class Person {
private String firstName;
private String lastName;
// Constructors
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// 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;
}
}
২.২ PersonDTO.java ক্লাস
public class PersonDTO {
private String firstName;
private String lastName;
// 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;
}
}
এখানে, Person এবং PersonDTO ক্লাসের মধ্যে firstName এবং lastName নামক দুইটি ফিল্ড রয়েছে, যা আমরা MapStruct ব্যবহার করে ম্যাপ করব।
৩. MapStruct Mapper Interface তৈরি করা
MapStruct ব্যবহার করতে, প্রথমে আপনাকে একটি Mapper Interface তৈরি করতে হবে যা দুটি ক্লাসের মধ্যে ম্যাপিং নির্দেশনা দিবে।
৩.১ PersonMapper.java Interface
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
PersonDTO personToPersonDTO(Person person);
}
এখানে:
- @Mapper: এটি MapStruct এর একটি অ্যানোটেশন যা এই ইন্টারফেসটিকে একটি Mapper হিসেবে চিহ্নিত করে।
- personToPersonDTO: এই মেথডটি
Personঅবজেক্টকেPersonDTOতে কনভার্ট করবে। - Mappers.getMapper: এটি MapStruct এর মাধ্যমে
PersonMapperইন্টারফেসের একটি ইনস্ট্যান্স তৈরি করবে।
৪. Maven Dependency Configuration
MapStruct ব্যবহার করতে হলে, আপনাকে Maven এর মাধ্যমে নির্দিষ্ট ডিপেনডেন্সি ইমপোর্ট করতে হবে।
৪.১ pom.xml ফাইলে MapStruct এর ডিপেনডেন্সি
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
<scope>provided</scope>
</plugin>
</plugins>
</build>
এখানে:
- mapstruct: এটি MapStruct লাইব্রেরি।
- mapstruct-processor: এটি কোড জেনারেট করার জন্য ব্যবহার হয় এবং এটি কম্পাইল টাইমে কোড জেনারেট করে।
৫. MapStruct ব্যবহার করে Object Mapping
এখন, MapStruct ব্যবহার করে Person অবজেক্টকে PersonDTO তে ম্যাপ করার কোড তৈরি করা যাক।
৫.১ Main.java ক্লাস
public class Main {
public static void main(String[] args) {
// Create Person object
Person person = new Person("John", "Doe");
// Convert Person to PersonDTO using MapStruct
PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);
// Print PersonDTO details
System.out.println("First Name: " + personDTO.getFirstName());
System.out.println("Last Name: " + personDTO.getLastName());
}
}
এখানে, PersonMapper.INSTANCE.personToPersonDTO(person) মেথডটি Person অবজেক্ট থেকে PersonDTO তে ডেটা ট্রান্সফার করবে। কোডের আউটপুট হবে:
First Name: John
Last Name: Doe
৬. MapStruct এর কোড জেনারেশন
ম্যাভেন বা গ্রেডল বিল্ড করার সময়, MapStruct একটি কনক্রিট ক্লাস (যেমন PersonMapperImpl) জেনারেট করবে যা Person থেকে PersonDTO তে ডেটা ম্যাপিং করবে। এই কোডটি compile-time এ জেনারেট হয়, ফলে এটি দ্রুত এবং নিরাপদ।
৭. MapStruct এর অন্যান্য ফিচারসমূহ
৭.১ Nested Mapping
MapStruct সোজাসুজি nested mapping সাপোর্ট করে। উদাহরণস্বরূপ, যদি আপনার Person ক্লাসের মধ্যে আরও একটি অবজেক্ট (যেমন Address) থাকে, তবে আপনি সেগুলিও ম্যাপ করতে পারবেন।
৭.২ Custom Mapping
আপনি যখন বিশেষ ধরনের ডেটা কনভার্সন করতে চান (যেমন, ডেটা ফরম্যাট পরিবর্তন), তখন custom methods ব্যবহার করতে পারেন।
@Mapper
public interface PersonMapper {
PersonDTO personToPersonDTO(Person person);
@Mapping(target = "firstName", source = "firstName")
String mapFirstName(String firstName);
}
এখানে, mapFirstName মেথডটি কাস্টম ম্যাপিংয়ের জন্য ব্যবহার করা হয়েছে।
সারাংশ
MapStruct Java প্রোজেক্টে object mapping দ্রুত এবং কার্যকরভাবে করার জন্য একটি শক্তিশালী টুল। Compile-time code generation এর মাধ্যমে এটি Person এবং PersonDTO এর মধ্যে ডেটা ম্যাপিং সহজ করে তোলে, এবং এটি কোনো runtime reflection ব্যবহার না করায় পারফরম্যান্সে দ্রুত। MapStruct স্বয়ংক্রিয়ভাবে কোড জেনারেট করার মাধ্যমে ডেটা ট্রান্সফরমেশন খুবই কার্যকরী এবং নির্ভরযোগ্য করে তোলে।
উপরে দেওয়া উদাহরণে, আমরা দেখেছি কীভাবে MapStruct ব্যবহার করে সহজ এবং দ্রুত Object Mapping করা যায়।