MapStruct একটি Java annotation processor ভিত্তিক মডেল ম্যাপিং টুল যা সহজে ডোমেইন অবজেক্ট থেকে DTO (Data Transfer Object) বা অন্য মডেল অবজেক্টে ডেটা ট্রান্সফার করতে ব্যবহৃত হয়। এটি কম্পাইল-টাইম কোড জেনারেশন ব্যবহার করে এবং রানটাইম পারফরম্যান্সের উপর কোনো নেতিবাচক প্রভাব ফেলে না।
Spring Framework এর সাথে MapStruct ইন্টিগ্রেশন করা খুবই সহজ এবং এটি Spring Beans হিসেবে মডেল ম্যাপিং ফাংশনকে ব্যবহারের সুযোগ দেয়। Spring এবং MapStruct এর সংমিশ্রণ সিস্টেমে ডেটা ম্যাপিং প্রক্রিয়া সহজ, দ্রুত এবং টাইপ সেফ হতে সহায়তা করে।
এই গাইডে, আমরা দেখব MapStruct কীভাবে Spring Framework এর সাথে ইন্টিগ্রেট করা হয়, এবং একটি উদাহরণসহ MapStruct এর ম্যাপিং ফাংশন Spring Bean হিসেবে কীভাবে কাজ করে।
১. MapStruct এবং Spring Integration এর জন্য প্রয়োজনীয় ডিপেনডেন্সি
Spring Framework এর সাথে MapStruct ব্যবহারের জন্য আপনাকে কিছু নির্দিষ্ট ডিপেনডেন্সি pom.xml (Maven) বা build.gradle (Gradle) ফাইলে যুক্ত করতে হবে।
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>
<!-- Spring Boot Dependency (if using Spring Boot) -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</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 Dependency:
dependencies {
implementation 'org.mapstruct:mapstruct:1.5.2.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.2.Final'
// Spring Boot dependency (if using Spring Boot)
implementation 'org.springframework.boot:spring-boot-starter'
}
এখানে, mapstruct এবং mapstruct-processor ডিপেনডেন্সি মূল MapStruct কার্যকারিতা এবং annotation processor কোড জেনারেট করতে সাহায্য করে। এবং spring-boot-starter Spring Boot প্রোজেক্টে ব্যবহৃত হয়।
২. MapStruct এবং Spring Integration এর জন্য Configuration
MapStruct কে Spring Framework এর সাথে ইন্টিগ্রেট করতে, আপনাকে componentModel = "spring" কনফিগারেশন ব্যবহার করতে হবে। এটি MapStruct কে Spring Bean হিসেবে কনফিগার করবে এবং Spring এর মধ্যে স্বয়ংক্রিয়ভাবে ইনজেক্ট হবে।
উদাহরণ: Spring Integration with MapStruct
Person.java (Domain Object):
public class Person {
private String firstName;
private String lastName;
// Getters and Setters
}
PersonDTO.java (DTO):
public class PersonDTO {
private String fullName;
// Getters and Setters
}
PersonMapper.java (MapStruct Mapper Interface):
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
@Mapper(componentModel = "spring") // Spring Bean হিসেবে ইনজেক্ট করা হবে
public interface PersonMapper {
@Mapping(source = "firstName", target = "fullName")
PersonDTO personToPersonDTO(Person person);
}
এখানে, componentModel = "spring" ব্যবহার করা হয়েছে, যা MapStruct কে Spring Bean হিসেবে কনফিগার করে।
৩. Spring Service Layer এ MapStruct ব্যবহার
Spring Framework এর মধ্যে MapStruct এর মেথড ইনজেক্ট করতে, আপনাকে শুধু @Autowired ব্যবহার করতে হবে। নিচে একটি Spring Service লেয়ার উদাহরণ দেওয়া হলো।
PersonService.java (Spring Service):
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class PersonService {
private final PersonMapper personMapper;
@Autowired
public PersonService(PersonMapper personMapper) {
this.personMapper = personMapper;
}
public PersonDTO convertToDTO(Person person) {
return personMapper.personToPersonDTO(person);
}
}
এখানে, PersonMapper ইন্টারফেসটি Spring Bean হিসেবে ইনজেক্ট করা হচ্ছে এবং convertToDTO মেথডে MapStruct এর মাধ্যমে Person অবজেক্ট থেকে PersonDTO তে ডেটা ম্যাপ করা হচ্ছে।
৪. Spring Boot Controller এ MapStruct ব্যবহার
Spring Boot Controller তে MapStruct ব্যবহার করতে, আপনি PersonService কে ইনজেক্ট করতে পারেন এবং REST API এর মাধ্যমে ডেটা ম্যাপিং করতে পারেন।
PersonController.java (Spring Boot Controller):
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class PersonController {
private final PersonService personService;
@Autowired
public PersonController(PersonService personService) {
this.personService = personService;
}
@GetMapping("/person")
public PersonDTO getPersonDTO() {
Person person = new Person();
person.setFirstName("John");
person.setLastName("Doe");
return personService.convertToDTO(person);
}
}
এখানে, PersonController PersonService কে ইনজেক্ট করে এবং একটি GET রিকোয়েস্টের মাধ্যমে Person অবজেক্ট থেকে PersonDTO তে ডেটা ম্যাপিং করে রিটার্ন করছে।
৫. MapStruct এবং Spring Boot Application Example
Spring Boot Application এর মধ্যে MapStruct ব্যবহার করলে আপনার কোড আরও পরিষ্কার, দ্রুত এবং রক্ষণাবেক্ষণযোগ্য হয়। Spring Boot এর @SpringBootApplication অ্যানোটেশন দিয়ে Spring Boot অ্যাপ্লিকেশন চালু করতে পারেন।
Application.java (Spring Boot Main Class):
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
এখানে, @SpringBootApplication অ্যানোটেশন Spring Boot অ্যাপ্লিকেশন শুরু করার জন্য ব্যবহৃত হয়।
৬. MapStruct এর প্রধান সুবিধা
- Compile-time code generation: MapStruct compile-time এ কোড জেনারেট করে, যা রানটাইম পারফরম্যান্সের উপর কোনো প্রভাব ফেলে না।
- Spring Integration: Spring Framework এর সাথে সহজে ইন্টিগ্রেট করা যায়, এবং Spring Bean হিসেবে কাজ করতে পারে।
- Custom Mappings: MapStruct কাস্টম ম্যাপিং এর সুবিধা দেয়, যেমন কাস্টম কনভার্সন লজিক, এনাম (enum) ম্যাপিং ইত্যাদি।
- Type Safety: এটি টাইপ সেফটি প্রদান করে, ফলে টাইপ মিসম্যাচের কারণে ত্রুটি কম হয়।
- Ease of Use: MapStruct খুবই সহজ, এবং আপনি কেবলমাত্র মেথড সিগনেচার তৈরি করেন, অন্যসব কাজ MapStruct কোড জেনারেট করে।
সারাংশ
MapStruct এবং Spring Framework এর সংমিশ্রণ আপনাকে দ্রুত, সহজ এবং টাইপ সেফ ডেটা ম্যাপিং সমাধান প্রদান করে। MapStruct কোড জেনারেট করার মাধ্যমে আপনাকে ডোমেইন অবজেক্ট থেকে DTO বা অন্য মডেল অবজেক্টে ম্যাপিং করতে সহায়তা করে, এবং Spring এর সাথে একত্রে এটি আরও সহজ হয়ে ওঠে। MapStruct কে Spring Bean হিসেবে কনফিগার করার জন্য componentModel = "spring" ব্যবহার করা হয়, এবং Spring Services এবং Controllers এ সহজেই এই ম্যাপিং ব্যবহার করা যায়।
Read more