MapStruct হল একটি শক্তিশালী এবং কার্যকরী Java library যা ডোমেইন অবজেক্ট এবং ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে ম্যাপিং করতে ব্যবহৃত হয়। এক্ষেত্রে, Parent-Child Object Mapping হল এমন একটি পরিস্থিতি যেখানে একটি প্যারেন্ট অবজেক্টের মধ্যে থাকা চাইল্ড অবজেক্টের ডেটা ট্রান্সফার করতে হয়। MapStruct এই ধরনের ম্যাপিং সহজেই করতে পারে, যা আপনার কোডের কাঠামো পরিষ্কার এবং কার্যকরী রাখে।
এই টিউটোরিয়ালে, আমরা দেখব কিভাবে MapStruct ব্যবহার করে Parent-Child Object Mapping সম্পন্ন করা যায়।
১. Parent-Child Object Mapping এর ধারণা
Parent-Child Object Mapping এমন একটি প্রক্রিয়া যেখানে একটি প্যারেন্ট অবজেক্টের মধ্যে থাকা চাইল্ড অবজেক্টগুলোর ডেটা ম্যাপ করা হয়। উদাহরণস্বরূপ, যদি একটি Employee অবজেক্ট থাকে এবং এর মধ্যে একটি Address অবজেক্ট থাকে, তাহলে Employee থেকে EmployeeDTO তে ম্যাপ করার সময় Address অবজেক্টকেও আলাদাভাবে ম্যাপ করা হবে।
২. Example of Parent-Child Object Mapping Using MapStruct
ধরা যাক, আমাদের দুটি ক্লাস রয়েছে: Employee (প্যারেন্ট) এবং Address (চাইল্ড)। আমাদের লক্ষ্য হল Employee অবজেক্টকে EmployeeDTO তে এবং Address অবজেক্টকে AddressDTO তে ম্যাপ করা।
Employee.java (Parent Class)
public class Employee {
private String name;
private int age;
private Address address;
// Getters and Setters
}
Address.java (Child Class)
public class Address {
private String street;
private String city;
// Getters and Setters
}
EmployeeDTO.java (Parent DTO Class)
public class EmployeeDTO {
private String name;
private int age;
private AddressDTO address;
// Getters and Setters
}
AddressDTO.java (Child DTO Class)
public class AddressDTO {
private String street;
private String city;
// Getters and Setters
}
EmployeeMapper.java (MapStruct Mapper Interface)
এখন আমরা একটি MapStruct Mapper Interface তৈরি করব যা Employee এবং Address এর মধ্যে ম্যাপিং করবে।
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;
@Mapper
public interface EmployeeMapper {
EmployeeMapper INSTANCE = Mappers.getMapper(EmployeeMapper.class);
// Parent to Parent mapping
@Mapping(source = "address", target = "address")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
// Child to Child mapping
AddressDTO addressToAddressDTO(Address address);
}
এখানে:
employeeToEmployeeDTOমেথডটি Employee অবজেক্টকে EmployeeDTO তে ম্যাপ করে, এবং এতে address নামে একটি চাইল্ড অবজেক্টও রয়েছে, যাকে AddressDTO তে ম্যাপ করা হবে।addressToAddressDTOমেথডটি Address অবজেক্টকে AddressDTO তে ম্যাপ করবে।
৩. Using the Mapper (MapStruct Mapper ব্যবহার করা)
এখন, আপনি MapStruct Mapper ব্যবহার করে Employee অবজেক্টকে EmployeeDTO তে এবং তার Address অবজেক্টকে AddressDTO তে ম্যাপ করতে পারবেন।
Main.java (Usage Example)
public class Main {
public static void main(String[] args) {
Address address = new Address();
address.setStreet("123 Main St");
address.setCity("New York");
Employee employee = new Employee();
employee.setName("John Doe");
employee.setAge(30);
employee.setAddress(address);
// Mapping
EmployeeDTO employeeDTO = EmployeeMapper.INSTANCE.employeeToEmployeeDTO(employee);
// Printing the mapped values
System.out.println("Employee Name: " + employeeDTO.getName());
System.out.println("Employee Age: " + employeeDTO.getAge());
System.out.println("Employee Address: " + employeeDTO.getAddress().getStreet());
}
}
এখানে, employeeToEmployeeDTO মেথডটি Employee অবজেক্ট এবং এর Address অবজেক্টকে EmployeeDTO এবং AddressDTO তে ম্যাপ করবে।
Output:
Employee Name: John Doe
Employee Age: 30
Employee Address: 123 Main St
৪. Nested Object Mapping এর সুবিধা
- Clear and Maintainable Code: MapStruct এর মাধ্যমে প্যারেন্ট এবং চাইল্ড অবজেক্টের মধ্যে ম্যাপিং করা সহজ এবং পরিষ্কার, যা কোডের ম্যানটেনেবিলিটি উন্নত করে।
- Compile-time Safety: MapStruct compile-time এ কোড জেনারেট করে, ফলে টাইপ সেফটি নিশ্চিত করা হয়।
- No Reflection: MapStruct reflection ব্যবহার না করে ম্যাপিং প্রক্রিয়া সম্পন্ন করে, যা পারফরম্যান্সে উপকারী।
- Reusable Mappers: একাধিক প্যারেন্ট চাইল্ড অবজেক্টের জন্য একই ম্যাপিং মেথড ব্যবহার করা যায়।
৫. MapStruct এর জন্য অতিরিক্ত কনফিগারেশন
MapStruct আপনাকে কাস্টম কনভার্টার বা কাস্টম লজিক প্রয়োগ করার সুযোগ দেয়। যদি আপনি আরও জটিল ম্যাপিং করতে চান, তবে কাস্টম মেথড ব্যবহার করা যেতে পারে।
Custom Mapping Example for Nested Objects
এটি একটি উদাহরণ যেখানে Employee এবং Address এর মধ্যে কাস্টম লজিক প্রয়োগ করা হয়েছে:
@Mapper
public interface EmployeeMapper {
EmployeeMapper INSTANCE = Mappers.getMapper(EmployeeMapper.class);
@Mapping(target = "address", expression = "java(customAddressMapping(employee.getAddress()))")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
AddressDTO customAddressMapping(Address address);
}
এখানে, customAddressMapping মেথডটি কাস্টম লজিক প্রয়োগ করতে ব্যবহৃত হচ্ছে, যা Address অবজেক্টকে AddressDTO তে ম্যাপ করে।
সারাংশ
Parent-Child Object Mapping হল এমন একটি কৌশল যা MapStruct এর মাধ্যমে সহজে সম্পন্ন করা যায়। MapStruct ডোমেইন অবজেক্ট এবং DTO এর মধ্যে ডেটা ট্রান্সফার বা ম্যাপিংয়ের কাজ খুব দ্রুত এবং কার্যকরীভাবে করতে সাহায্য করে, বিশেষত যখন প্যারেন্ট এবং চাইল্ড অবজেক্টের মধ্যে ডেটা ম্যাপ করতে হয়। এটি কোড জেনারেশন এবং টাইপ সেফটি নিশ্চিত করে, যা পারফরম্যান্সে উন্নতি আনে এবং কোডকে পরিষ্কার রাখে।