MapStruct একটি কোড জেনারেশন লাইব্রেরি যা Java ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ম্যাপিং সরবরাহ করে। এটি compile-time এ কোড জেনারেট করে এবং কোড পারফরম্যান্সে উন্নতি আনে। CDI (Contexts and Dependency Injection) হল একটি Java EE ফিচার যা dependency injection এর মাধ্যমে অবজেক্ট এবং সেবা গুলি ইন্সট্যানশিয়েট এবং ম্যানেজ করতে সহায়তা করে। MapStruct এবং CDI একসাথে ব্যবহার করলে আপনি সহজেই MapStruct Mapper অবজেক্টগুলিকে CDI কনটেইনারে সংযুক্ত করে ম্যাপিং কাজটি করতে পারেন।
এই টিউটোরিয়ালে, আমরা দেখব কিভাবে CDI (Contexts and Dependency Injection) এর মাধ্যমে MapStruct ব্যবহার করা যায়।
১. CDI এবং MapStruct এর সাথে কাজ করা
MapStruct ব্যবহার করার সময়, আপনি যখন Spring বা CDI ফ্রেমওয়ার্ক ব্যবহার করেন, তখন MapStruct এর componentModel = "cdi" কনফিগারেশন ব্যবহার করে MapStruct কে CDI কনটেইনারে ইনজেক্ট করতে পারেন।
১.১ CDI Integration for MapStruct
MapStruct কে CDI এর মাধ্যমে ব্যবহার করতে, আপনার Mapper Interface এ componentModel = "cdi" অ্যাট্রিবিউট যুক্ত করতে হবে। এর মাধ্যমে MapStruct নিজে CDI কনটেইনারের মধ্যে Bean হিসেবে রেজিস্টার হয়ে যাবে এবং এটিকে স্বয়ংক্রিয়ভাবে @Inject এর মাধ্যমে ইন্সট্যানশিয়েট করা যাবে।
২. CDI তে MapStruct ব্যবহার করার উদাহরণ
ধরা যাক আমাদের দুটি অবজেক্ট রয়েছে: Person এবং PersonDTO, এবং আমরা CDI এর মাধ্যমে MapStruct ম্যাপিং তৈরি করতে চাই।
২.১ Person.java (Domain Object)
public class Person {
private String name;
private int age;
// Getters and Setters
}
২.২ PersonDTO.java (DTO Object)
public class PersonDTO {
private String name;
private int age;
// Getters and Setters
}
২.৩ PersonMapper.java (MapStruct Mapper Interface)
এখানে, componentModel = "cdi" কনফিগারেশন সহ MapStruct Mapper Interface তৈরি করা হয়েছে। এটি CDI কনটেইনারে ইনজেক্ট হতে সক্ষম।
import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;
@Mapper(componentModel = "cdi")
public interface PersonMapper {
PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);
PersonDTO personToPersonDTO(Person person);
}
এখানে, @Mapper(componentModel = "cdi") ব্যবহার করা হয়েছে, যা MapStruct কে CDI কনটেইনারের মধ্যে রেজিস্টার করতে সহায়তা করে।
২.৪ CDI কনটেইনারের মধ্যে ব্যবহার
এখন, আপনি এই Mapper ইন্টারফেসটি CDI কনটেইনারে ইনজেক্ট করতে পারবেন। নিচে একটি CDI Bean ব্যবহার করে PersonMapper ইনজেক্ট করা হয়েছে:
import javax.inject.Inject;
public class PersonService {
@Inject
private PersonMapper personMapper;
public PersonDTO convertPersonToDTO(Person person) {
return personMapper.personToPersonDTO(person);
}
}
এখানে, @Inject অ্যানোটেশন ব্যবহার করা হয়েছে, যার মাধ্যমে CDI কনটেইনার স্বয়ংক্রিয়ভাবে PersonMapper কে ইনজেক্ট করবে এবং ম্যাপিং প্রক্রিয়া সম্পন্ন করবে।
৩. CDI (Contexts and Dependency Injection) সম্পর্কে সংক্ষেপে
CDI (Contexts and Dependency Injection) Java EE বা Jakarta EE এর একটি ফিচার, যা dependency injection (DI) এবং context management এর মাধ্যমে অবজেক্ট এবং সেবা ইনজেক্ট করে। CDI-র মাধ্যমে আপনি অবজেক্টের lifecycle এবং dependencies সহজে ম্যানেজ করতে পারেন, যা কোডের রিয়ুসেবিলিটি, টেস্টেবিলিটি এবং রিডেবিলিটি বৃদ্ধি করে।
৪. CDI-র মাধ্যমে MapStruct এর সুবিধা
- Seamless Integration: CDI কনটেইনারের মাধ্যমে MapStruct কে সহজে ইনজেক্ট করা যায় এবং এর কার্যকারিতা বাড়ানো যায়।
- No Manual Instantiation: CDI কনটেইনার স্বয়ংক্রিয়ভাবে MapStruct Mapper Bean ইন্সট্যানশিয়েট করে, ফলে ম্যানুয়াল ইনস্ট্যানশিয়েশন থেকে রক্ষা পাওয়া যায়।
- Testability: CDI ফ্রেমওয়ার্ক ব্যবহারের ফলে কোড টেস্টিং এবং মকিং সহজ হয়, বিশেষ করে ইনজেক্ট করা অবজেক্টের মাধ্যমে।
৫. MapStruct এবং CDI ব্যবহারের জন্য প্রয়োজনীয় ডিপেনডেন্সি
MapStruct এবং CDI এর মাধ্যমে ম্যাপিং ব্যবহারের জন্য কিছু অতিরিক্ত ডিপেনডেন্সি আপনার pom.xml বা build.gradle ফাইলে যোগ করতে হবে।
৫.১ Maven Dependency (MapStruct and CDI)
<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>
<!-- CDI Dependency (if not already included) -->
<dependency>
<groupId>javax.enterprise</groupId>
<artifactId>cdi-api</artifactId>
<version>2.0</version>
</dependency>
</dependencies>
৫.২ Gradle Dependency (MapStruct and CDI)
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'
// CDI Dependency
implementation 'javax.enterprise:cdi-api:2.0'
}
৬. সারাংশ
MapStruct এবং CDI একত্রে ব্যবহারের মাধ্যমে আপনি Java প্রোজেক্টে অটোমেটিক ম্যাপিং এবং ডিপেনডেন্সি ইনজেকশন সুবিধা পেতে পারেন। MapStruct এর componentModel = "cdi" কনফিগারেশনের মাধ্যমে এটি CDI কনটেইনারে রেজিস্টার করা যায় এবং @Inject অ্যানোটেশন ব্যবহার করে আপনি CDI কনটেইনার থেকে MapStruct Mapper ইনজেক্ট করতে পারেন। এই ইন্টিগ্রেশনটি কোডে সহজ এবং কার্যকরী ম্যাপিং সল্যুশন প্রদান করে এবং কোড রিয়ুসেবিলিটি ও টেস্টেবিলিটি উন্নত করে।