MapStruct হল একটি Java annotation processor যা object mapping বা DTO (Data Transfer Object) মডেল ম্যাপিং স্বয়ংক্রিয়ভাবে সম্পন্ন করে। এটি মূলত compile-time এ কোড জেনারেট করে, যার ফলে রানটাইম পারফরম্যান্সে কোনো সমস্যা সৃষ্টি হয় না। MapStruct-এর নতুন সংস্করণে বিভিন্ন নতুন ফিচার এবং উন্নয়ন আনা হয়েছে, যা ডেভেলপারদের জন্য আরো কার্যকরী এবং সুবিধাজনক করেছে।
এই টিউটোরিয়ালে আমরা MapStruct এর নতুন সংস্করণে যোগ হওয়া গুরুত্বপূর্ণ ফিচার এবং উন্নয়ন নিয়ে আলোচনা করব।
১. Enhanced Null Handling
MapStruct-এর নতুন সংস্করণে null handling এর উন্নয়ন করা হয়েছে। এখন, আপনি আরও সহজে নির্দিষ্ট ডোমেইন অবজেক্টের null ফিল্ডগুলিকে ম্যাপিং করতে পারবেন এবং এর সাথে null-safe mapping সুবিধাও যোগ করা হয়েছে।
উদাহরণ:
@Mapper
public interface EmployeeMapper {
@Mapping(target = "fullName", source = "firstName", nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS)
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, nullValueCheckStrategy = NullValueCheckStrategy.ALWAYS ব্যবহার করার মাধ্যমে, যখন firstName null হবে, তখন এটি fullName এ null ভ্যালু সেট করবে।
২. Mapping of Collections and Arrays
MapStruct এখন Collections এবং Arrays এর মধ্যে ম্যাপিং সহজ এবং সরাসরি করতে সক্ষম। আগের সংস্করণে কিছু সীমাবদ্ধতা থাকলেও, নতুন সংস্করণে আপনি List, Set এবং Array এর মধ্যে ম্যাপিং করতে পারবেন খুবই সহজভাবে।
উদাহরণ:
@Mapper
public interface EmployeeMapper {
List<EmployeeDTO> employeesToEmployeeDTOs(List<Employee> employees);
}
এখানে, List<Employee> কে List<EmployeeDTO> তে ম্যাপ করা হচ্ছে। MapStruct স্বয়ংক্রিয়ভাবে সঠিক ম্যাপিং কোড জেনারেট করবে।
৩. Improved Enum Mapping
Enum এর মধ্যে ম্যাপিং আগের সংস্করণে কিছু কাস্টমাইজেশনের প্রয়োজন ছিল, কিন্তু বর্তমানে Enum Mapping আরও সহজ এবং কার্যকরী হয়ে উঠেছে। MapStruct এর নতুন সংস্করণে Enum to Enum এবং String to Enum ম্যাপিং আরো উন্নত হয়েছে।
উদাহরণ: Enum to Enum Mapping
enum Gender {
MALE, FEMALE
}
enum GenderDTO {
M, F
}
@Mapper
public interface GenderMapper {
@Mapping(source = "gender", target = "genderDTO")
GenderDTO genderToGenderDTO(Gender gender);
}
এখানে, Gender কে GenderDTO তে ম্যাপ করা হচ্ছে। MapStruct এই ম্যাপিংয়ের জন্য কোড জেনারেট করবে।
String to Enum Mapping Example:
enum Gender {
MALE, FEMALE
}
@Mapper
public interface GenderMapper {
@Mapping(source = "gender", target = "genderEnum")
Gender stringToGender(String gender);
}
এখানে, একটি String ফিল্ডকে Gender Enum তে ম্যাপ করা হচ্ছে।
৪. Support for Default Methods in Mappers
MapStruct 1.4 সংস্করণ থেকে default methods এর সমর্থন যোগ করা হয়েছে, যা আপনাকে মাপিং ইন্টারফেসে ডিফল্ট মেথড যুক্ত করার সুযোগ দেয়। এই ফিচারটি ম্যাপিংয়ের জন্য কমপ্লেক্স লজিক বা ডিফল্ট ভ্যালু সেট করতে সহায়তা করে।
উদাহরণ:
@Mapper
public interface EmployeeMapper {
default String mapGender(Gender gender) {
if (gender == null) {
return "Unknown";
}
return gender.name();
}
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, mapGender মেথডটি একটি ডিফল্ট মেথড যা null চেক করে এবং Gender Enum থেকে String এ ম্যাপিং করে।
৫. Enhanced Mapping of Java 8 Time API
Java 8 এ নতুন Time API (যেমন LocalDate, LocalDateTime, ZonedDateTime) যুক্ত করা হয়েছে, এবং MapStruct নতুন সংস্করণে এই টাইপগুলির জন্য ম্যাপিং সমর্থন যোগ করেছে। এর ফলে LocalDate বা LocalDateTime কে String বা অন্যান্য টাইপে ম্যাপ করা সহজ হয়েছে।
উদাহরণ:
@Mapper
public interface EmployeeMapper {
@Mapping(source = "dateOfBirth", target = "dob")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
default String mapLocalDateToString(LocalDate date) {
return date != null ? date.toString() : null;
}
}
এখানে, LocalDate কে String এ ম্যাপিং করা হয়েছে।
৬. Support for MapStruct in Spring and JPA Projects
MapStruct এখন আরও ভালোভাবে Spring এবং JPA প্রোজেক্টের সাথে ইন্টিগ্রেট করা যায়। componentModel = "spring" এর মাধ্যমে Spring Bean হিসেবে ইন্টারফেস ইনজেক্ট করা যায় এবং JPA এর মধ্যে Entity-to-DTO বা DTO-to-Entity ম্যাপিং করা সহজ হয়েছে।
Spring Integration Example:
@Mapper(componentModel = "spring")
public interface EmployeeMapper {
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, componentModel = "spring" ব্যবহার করে MapStruct কে Spring Bean হিসেবে কনফিগার করা হয়েছে।
৭. Builder Pattern Support
MapStruct এখন Builder Pattern এর সমর্থন যোগ করেছে, যার মাধ্যমে আপনি বিভিন্ন ডোমেইন অবজেক্টের জন্য Builder প্যাটার্ন ব্যবহার করতে পারেন। এতে, আপনার ডোমেইন অবজেক্টের ইনস্ট্যান্স তৈরি করার জন্য অ্যাক্সেসর মেথড ব্যবহার করা হয়।
উদাহরণ: Using Builder Pattern
@Mapper
public interface EmployeeMapper {
@Mapping(target = "employeeName", source = "name")
EmployeeDTO employeeToEmployeeDTO(Employee employee);
}
এখানে, employeeName ফিল্ডে Builder Pattern ব্যবহার করা হচ্ছে, যা EmployeeDTO এর বিল্ডিং কোড জেনারেট করবে।
সারাংশ
MapStruct এর নতুন সংস্করণে অনেক নতুন ফিচার এবং উন্নয়ন যোগ করা হয়েছে যা ডেভেলপারদের কাজকে সহজ এবং দ্রুত করেছে। Null handling, Enum mapping, Spring integration, Collections and Arrays mapping সহ অনেক নতুন ফিচারগুলো MapStruct কে আরও শক্তিশালী এবং ব্যবহারকারী বান্ধব করে তুলেছে। MapStruct এর নতুন সংস্করণ ব্যবহার করে আপনি দ্রুত, নিরাপদ এবং কার্যকরীভাবে কোড জেনারেট করতে পারবেন, বিশেষ করে জটিল ম্যাপিং এবং কাস্টম কনভার্সন প্রক্রিয়ার জন্য।