MapStruct একটি কোড জেনারেশন টুল যা Java Beans এর মধ্যে দ্রুত এবং সঠিকভাবে ডেটা ম্যাপিং করার জন্য ব্যবহৃত হয়। এটি compile-time কোড জেনারেশন করে, যার ফলে runtime তে পারফরম্যান্সের কোনো ক্ষতি হয় না। MapStruct মূলত DTO (Data Transfer Object) এবং Entity ক্লাসগুলির মধ্যে ডেটা ট্রান্সফরমেশন পরিচালনা করে।
এই টিউটোরিয়ালে, আমরা আলোচনা করব কীভাবে MapStruct সেটআপ এবং কনফিগারেশন করা হয়, যাতে আপনি আপনার প্রোজেক্টে সহজেই এটি ব্যবহার করতে পারেন।
১. MapStruct সেটআপ: Maven এর মাধ্যমে
MapStruct সেটআপ করার জন্য, Maven ব্যবহার করা হলে, আপনাকে আপনার pom.xml ফাইলে কিছু নির্দিষ্ট ডিপেনডেন্সি যোগ করতে হবে। এই ডিপেনডেন্সিগুলি মাভেনের মাধ্যমে প্রয়োজনীয় MapStruct লাইব্রেরি এবং কোড জেনারেশন প্লাগইন অন্তর্ভুক্ত করবে।
Maven Configuration:
<dependencies>
<!-- MapStruct API dependency -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.4.2.Final</version> <!-- Use the latest version -->
</dependency>
<!-- Annotation Processor for MapStruct -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.4.2.Final</version>
<scope>provided</scope>
</dependency>
</dependencies>
এখানে:
- mapstruct: এটি মূল MapStruct লাইব্রেরি যা ম্যাপিং ফাংশনালিটি সরবরাহ করে।
- mapstruct-processor: এটি annotation processor যা কম্পাইল টাইমে কোড জেনারেট করতে ব্যবহৃত হয়। এটি provided স্কোপে রাখা হয়েছে কারণ এটি রানটাইমে প্রয়োজন হয় না, কেবল কম্পাইল টাইমে প্রয়োজন।
২. MapStruct সেটআপ: Gradle এর মাধ্যমে
Gradle ব্যবহার করে MapStruct সেটআপ করতে, আপনাকে নিচের ডিপেনডেন্সি এবং প্লাগইন কনফিগারেশন যোগ করতে হবে।
Gradle Configuration:
dependencies {
// MapStruct API dependency
implementation 'org.mapstruct:mapstruct:1.4.2.Final'
// MapStruct Processor (annotation processor)
annotationProcessor 'org.mapstruct:mapstruct-processor:1.4.2.Final'
}
এখানে:
- implementation: এটি
mapstructলাইব্রেরি অন্তর্ভুক্ত করে, যা আপনার কোডে ম্যাপিং ফাংশনালিটি প্রদান করবে। - annotationProcessor: এটি annotation processor অন্তর্ভুক্ত করে, যা কম্পাইল টাইমে কোড জেনারেট করবে।
৩. MapStruct Mapper Interface ডিফাইন করা
MapStruct সেটআপ করার পর, আপনি Mapper Interface ডিফাইন করবেন যেখানে আপনি Java Beans এর মধ্যে ডেটা ম্যাপিং সম্পর্কিত নির্দেশনা প্রদান করবেন। MapStruct অটোমেটিকভাবে এই Interface থেকে কোড জেনারেট করবে।
উদাহরণ:
ধরা যাক আমাদের একটি Person এবং PersonDTO ক্লাস রয়েছে এবং আমরা Person থেকে PersonDTO তে ডেটা ম্যাপ করতে চাই।
Person.java ক্লাস:
public class Person { private String firstName; private String lastName; // getters and setters }PersonDTO.java ক্লাস:
public class PersonDTO { private String firstName; private String lastName; // getters and setters }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); }
এখানে, PersonMapper একটি Mapper Interface যা Person এবং PersonDTO এর মধ্যে ডেটা ম্যাপিংয়ের জন্য ব্যবহৃত হয়। MapStruct এখানে কোড জেনারেট করে, যা ডেটা ম্যাপিং করবে।
৪. MapStruct কোড জেনারেশন
কম্পাইল করার সময়, MapStruct কোড জেনারেট করবে, যা Person এবং PersonDTO ক্লাসের মধ্যে ডেটা ট্রান্সফরমেশন করবে। উদাহরণস্বরূপ, যখন আপনি personToPersonDTO মেথড কল করবেন, তখন এটি Person অবজেক্টের ফিল্ডগুলো PersonDTO তে ট্রান্সফার করবে।
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);
এখানে, PersonMapper.INSTANCE.personToPersonDTO(person) কল করার সময় MapStruct Person অবজেক্টের ফিল্ডগুলো PersonDTO তে ট্রান্সফার করবে।
৫. MapStruct এর জন্য কাস্টম কনভার্সন যুক্ত করা
যদি আপনার ক্লাসের মধ্যে ডেটা ট্রান্সফরমেশন করার জন্য কাস্টম কনভার্সন দরকার হয়, তবে MapStruct আপনাকে @Mapping এনোটেশন এবং কাস্টম মেথড ব্যবহার করার সুবিধা দেয়। কাস্টম কনভার্টার ব্যবহারের মাধ্যমে আপনি বিশেষ ধরনের ডেটা ম্যানিপুলেশন করতে পারেন।
উদাহরণ:
ধরা যাক, Person ক্লাসের একটি birthDate ফিল্ড রয়েছে যা String টাইপে রয়েছে এবং আপনি সেটি Date টাইপে PersonDTO তে ম্যাপ করতে চান।
Person.java ক্লাস:
public class Person { private String firstName; private String lastName; private String birthDate; // getters and setters }PersonDTO.java ক্লাস:
public class PersonDTO { private String firstName; private String lastName; private Date birthDate; // getters and setters }Mapper Interface (কাস্টম কনভার্সন সহ):
import org.mapstruct.Mapper; import org.mapstruct.Mapping; import org.mapstruct.factory.Mappers; import java.text.SimpleDateFormat; import java.util.Date; @Mapper public interface PersonMapper { PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class); @Mapping(source = "birthDate", target = "birthDate", dateFormat = "yyyy-MM-dd") PersonDTO personToPersonDTO(Person person); }
এখানে, @Mapping এনোটেশন ব্যবহার করে birthDate ফিল্ডের জন্য কাস্টম ডেটা ফরম্যাট নির্ধারণ করা হয়েছে।
৬. MapStruct কোড জেনারেশন ডিবাগিং
যদি আপনি MapStruct এর কোড জেনারেশন প্রক্রিয়া ডিবাগ করতে চান, তবে Maven কমান্ডের মাধ্যমে MapStruct এর কোড জেনারেশন লজিক দেখতে পারবেন। Maven কমান্ড দিয়ে আপনি এই কাজটি করতে পারেন:
mvn clean compile
এটি MapStruct কে ডেটা ট্রান্সফরমেশন কোড জেনারেট করতে বলবে এবং আপনি target/generated-sources ডিরেক্টরিতে জেনারেট করা কোড দেখতে পাবেন।
সারাংশ
MapStruct সেটআপ এবং কনফিগারেশন করা খুবই সহজ এবং সরল। মাভেন বা গ্র্যাডেল ব্যবহার করে আপনি এটি আপনার প্রোজেক্টে অন্তর্ভুক্ত করতে পারেন এবং তারপর একটি Mapper Interface ব্যবহার করে বিভিন্ন ক্লাসের মধ্যে ডেটা ম্যাপিং করতে পারেন। MapStruct কম্পাইল টাইমে কোড জেনারেট করে, যার ফলে এটি খুব দ্রুত এবং কার্যকরী পারফরম্যান্স প্রদান করে। আপনি @Mapping এনোটেশন এবং কাস্টম কনভার্সন ব্যবহার করে ডেটা ট্রান্সফরমেশন কাস্টমাইজ করতে পারেন এবং Maven কমান্ডের মাধ্যমে কোড জেনারেশন ডিবাগ করতে পারেন।
MapStruct একটি জনপ্রিয় কোড জেনারেশন টুল যা Java Beans-এর মধ্যে ম্যানুয়াল ট্রান্সফরমেশন কার্যকরভাবে সম্পাদন করে। এটি ডেটা মাপিং কাজটিকে কম্পাইল-টাইমে বাস্তবায়ন করে, ফলে runtime এ পারফরম্যান্সে কোনো ক্ষতি হয় না। মাভেন (Maven) এবং গ্র্যাডল (Gradle) এর মাধ্যমে MapStruct কে আপনার Java প্রোজেক্টে অন্তর্ভুক্ত করা খুবই সহজ।
এই টিউটোরিয়ালে, আমরা দেখব কিভাবে Maven এবং Gradle প্রজেক্টে MapStruct অন্তর্ভুক্ত করা যায়।
১. Maven প্রজেক্টে MapStruct অন্তর্ভুক্ত করা
Maven প্রজেক্টে MapStruct অন্তর্ভুক্ত করার জন্য আপনাকে pom.xml ফাইলে সঠিক ডিপেনডেন্সি এবং অ্যানোটেশন প্রসেসর কনফিগার করতে হবে।
১.১ Maven Dependency Configuration
MapStruct ব্যবহার করার জন্য প্রথমে pom.xml ফাইলে MapStruct এর ডিপেনডেন্সি যোগ করুন:
<dependencies>
<!-- MapStruct Dependency -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.2.Final</version> <!-- Latest Version -->
</dependency>
</dependencies>
<build>
<plugins>
<!-- MapStruct Processor for Annotation -->
<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ডিপেনডেন্সি অন্তর্ভুক্ত করা হয়েছে যা কোড জেনারেশন কার্যক্রম পরিচালনা করবে।mapstruct-processorএকটি অ্যানোটেশন প্রসেসর, যা MapStruct এর জেনারেটেড কোড তৈরির জন্য প্রয়োজনীয়।
১.২ MapStruct Interface উদাহরণ
MapStruct ব্যবহার করার জন্য একটি Mapper Interface তৈরি করতে হবে। এটি আপনার DTO এবং Entity ক্লাসের মধ্যে ডেটা মাপিং সম্পর্কিত নির্দেশনা প্রদান করবে।
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
PersonDTO personToPersonDTO(Person person);
}
এখানে, PersonMapper একটি Mapper Interface যা Person Entity থেকে PersonDTO তে ডেটা ট্রান্সফার করবে। কম্পাইলার MapStruct কে কোড জেনারেট করতে বলে, এবং এটি PersonMapperImpl ক্লাস তৈরি করবে।
১.৩ Maven Build Execution
একবার pom.xml ফাইল কনফিগার হয়ে গেলে, মাভেন বিল্ড চালানোর জন্য নিচের কমান্ডটি ব্যবহার করুন:
mvn clean install
এটি আপনার MapStruct Mapper Interface এর জন্য কোড জেনারেট করবে এবং আপনার প্রোজেক্টে প্রয়োগ করবে।
২. গ্র্যাডল (Gradle) প্রজেক্টে MapStruct অন্তর্ভুক্ত করা
Gradle প্রজেক্টে MapStruct অন্তর্ভুক্ত করার জন্য আপনাকে build.gradle ফাইলে সঠিক ডিপেনডেন্সি এবং প্লাগইন কনফিগার করতে হবে।
২.১ Gradle Dependency Configuration
Gradle প্রোজেক্টে MapStruct অন্তর্ভুক্ত করতে নিম্নলিখিত কনফিগারেশন করুন:
plugins {
id 'java'
}
repositories {
mavenCentral()
}
dependencies {
// MapStruct Dependency
implementation 'org.mapstruct:mapstruct:1.5.2.Final' // Latest Version
// MapStruct Processor Dependency
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.2.Final'
}
compileJava {
options.annotationProcessorPath = configurations.annotationProcessor
}
এখানে:
mapstructডিপেনডেন্সি এবংmapstruct-processorডিপেনডেন্সি Gradle এর মাধ্যমে অন্তর্ভুক্ত করা হয়েছে।- annotationProcessor কনফিগারেশনটি Gradle এর
compileJavaটাস্কে যুক্ত করা হয়েছে।
২.২ MapStruct Interface উদাহরণ
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
PersonDTO personToPersonDTO(Person person);
}
এখানে, একইভাবে MapStruct Interface তৈরি করা হয়েছে যা Person Entity কে PersonDTO তে ম্যাপ করবে।
২.৩ Gradle Build Execution
Gradle প্রোজেক্টে বিল্ড করার জন্য নিচের কমান্ডটি ব্যবহার করুন:
gradle clean build
এটি MapStruct কোড জেনারেশন করবে এবং প্রোজেক্টে প্রয়োগ করবে।
৩. Maven/Gradle প্রজেক্টে MapStruct ব্যবহার করার সুবিধা
- Compile-time Mapping: MapStruct compile-time ডেটা মাপিং সরবরাহ করে, তাই এটি runtime এর সময় পারফরম্যান্সের উপর কোনো নেতিবাচক প্রভাব ফেলে না।
- Type Safety: MapStruct টাইপ সেফটি নিশ্চিত করে, যার ফলে টাইপ সম্পর্কিত ত্রুটি এড়ানো যায়।
- Fast and Efficient: MapStruct কোড জেনারেট করে এবং reflection ব্যবহার করে না, তাই এটি runtime এ দ্রুত কাজ করে।
- Customizable: আপনি সহজেই কাস্টম কনভার্টার, কাস্টম মেথড এবং অন্যান্য কাস্টম ম্যাপিং লজিক প্রয়োগ করতে পারেন।
সারাংশ
Maven এবং Gradle প্রজেক্টে MapStruct অন্তর্ভুক্ত করা সহজ এবং কার্যকরী। Maven এর মাধ্যমে আপনি pom.xml ফাইলে ডিপেনডেন্সি কনফিগার করে এবং Gradle এর মাধ্যমে build.gradle ফাইলে ডিপেনডেন্সি কনফিগার করে আপনার প্রোজেক্টে MapStruct অন্তর্ভুক্ত করতে পারেন। MapStruct এর মাধ্যমে Java Bean ক্লাসগুলির মধ্যে ডেটা মাপিং কাজটি সহজ, দ্রুত এবং টাইপ সেফ ভাবে সম্পাদিত হয়।
MapStruct একটি Java ভিত্তিক অ্যানোটেশন প্রক্রিয়াকরণ লাইব্রেরি যা ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ডেটা ম্যাপিং সহজ করে। এটি compile-time এ কোড জেনারেট করে, ফলে আপনার মডেল ম্যাপিং দ্রুত এবং টাইপ-সেফ হয়।
MapStruct ব্যবহার করতে, আপনাকে IntelliJ IDEA বা Eclipse এ সঠিকভাবে সেটআপ করতে হবে। এখানে, আমরা দেখব কীভাবে IntelliJ IDEA এবং Eclipse এ MapStruct সেটআপ করা যায়।
১. IntelliJ IDEA তে MapStruct সেটআপ
IntelliJ IDEA একটি জনপ্রিয় Java IDE যা MapStruct সহ বিভিন্ন ফ্রেমওয়ার্কের জন্য উন্নত সমর্থন প্রদান করে। IntelliJ IDEA এ MapStruct সেটআপ করার জন্য নিচের স্টেপগুলো অনুসরণ করুন:
১.১ Maven বা Gradle প্রকল্পে MapStruct ডিপেনডেন্সি যোগ করা
আপনার প্রোজেক্টের pom.xml (Maven) বা build.gradle (Gradle) ফাইলে MapStruct ডিপেনডেন্সি যোগ করতে হবে। নিচে একটি উদাহরণ দেওয়া হলো:
Maven:
<dependencies>
<!-- MapStruct Dependency -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.2.Final</version>
</dependency>
<!-- MapStruct Processor for compile-time 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>
Gradle:
dependencies {
implementation 'org.mapstruct:mapstruct:1.5.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.2.Final'
}
১.২ IntelliJ IDEA তে Annotation Processor সক্রিয় করা
MapStruct কোড জেনারেট করতে annotation processing সক্রিয় থাকতে হবে। IntelliJ IDEA এ এটি সক্রিয় করতে:
- File > Settings > Build, Execution, Deployment > Compiler > Annotation Processors এ যান।
- Enable annotation processing চেকবক্সটি সিলেক্ট করুন।
- Obtain processors from project classpath অপশনটি সিলেক্ট করুন।
- Apply এবং OK ক্লিক করুন।
এটি IntelliJ IDEA কে MapStruct প্রসেসর ব্যবহার করতে সক্ষম করবে এবং ম্যাপিং কোড জেনারেট হবে।
১.৩ MapStruct Mapper Interface তৈরি করা
MapStruct ইন্টারফেসের মাধ্যমে ডেটা ম্যাপিং করতে পারেন। উদাহরণ:
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
PersonDTO personToPersonDTO(Person person);
}
১.৪ Compile এবং Run
IntelliJ IDEA তে Build > Rebuild Project ক্লিক করুন, MapStruct স্বয়ংক্রিয়ভাবে ম্যাপিং কোড জেনারেট করবে। তারপর, আপনার মডেল ম্যাপিং সঠিকভাবে কাজ করছে কিনা তা নিশ্চিত করতে টেস্ট কোড চালাতে পারেন।
২. Eclipse তে MapStruct সেটআপ
Eclipse হল আরেকটি জনপ্রিয় Java IDE যা MapStruct এর জন্য সমর্থন প্রদান করে। Eclipse এ MapStruct সেটআপ করতে নিম্নলিখিত স্টেপগুলো অনুসরণ করুন:
২.১ Maven বা Gradle প্রকল্পে MapStruct ডিপেনডেন্সি যোগ করা
Eclipse এ MapStruct ব্যবহার করতে, প্রথমে আপনাকে pom.xml (Maven) বা build.gradle (Gradle) ফাইলে MapStruct ডিপেনডেন্সি যোগ করতে হবে, যা পূর্বে IntelliJ IDEA এ আলোচনা করা হয়েছিল।
২.২ Eclipse এ Annotation Processing সক্রিয় করা
Eclipse এ annotation processing সক্রিয় করার জন্য:
- Window > Preferences এ যান।
- Java > Compiler > Annotation Processing এ যান।
- Enable annotation processing চেকবক্সটি সিলেক্ট করুন।
- Apply এবং OK ক্লিক করুন।
এটি Eclipse কে MapStruct প্রসেসর ব্যবহার করতে সক্ষম করবে।
২.৩ Eclipse তে Build Path কনফিগারেশন
Eclipse এ annotation processor সঠিকভাবে কাজ করার জন্য build path কনফিগার করতে হতে পারে।
- Right-click on project > Properties > Java Build Path এ যান।
- Libraries ট্যাবের নিচে Maven Dependencies সিলেক্ট করুন (যদি Maven ব্যবহার করেন)।
- Add Library > Annotation Processing নির্বাচন করুন।
২.৪ MapStruct Mapper Interface তৈরি করা
Eclipse এ Mapper Interface তৈরি করুন, যেমন:
@Mapper
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
PersonDTO personToPersonDTO(Person person);
}
২.৫ Build এবং Run
Eclipse এ Project > Clean ক্লিক করুন, এর মাধ্যমে MapStruct বিল্ড টাইমে কোড জেনারেট করবে। তারপর, আপনার কোড রান করতে পারেন এবং ম্যাপিং যাচাই করতে পারেন।
৩. Common Issues and Solutions
- Annotation Processor Disabled: যদি কোড জেনারেট না হয়, তবে নিশ্চিত করুন যে আপনি annotation processing সক্রিয় করেছেন, যা IntelliJ IDEA বা Eclipse এ আলাদাভাবে সেট করতে হয়।
- Version Conflict: MapStruct এর কিছু ডিপেনডেন্সি version conflict তৈরি করতে পারে, বিশেষ করে JPA বা Spring Integration এর ক্ষেত্রে। সঠিক সংস্করণ নির্বাচন করুন এবং মাভেন বা গ্র্যাডলে ভার্সন সঠিকভাবে কনফিগার করুন।
- Compilation Errors: যদি আপনার Mapper ইন্টারফেসের মাধ্যমে কোড জেনারেশন কাজ না করে, তাহলে MapStruct এর সঠিক প্লাগইন এবং কোড প্রসেসর ইনস্টল করা আছে কিনা চেক করুন। Eclipse বা IntelliJ IDEA এর ক্যাশে ক্লিয়ার করা উচিত।
সারাংশ
MapStruct এর সাথে কাজ করার জন্য IntelliJ IDEA এবং Eclipse এ কিছু সেটআপ কনফিগারেশন প্রয়োজন। annotation processing সক্রিয় করে আপনি MapStruct ব্যবহার করে compile-time ম্যাপিং কোড জেনারেট করতে পারেন। IntelliJ IDEA এবং Eclipse উভয় IDE তে MapStruct সেটআপ করার জন্য প্রয়োজনীয় ডিপেনডেন্সি এবং কনফিগারেশন যথাযথভাবে ব্যবহার করুন, যাতে আপনার ডোমেইন অবজেক্ট এবং DTO এর মধ্যে ডেটা ট্রান্সফার সহজে পরিচালিত হয়।
MapStruct একটি Java annotation processor ভিত্তিক মডেল ম্যাপিং টুল যা ডোমেইন অবজেক্ট এবং ডেটা ট্রান্সফার অবজেক্ট (DTO) এর মধ্যে ম্যাপিং সম্পন্ন করে। এটি কোড জেনারেশন প্রযুক্তি ব্যবহার করে এবং compile-time এ কোড জেনারেট করে, যা পারফরম্যান্সে উন্নতি আনে। MapStruct ব্যবহার করার জন্য আপনাকে কিছু ডিপেনডেন্সি এবং প্লাগইন pom.xml (Maven) বা build.gradle (Gradle) ফাইলে যুক্ত করতে হবে।
এই গাইডে, আমরা MapStruct এর প্রয়োজনীয় ডিপেনডেন্সি এবং প্লাগিন কনফিগারেশন দেখব, যা Maven এবং Gradle উভয় প্রোজেক্টেই কার্যকরী হবে।
১. MapStruct ডিপেনডেন্সি যুক্ত করা (Maven)
প্রথমত, আপনাকে MapStruct এবং MapStruct Processor ডিপেনডেন্সি pom.xml ফাইলে যুক্ত করতে হবে। এটি আপনার প্রোজেক্টে MapStruct এর কার্যকারিতা চালু করবে এবং compile-time কোড জেনারেশন সমর্থন করবে।
Maven Dependency:
<dependencies>
<!-- MapStruct Dependency -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>1.5.2.Final</version>
</dependency>
<!-- MapStruct Processor Dependency for compile-time code generation -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.5.2.Final</version>
<scope>provided</scope>
</dependency>
</dependencies>
Maven Compiler Plugin Configuration:
MapStruct একটি annotation processor ব্যবহার করে কোড জেনারেট করে, তাই maven-compiler-plugin এর কনফিগারেশন pom.xml ফাইলে যুক্ত করতে হবে।
<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>
এখানে, maven-compiler-plugin কনফিগারেশন ব্যবহার করে annotationProcessorPaths-এ MapStruct Processor এর ডিপেনডেন্সি যোগ করা হয়েছে, যা কম্পাইল টাইমে ম্যাপিং কোড জেনারেট করবে।
২. MapStruct ডিপেনডেন্সি যুক্ত করা (Gradle)
যদি আপনি Gradle ব্যবহার করেন, তবে আপনাকে MapStruct এবং MapStruct Processor ডিপেনডেন্সি build.gradle ফাইলে যুক্ত করতে হবে।
Gradle Dependency:
dependencies {
// MapStruct Dependency
implementation 'org.mapstruct:mapstruct:1.5.2.Final'
// MapStruct Processor for compile-time code generation
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.2.Final'
}
Gradle Compiler Plugin Configuration:
Gradle এ MapStruct প্রক্রিয়া সমর্থন করতে, আপনাকে annotationProcessor কনফিগারেশন ব্যবহার করতে হবে যাতে MapStruct Processor সঠিকভাবে কাজ করতে পারে।
plugins {
id 'java'
}
dependencies {
implementation 'org.mapstruct:mapstruct:1.5.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.2.Final'
}
এখানে, annotationProcessor ব্যবহার করে MapStruct Processor ডিপেনডেন্সি যুক্ত করা হয়েছে।
৩. MapStruct এর প্রয়োজনীয় ডিপেনডেন্সি সমূহ
MapStruct ব্যবহারের জন্য সাধারণত নিম্নলিখিত ডিপেনডেন্সিগুলি প্রয়োজন:
- mapstruct: এটি মূল MapStruct লাইব্রেরি যা ম্যাপিং ফিচার সরবরাহ করে।
- mapstruct-processor: এটি annotation processor যা compile-time কোড জেনারেট করে।
- spring (যদি Spring এর সাথে ব্যবহার করতে চান): MapStruct Spring ফ্রেমওয়ার্কের সাথে ইন্টিগ্রেট করতে সহায়তা করে।
৪. Spring Integration with MapStruct
যদি আপনি Spring Framework বা Spring Boot ব্যবহার করেন, তবে MapStruct এর সাথে Spring ইন্টিগ্রেট করার জন্য আপনাকে componentModel = "spring" কনফিগারেশন ব্যবহার করতে হবে।
Spring Integration Example:
@Mapper(componentModel = "spring")
public interface PersonMapper {
PersonDTO personToPersonDTO(Person person);
}
এখানে, componentModel = "spring" ব্যবহার করে MapStruct কে Spring Bean হিসেবে কনফিগার করা হয়েছে। এর ফলে Spring এটি স্বয়ংক্রিয়ভাবে ইনজেক্ট করবে।
৫. IntelliJ IDEA এবং Eclipse এ MapStruct সেটআপ
IntelliJ IDEA:
- Maven Project: IntelliJ IDEA তে Maven প্রোজেক্টে MapStruct ব্যবহার করতে হলে, আপনার pom.xml ফাইলে উপরের ডিপেনডেন্সি যোগ করতে হবে। IntelliJ IDEA স্বয়ংক্রিয়ভাবে MapStruct এর সাথে ইন্টিগ্রেট হয়ে যাবে।
- Gradle Project: যদি আপনি Gradle ব্যবহার করেন, তবে build.gradle ফাইলে ডিপেনডেন্সি যোগ করুন।
- IntelliJ IDEA তে MapStruct অ্যানোটেশন প্রসেসর চালু থাকতে হবে, যাতে কোড জেনারেট করা হয়।
Eclipse:
- Maven Project: Eclipse এ Maven প্রোজেক্টে MapStruct ব্যবহারের জন্য আপনাকে pom.xml ফাইলে ডিপেনডেন্সি যুক্ত করতে হবে। তারপর Maven Build চালিয়ে কোড জেনারেট করা যাবে।
- Gradle Project: Eclipse Gradle প্লাগইন ব্যবহার করে Gradle প্রোজেক্টের জন্য উপরের ডিপেনডেন্সি যুক্ত করুন।
- Eclipse তে MapStruct অ্যানোটেশন প্রসেসর চালু করা নিশ্চিত করুন।
৬. MapStruct এর পক্ষে কিছু অতিরিক্ত সুবিধা
- Compile-time code generation: এতে রানটাইমে পারফরম্যান্সের উপর কোনো প্রভাব পড়ে না, কারণ ম্যাপিং কোড compile-time এ তৈরি হয়।
- No Reflection: MapStruct সাধারণভাবে reflection ব্যবহার করে না, যা সাধারণ JavaBeans এবং DTO ম্যাপিং লাইব্রেরির তুলনায় বেশি দ্রুত।
- Type Safety: এটি টাইপ সেফটি প্রদান করে, ফলে টাইপ মিসম্যাচের কারণে ত্রুটি কম হয়।
- Custom Mappings: MapStruct কাস্টম ম্যাপিং এর সুযোগ প্রদান করে, যেমন কাস্টম কনভার্সন লজিক, এনাম (enum) ম্যাপিং ইত্যাদি।
সারাংশ
MapStruct ব্যবহার করার জন্য Maven বা Gradle প্রোজেক্টে প্রয়োজনীয় ডিপেনডেন্সি এবং প্লাগইন কনফিগারেশন করা হয়। এটি টাইপ সেফ মডেল ম্যাপিং প্রদান করে এবং compile-time এ কোড জেনারেট করে, যা পারফরম্যান্সে ভালো ফলাফল দেয়। Spring এর সাথে ইন্টিগ্রেশন করার জন্য আপনি componentModel = "spring" কনফিগারেশন ব্যবহার করতে পারেন। IntelliJ IDEA এবং Eclipse তে এটি সহজেই ইন্টিগ্রেট করা যায় এবং এর মাধ্যমে আপনাকে ম্যাপিং কোড স্বয়ংক্রিয়ভাবে জেনারেট করতে সহায়তা করে।
MapStruct একটি Java লাইব্রেরি যা ডোমেইন অবজেক্ট থেকে DTO (Data Transfer Object) তে ডেটা ম্যাপিং অটোমেটিকভাবে করতে ব্যবহৃত হয়। এটি কোড জেনারেটর হিসেবে কাজ করে, যার মাধ্যমে আপনি কমপাইল টাইমে দ্রুত এবং নিরাপদভাবে ডেটা কনভার্সন করতে পারেন।
এই টিউটোরিয়ালে আমরা একটি Hello World প্রোগ্রাম তৈরি করবো যেখানে MapStruct ব্যবহার করে দুটি অবজেক্টের মধ্যে ডেটা ম্যাপিং করা হবে।
১. প্রথম MapStruct প্রোগ্রাম তৈরি করার জন্য প্রয়োজনীয় কনফিগারেশন
প্রথমেই, MapStruct ব্যবহার করার জন্য আপনার প্রোজেক্টে প্রয়োজনীয় ডিপেনডেন্সি যোগ করতে হবে। আমরা Maven ব্যবহার করবো, তবে আপনি চাইলে Gradle ব্যবহার করতে পারেন।
১.১ Maven Dependency Configuration
প্রথমে pom.xml ফাইলে MapStruct এর ডিপেনডেন্সি এবং কোড জেনারেটর কনফিগারেশন যোগ করুন:
<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 ডিপেনডেন্সি মূল লাইব্রেরি হিসাবে কাজ করবে।
- mapstruct-processor কোড জেনারেটরের জন্য প্রয়োজনীয় ডিপেনডেন্সি।
- maven-compiler-plugin এর মাধ্যমে annotationProcessorPaths ব্যবহার করে MapStruct কোড জেনারেট করতে সক্ষম হবে।
২. MapStruct Hello World Example
ধরা যাক, আমাদের একটি Person ক্লাস আছে এবং আমরা সেই ক্লাস থেকে একটি PersonDTO ক্লাসে ডেটা ট্রান্সফার করতে চাই। আমরা MapStruct ব্যবহার করে এই কাজটি সম্পন্ন করবো।
২.১ Person.java (Domain Object)
public class Person {
private String name;
private int age;
// Constructor
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getters and Setters
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
এখানে, Person ক্লাসটি আমাদের ডোমেইন অবজেক্ট, যেখানে name এবং age ফিল্ড রয়েছে।
২.২ PersonDTO.java (Data Transfer Object)
public class PersonDTO {
private String fullName;
private int age;
// Constructor
public PersonDTO(String fullName, int age) {
this.fullName = fullName;
this.age = 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;
}
}
এখানে, PersonDTO ক্লাসে fullName এবং age ফিল্ড রয়েছে। লক্ষ্য করুন যে, fullName ফিল্ডে Person ক্লাসের name ফিল্ডটি ম্যাপ করা হবে।
২.৩ PersonMapper.java (Mapper Interface)
এখন আমাদের MapStruct ম্যাপিং ইন্টারফেস তৈরি করতে হবে যেখানে আমরা @Mapper অ্যানোটেশন ব্যবহার করবো।
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 কে জানিয়ে দেয় যে এটি একটি ম্যাপিং ইন্টারফেস।
- personToPersonDTO: এই মেথডটির মাধ্যমে আমরা
Personঅবজেক্টকেPersonDTOতে ম্যাপ করবো।
২.৪ Main.java (Usage Example)
এখন আমরা Main ক্লাসে ম্যাপিংয়ের উদাহরণ দেখবো:
public class Main {
public static void main(String[] args) {
// Creating Person instance
Person person = new Person("John Doe", 30);
// Using MapStruct to map Person to PersonDTO
PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);
// Print PersonDTO details
System.out.println("Full Name: " + personDTO.getFullName());
System.out.println("Age: " + personDTO.getAge());
}
}
এখানে:
- Person অবজেক্ট তৈরি করা হয়েছে এবং MapStruct এর মাধ্যমে PersonDTO তে ডেটা ম্যাপ করা হয়েছে।
- তারপর,
PersonDTOএরfullNameএবংageফিল্ডগুলো প্রিন্ট করা হয়েছে।
২.৫ Output:
এই কোডটি রান করলে নিম্নলিখিত আউটপুটটি পাবেন:
Full Name: John Doe
Age: 30
এটি সফলভাবে Person অবজেক্ট থেকে PersonDTO তে ডেটা ম্যাপ করার প্রক্রিয়াটি সম্পন্ন করেছে।
৩. MapStruct এর সুবিধা
- Compile-time Code Generation: MapStruct কোড জেনারেট করার জন্য compile-time ব্যবহার করে, যার ফলে রানটাইম পারফরম্যান্সে কোনো সমস্যা হয় না।
- Type Safety: MapStruct টাইপ সেফ ম্যাপিং নিশ্চিত করে, অর্থাৎ যদি টাইপ বা ফিল্ডের নামের মধ্যে কোনো ত্রুটি থাকে, তাহলে কম্পাইল টাইমে ত্রুটি দেখানো হবে।
- Customization: এটি কাস্টম ম্যাপিং, এক্সপ্রেশন এবং কনভার্সন সমর্থন করে।
- Integration with Spring and Other Frameworks: MapStruct Spring ফ্রেমওয়ার্ক এবং অন্যান্য Java ফ্রেমওয়ার্কের সাথে সহজে ইন্টিগ্রেট করা যায়।
সারাংশ
এই টিউটোরিয়ালে আমরা একটি Hello World MapStruct প্রোগ্রাম তৈরি করেছি যেখানে Person অবজেক্ট থেকে PersonDTO তে ডেটা ম্যাপিং করা হয়েছে। MapStruct এর সাহায্যে, আপনি অটোমেটিকভাবে কোড জেনারেট করে Entity এবং DTO এর মধ্যে ম্যাপিং করতে পারেন, যা ডেভেলপমেন্টের সময় এবং প্রচেষ্টা অনেকটা কমিয়ে দেয়। এর মাধ্যমে আপনি কমপ্লেক্স ডেটা ট্রান্সফরমেশন সহজভাবে করতে পারবেন এবং কোডের গুণগত মান উন্নত করতে পারবেন।
Read more