MapStruct হল একটি জনপ্রিয় Java লাইব্রেরি যা ডেটা ম্যাপিং বা অবজেক্ট কনভার্সন সহজ এবং দ্রুত সম্পন্ন করার জন্য ব্যবহৃত হয়। এটি compile-time code generation ব্যবহার করে, যার ফলে runtime পারফরম্যান্সে কোনো প্রভাব পড়ে না। @Mapper অ্যানোটেশন MapStruct এর সবচেয়ে গুরুত্বপূর্ণ অ্যানোটেশন, যা ম্যাপিং ইন্টারফেসে ব্যবহার করা হয় এবং এর মাধ্যমে মডেল ম্যাপিং সম্পর্কিত কার্যাবলী সম্পাদন করা হয়।
এই টিউটোরিয়ালে, আমরা @Mapper অ্যানোটেশন এর ব্যবহার এবং তার বিভিন্ন বৈশিষ্ট্য আলোচনা করব।
১. @Mapper অ্যানোটেশন কি?
@Mapper অ্যানোটেশন MapStruct লাইব্রেরির একটি প্রধান অ্যানোটেশন, যা একটি interface বা abstract class এর মধ্যে ব্যবহার করা হয়। এটি ডোমেইন অবজেক্টের মধ্যে ডেটা ম্যাপিং বা কনভার্সন প্রক্রিয়াটি পরিচালনা করে। যখন আপনি @Mapper অ্যানোটেশন ব্যবহার করেন, MapStruct কোড জেনারেট করে যা নির্দিষ্ট ফিল্ডগুলির মধ্যে ডেটা কপি করবে।
উদাহরণ:
ধরা যাক, আমাদের দুটি ক্লাস রয়েছে — Person এবং PersonDTO — এবং আমরা Person অবজেক্ট থেকে PersonDTO তে ডেটা ম্যাপ করতে চাই।
public class Person {
private String firstName;
private String lastName;
private int age;
// getters and setters
}
public class PersonDTO {
private String fullName;
private int age;
// getters and setters
}
এখন, MapStruct ব্যবহার করে, firstName এবং lastName ফিল্ডগুলোকে fullName এ কনভার্ট করা হবে।
২. @Mapper অ্যানোটেশন ব্যবহার করে ডেটা ম্যাপিং
MapStruct ব্যবহার করার জন্য প্রথমে একটি Mapper Interface তৈরি করতে হবে, যেখানে @Mapper অ্যানোটেশন ব্যবহার করা হবে।
উদাহরণ: Basic Mapper 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 কে জানায় যে এটি একটি ম্যাপিং ইন্টারফেস।Mappers.getMapper(): এটি MapStruct এর মাধ্যমেPersonMapperইন্টারফেসের একটি ইনস্ট্যান্স তৈরি করে।
২.১ Mapper Interface এর কার্যপদ্ধতি:
এখন, PersonMapper ইন্টারফেসের personToPersonDTO() মেথডটি Person অবজেক্ট থেকে PersonDTO অবজেক্টে ডেটা ম্যাপ করবে।
৩. @Mapper অ্যানোটেশনের অন্যান্য বৈশিষ্ট্য
৩.১ componentModel অ্যানোটেশন:
MapStruct এর @Mapper অ্যানোটেশনে componentModel প্রপার্টি ব্যবহার করে আপনি এটি Spring বা অন্য কোনো ফ্রেমওয়ার্কের সাথে ইন্টিগ্রেট করতে পারেন। যদি আপনি Spring ব্যবহার করতে চান, তবে আপনি componentModel = "spring" সেট করতে পারেন। এটি MapStruct কে Spring Bean হিসাবে কাজ করতে নির্দেশ দেয়।
উদাহরণ: Spring Integration
@Mapper(componentModel = "spring")
public interface PersonMapper {
PersonDTO personToPersonDTO(Person person);
}
এখানে, componentModel = "spring" এর মাধ্যমে PersonMapper একটি Spring Bean হিসাবে তৈরি হবে, যা Spring Container দ্বারা ইনজেক্ট করা যাবে।
৩.২ @Mapping অ্যানোটেশন ব্যবহার করা:
@Mapper এর মাধ্যমে আপনি field mappings নির্দিষ্ট করতে পারেন। আপনি যেভাবে ফিল্ডগুলির মধ্যে ডেটা ম্যাপ করতে চান, তা @Mapping অ্যানোটেশন ব্যবহার করে কনফিগার করতে পারবেন।
উদাহরণ: Field Mapping
@Mapper
public interface PersonMapper {
@Mapping(source = "firstName", target = "fullName")
PersonDTO personToPersonDTO(Person person);
}
এখানে, @Mapping অ্যানোটেশন ব্যবহার করে firstName ফিল্ডটি fullName ফিল্ডে ম্যাপ করা হচ্ছে।
৩.৩ @Mapping এবং Expression Based Mapping:
কখনও কখনও আপনি কাস্টম mapping expressions ব্যবহার করতে চাইতে পারেন, যেখানে আপনি Java expressions ব্যবহার করে ডেটা ম্যাপ করতে পারেন।
উদাহরণ: Expression Based Mapping
@Mapper
public interface PersonMapper {
@Mapping(target = "fullName", expression = "java(person.getFirstName() + \" \" + person.getLastName())")
PersonDTO personToPersonDTO(Person person);
}
এখানে, expression ব্যবহার করে firstName এবং lastName এর মধ্যে স্পেস দিয়ে fullName তৈরি করা হচ্ছে।
৪. MapStruct এবং Collection Mapping
MapStruct List বা Set এর মতো Collection টাইপের ডেটা ম্যাপিং সমর্থন করে। আপনি একটি List অবজেক্টকে অন্য List বা Set এ ম্যাপ করতে পারেন।
উদাহরণ: Collection Mapping
@Mapper
public interface PersonMapper {
List<PersonDTO> personListToPersonDTOList(List<Person> personList);
}
এখানে, List থেকে List তে ডেটা ম্যাপ হচ্ছে।
৫. কাস্টম কনভার্টার ব্যবহার করা
MapStruct কাস্টম কনভার্টার ব্যবহার করার সুবিধাও প্রদান করে, যেখানে আপনি নিজস্ব লজিক প্রয়োগ করতে পারেন।
উদাহরণ: Custom Converter
@Mapper
public interface PersonMapper {
@Mapping(source = "birthDate", target = "birthYear", qualifiedByName = "convertToYear")
PersonDTO personToPersonDTO(Person person);
@Named("convertToYear")
default int convertToYear(Date birthDate) {
return birthDate.getYear();
}
}
এখানে, @Named অ্যানোটেশন ব্যবহার করে একটি কাস্টম কনভার্টার তৈরি করা হয়েছে যা birthDate থেকে birthYear তৈরি করবে।
৬. @Mapper এবং Default Methods
MapStruct ইন্টারফেসে default methods সমর্থন করে, যার মাধ্যমে আপনি কিছু লজিক বাস্তবায়ন করতে পারেন যা ম্যাপিংয়ের অংশ।
উদাহরণ: Default Method
@Mapper
public interface PersonMapper {
PersonDTO personToPersonDTO(Person person);
default String getFullName(String firstName, String lastName) {
return firstName + " " + lastName;
}
}
এখানে, default method ব্যবহার করা হয়েছে যা firstName এবং lastName এর মধ্যে স্পেস দিয়ে fullName তৈরি করবে।
সারাংশ
MapStruct একটি শক্তিশালী এবং টাইপ-সেফ Object Mapping লাইব্রেরি যা Java Beans বা DTO এবং Entity এর মধ্যে ডেটা কনভার্সন অটোমেটিকভাবে সম্পন্ন করতে ব্যবহৃত হয়। @Mapper অ্যানোটেশনটি MapStruct এর মূল বৈশিষ্ট্য, যা ম্যাপিং ইন্টারফেস হিসেবে কাজ করে। এটি ফিল্ড ম্যাপিং, কাস্টম কনভার্সন, স্প্রিং ইন্টিগ্রেশন এবং কাস্টম এক্সপ্রেশন সমর্থন করে, যা ডেটা কনভার্সনকে আরো নমনীয় এবং কার্যকরী করে তোলে।
Read more