Java Technologies MapStruct এর বেসিক ধারণা গাইড ও নোট

305

MapStruct হল একটি Java ভিত্তিক ফ্রেমওয়ার্ক যা অটোমেটিকভাবে JavaBeans (POJOs) বা ডোমেইন অবজেক্ট এবং DTO (Data Transfer Object) এর মধ্যে ডেটা ম্যাপিং বা কনভার্সন সম্পন্ন করার জন্য ব্যবহৃত হয়। এটি সাধারণত compile-time কোড জেনারেটর হিসেবে কাজ করে এবং runtime reflection ব্যবহার না করে, ফলে এটি দ্রুত এবং পারফরম্যান্সে উন্নত। MapStruct এর মাধ্যমে আপনি সহজভাবে ডোমেইন অবজেক্ট থেকে DTO তে ডেটা কপি করতে পারবেন এবং এর ফলে কোডের ভলিউম অনেক কমে যাবে।

MapStruct এর মাধ্যমে আপনি কাস্টম ম্যাপিং, nested mapping, collection mapping, এবং আরও অনেক জটিল কনভার্সন খুব সহজে সম্পন্ন করতে পারেন।


১. MapStruct এর বেসিক ধারণা

MapStruct হল একটি annotation processor যা কোড জেনারেট করার জন্য ব্যবহৃত হয়। এটি ডেটা কনভার্সন অটোমেটিকভাবে করে, ফলে আপনি হাতে কোড লেখার প্রয়োজন কমে যায়। MapStruct কোনো reflection ব্যবহার করে না, তাই এটি পারফরম্যান্সে দ্রুত। এটি compile-time এ কোড জেনারেট করে এবং কোডের সাথে কোনো রানটাইম ওভারহেড সৃষ্টি হয় না।

MapStruct এর মাধ্যমে আপনি JavaBeans (POJOs) এর মধ্যে ডেটা ম্যাপিং করতে পারেন, যেমন:

  • Entity এবং DTO এর মধ্যে ডেটা কপি করা
  • List, Set বা Map এর মধ্যে ডেটা কনভার্সন
  • Nested Object Mapping (যেমন, এক অবজেক্টের ভিতরে আরেক অবজেক্টের ডেটা কপি করা)

২. MapStruct এর মূল উপাদান

MapStruct ব্যবহারের জন্য কিছু মূল উপাদান প্রয়োজন হয়, যা ডেটা কনভার্সন সহজতর করে।

২.১ @Mapper Annotation

MapStruct এর মূল উপাদান হলো @Mapper অ্যানোটেশন, যা একটি ইন্টারফেস বা ক্লাসে ব্যবহার করা হয়। এটি MapStruct কে জানিয়ে দেয় যে এটি একটি ম্যাপিং ইন্টারফেস বা ক্লাস এবং এটি কোড জেনারেট করবে।

@Mapper
public interface PersonMapper {
    PersonDTO personToPersonDTO(Person person);
}

এখানে, PersonMapper ইন্টারফেসে @Mapper অ্যানোটেশন ব্যবহার করা হয়েছে যা এই ক্লাসটি একটি ম্যাপিং ইন্টারফেস হিসেবে কাজ করবে।

২.২ Mapping Methods

MapStruct এর মাধ্যমে ডেটা ম্যাপিং করার জন্য mapping methods নির্ধারণ করতে হয়। এই মেথডগুলি সাধারণত দুটি ডোমেইন অবজেক্টের মধ্যে ডেটা কপি করবে।

public interface PersonMapper {
    PersonDTO personToPersonDTO(Person person);
}

এখানে, personToPersonDTO মেথডটি Person অবজেক্ট থেকে PersonDTO তে ডেটা কপি করবে।

২.৩ @Mapping Annotation

MapStruct কাস্টম ম্যাপিং সাপোর্ট করে, যেখানে আপনি স্পেসিফিক ক্ষেত্রের মধ্যে ডেটা কনভার্সন করতে পারবেন। @Mapping অ্যানোটেশন ব্যবহার করে আপনি একটি নির্দিষ্ট ফিল্ড থেকে অন্য ফিল্ডে ডেটা ম্যাপ করতে পারেন।

@Mapper
public interface PersonMapper {
    @Mapping(source = "firstName", target = "fullName")
    PersonDTO personToPersonDTO(Person person);
}

এখানে, firstName ফিল্ডকে fullName ফিল্ডে ম্যাপ করা হয়েছে।


৩. MapStruct কোড জেনারেশন

MapStruct অটোমেটিকভাবে কোড জেনারেট করে, তাই ডেভেলপারদেরকে অপ্রয়োজনীয় কোড লেখা থেকে মুক্তি পাওয়া যায়। compile-time code generation এর মাধ্যমে MapStruct কোড জেনারেট করে যা runtime reflection ব্যবহার না করেই ডেটা ম্যাপিং সম্পন্ন করে।

৩.১ Compile-time Code Generation

MapStruct কোড জেনারেট করার জন্য annotation processing ব্যবহার করে, এটি runtime-এ কোনো অতিরিক্ত লোড তৈরি না করে compile-time এ কোড তৈরি করে।


৪. MapStruct এর পারফরম্যান্স

MapStruct এর প্রধান সুবিধা হলো এটি compile-time কোড জেনারেট করে এবং runtime reflection ব্যবহার না করার ফলে এটি খুবই দ্রুত এবং পারফরম্যান্সে উন্নত। এটি type-safe ম্যাপিংও প্রদান করে, যার ফলে আপনি টাইপ সঠিকভাবে যাচাই করতে পারেন।

৪.১ MapStruct বনাম Reflection-based Libraries

অন্যান্য লাইব্রেরি যেমন ModelMapper বা Dozer reflection ব্যবহার করে যা runtime-এ ডেটা ম্যাপিং করে, এর ফলে পারফরম্যান্স কমে যেতে পারে। MapStruct compile-time কোড জেনারেট করে, তাই এর পারফরম্যান্স অনেক উন্নত।


৫. MapStruct এর সঙ্গে কাস্টম ম্যাপিং

MapStruct কাস্টম ম্যাপিং সমর্থন করে যেখানে আপনি নিজস্ব লজিক প্রয়োগ করতে পারেন। এটি আপনি ব্যবহার করতে পারেন যখন ডিফল্ট ম্যাপিং ফাংশন যথেষ্ট না হয়।

৫.১ Custom Mapping Method

যখন আপনি ফিল্ডের মধ্যে কাস্টম লজিক প্রয়োগ করতে চান, তখন আপনি @Mapping অ্যানোটেশন ব্যবহার করে কাস্টম ফাংশন তৈরি করতে পারেন।

@Mapper
public interface CarMapper {
    @Mapping(source = "year", target = "formattedYear", qualifiedByName = "convertYear")
    CarDTO carToCarDTO(Car car);
    
    @Named("convertYear")
    default String convertYear(int year) {
        return "Year: " + year;
    }
}

এখানে, convertYear ফাংশনটি year ফিল্ডের মান কাস্টম লজিকের মাধ্যমে ম্যাপিং করবে।


৬. MapStruct এর ব্যবহার অন্যান্য ফ্রেমওয়ার্কের সাথে

MapStruct সহজে অন্যান্য Java ফ্রেমওয়ার্কের সাথে যেমন Spring, JPA, Quarkus ইত্যাদির সাথে ইন্টিগ্রেট করা যায়। আপনি Spring এর @Mapper ইন্টারফেসে componentModel = "spring" ব্যবহার করে Spring Beans হিসেবে ম্যাপিং ইন্টারফেস তৈরি করতে পারেন।

৬.১ Spring Integration

Spring Framework এর সাথে ইন্টিগ্রেট করার জন্য, componentModel = "spring" ব্যবহার করা হয়, যা MapStruct কে Spring Bean হিসেবে ইনজেক্ট করতে সহায়তা করে।

@Mapper(componentModel = "spring")
public interface CarMapper {
    CarDTO carToCarDTO(Car car);
}

এখন, CarMapper ইন্টারফেসটি Spring Bean হিসেবে কাজ করবে এবং আপনি এটি Spring এর মধ্যে ইনজেক্ট করতে পারবেন।


৭. MapStruct এর অন্যান্য সুবিধা

  1. Automated Code Generation: MapStruct কোড জেনারেট করে, যা ডেভেলপারদের জন্য কাজটি অনেক সহজ করে তোলে।
  2. Type Safety: টাইপ সঠিকতা নিশ্চিত করা হয় এবং ভুল টাইপ সঙ্কট প্রতিরোধ করা যায়।
  3. Easy Integration with Spring: Spring Framework এর সাথে সহজেই ইন্টিগ্রেট করা যায়।
  4. Flexible and Customizable: কাস্টম ম্যাপিং, কাস্টম কনভার্সন, এবং কাস্টম ডেটা ফরম্যাট সহ সব ধরনের প্রয়োজনীয় কাস্টমাইজেশন করা সম্ভব।
  5. No Reflection: MapStruct reflection ব্যবহার না করার কারণে পারফরম্যান্সে কোনো বাধা সৃষ্টি হয় না।

সারাংশ

MapStruct একটি শক্তিশালী এবং কার্যকরী Java লাইব্রেরি যা compile-time কোড জেনারেটর হিসেবে কাজ করে এবং Data Mapping বা Object Mapping অটোমেটিকভাবে সম্পন্ন করে। এটি DTO এবং Entity এর মধ্যে দ্রুত ডেটা কনভার্সন প্রদান করে, এবং এতে কোনো runtime reflection ব্যবহৃত হয় না, ফলে এটি পারফরম্যান্সের জন্য খুবই কার্যকরী। MapStruct কাস্টম ম্যাপিং, Spring Integration, এবং টাইপ সেফ ম্যাপিং সমর্থন করে, যা ডেভেলপারদের কাজকে অনেক সহজ করে তোলে।


Content added By

Object Mapping কি এবং এর প্রয়োজনীয়তা

274

Object Mapping হল একটি প্রক্রিয়া যার মাধ্যমে বিভিন্ন ধরনের অবজেক্টের মধ্যে ডেটা ট্রান্সফার বা কনভার্সন করা হয়। সাধারণত, এটি DTO (Data Transfer Object) এবং Entity এর মধ্যে ব্যবহৃত হয়, যেখানে একটি অবজেক্টের ডেটা অন্য অবজেক্টে মানানসইভাবে রূপান্তরিত করা হয়। MapStruct একটি জনপ্রিয় Java টুল যা এই Object Mapping কাজটি সহজ এবং কার্যকরভাবে সম্পন্ন করতে ব্যবহৃত হয়।

Object Mapping এর প্রয়োজনীয়তা:

Java বা অন্য কোনো প্রোগ্রামিং ভাষায় Object Mapping অত্যন্ত গুরুত্বপূর্ণ, বিশেষ করে যখন আপনি DTO এবং Entity এর মধ্যে ডেটা ট্রান্সফার করতে চান, অথবা যখন আপনার সিস্টেমে একাধিক লেয়ারে ডেটা এক্সচেঞ্জ করতে হয়। সাধারণত এই Mapping এর মাধ্যমে data consistency, maintainability, scalability, এবং flexibility নিশ্চিত করা হয়।


১. Object Mapping কি?

Object Mapping একটি প্রক্রিয়া যেখানে একটি অবজেক্টের ফিল্ডগুলির মান অন্য একটি অবজেক্টের ফিল্ডে কপি করা হয়, সেগুলি একে অপরের সাথে মেলানো হয়। উদাহরণস্বরূপ, একটি domain object (যেমন Entity) থেকে DTO বা View Object তে ডেটা ম্যাপিং করা হয়।

MapStruct Object Mapping কাজটি Compile-time code generation দ্বারা করে, যাতে runtime performance উপর কোনো প্রভাব না পড়ে।

উদাহরণ:

ধরা যাক, আপনার একটি User entity আছে এবং আপনি এর তথ্য একটি UserDTO তে ম্যাপ করতে চান।

User.java (Entity Class):

public class User {
    private String firstName;
    private String lastName;
    private int age;

    // Getters and Setters
}

UserDTO.java (DTO Class):

public class UserDTO {
    private String fullName;
    private int age;

    // Getters and Setters
}

এখন আপনি User entity থেকে UserDTO তে ডেটা ম্যাপিং করতে চান, যাতে firstName এবং lastName ফিল্ডগুলিকে fullName এ যোগ করা যায়।


২. MapStruct এর মাধ্যমে Object Mapping

MapStruct ব্যবহার করে, আপনি User entity থেকে UserDTO তে সহজভাবে ডেটা ট্রান্সফার বা ম্যাপিং করতে পারবেন। MapStruct compile-time এ কোড জেনারেট করে, এবং এটি সাধারণত Reflection API ব্যবহার না করে দ্রুত কাজ করে।

২.১ MapStruct Mapper Interface উদাহরণ:

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.factory.Mappers;

@Mapper
public interface UserMapper {
    UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

    @Mapping(source = "firstName", target = "fullName")
    UserDTO userToUserDTO(User user);
}

এখানে, UserMapper ইন্টারফেসে userToUserDTO মেথডের মাধ্যমে User entity থেকে UserDTO তে firstName এবং lastName থেকে fullName তৈরি হচ্ছে।


৩. Object Mapping এর প্রয়োজনীয়তা

৩.১ Separation of Concerns (SoC)

Object Mapping বিভিন্ন লেয়ার বা অবজেক্টের মধ্যে ডেটা ট্রান্সফার করার সময় Separation of Concerns (SoC) নিশ্চিত করতে সহায়তা করে। এতে একে অপরের উপর নির্ভরশীলতা কমে, এবং আপনার কোড ক্লিন এবং মডুলার হয়ে থাকে। একটি DTO শুধুমাত্র ডেটা ক্যারি করার জন্য ব্যবহৃত হয় এবং এটির মধ্যে কোনো লজিক বা অন্যান্য ডোমেইন ফিচার থাকে না।

৩.২ Data Transfer Between Layers

একাধিক লেয়ারে ডেটা এক্সচেঞ্জ করার সময় Object Mapping এর গুরুত্ব বেড়ে যায়। উদাহরণস্বরূপ, আপনার Service Layer থেকে Presentation Layer বা Persistence Layer এ ডেটা ট্রান্সফার করার জন্য এই ম্যাপিং প্রক্রিয়া প্রয়োজন।

৩.৩ Database and Application Layer Separation

অ্যাপ্লিকেশন এবং ডাটাবেস লেয়ারের মধ্যে পার্থক্য থাকা দরকার। ডেটাবেস থেকে প্রাপ্ত Entity ক্লাস থেকে DTO তে ডেটা ম্যাপ করার মাধ্যমে আপনি অ্যাপ্লিকেশন লজিক এবং ডাটাবেস লজিক পৃথক রাখতে পারেন। MapStruct এই কাজটি দক্ষতার সাথে সম্পন্ন করে, এবং কোড ডুপ্লিকেশন কমিয়ে আনে।

৩.৪ Flexibility and Scalability

Object Mapping ব্যবহারের মাধ্যমে আপনি আপনার কোডকে আরও ফ্লেক্সিবল এবং স্কেলেবল করতে পারেন। যখন আপনি বিভিন্ন সিস্টেমে ডেটা এক্সচেঞ্জ করছেন, MapStruct এর মতো টুল ব্যবহার করলে ম্যাপিং প্রক্রিয়া সহজ হয়ে যায় এবং যখন নতুন ডোমেইন অবজেক্ট বা DTO প্রয়োজন হয়, তখন খুব সহজে নতুন ম্যাপিং যুক্ত করা যায়।

৩.৫ Performance

MapStruct কম্পাইল-টাইম কোড জেনারেট করে, যার ফলে এটি runtime reflection এর চেয়ে অনেক দ্রুত। যখন আপনি runtime reflection এর মাধ্যমে Object Mapping করবেন, তখন এটি পারফরম্যান্সে প্রভাব ফেলতে পারে, কিন্তু MapStruct compile-time কোড জেনারেটের মাধ্যমে এর পারফরম্যান্স অনেক দ্রুত রাখে।


৪. MapStruct ব্যবহার করার সুবিধা

  1. Compile-time code generation: MapStruct কোড জেনারেট করে compile-time এ, ফলে এটি পারফরম্যান্সের জন্য আরও কার্যকর।
  2. No Reflection: MapStruct রিফ্লেকশন ব্যবহার না করায় এটি দ্রুত কাজ করে, বিশেষ করে বড় প্রোজেক্টে।
  3. Easy to use: MapStruct ব্যবহার করা সহজ, শুধুমাত্র Mapper Interface তৈরি করলেই মডেল ম্যাপিং কাজ হয়ে যায়।
  4. Type Safety: এটি টাইপ সেফ ম্যাপিং প্রদান করে, অর্থাৎ ভুল টাইপের কারণে কোনো ত্রুটি হবে না।
  5. Custom Mappings: MapStruct কাস্টম ম্যাপিংও সাপোর্ট করে, যেমন ভিন্ন ভিন্ন টাইপের মধ্যে কনভার্সন।

৫. MapStruct এর সাথে Custom Mapping

MapStruct আপনাকে কাস্টম ম্যাপিং তৈরি করার সুযোগ দেয়, যাতে আপনি নিজের লজিক অনুযায়ী ডেটা কনভার্ট করতে পারেন। ধরুন, আপনি firstName এবং lastName কে একটি fullName ফিল্ডে যোগ করতে চান, তাহলে MapStruct আপনাকে এক্সপ্রেশন ব্যবহার করে এমন কাস্টম ম্যাপিং করতে দেবে।

উদাহরণ:

@Mapper
public interface UserMapper {
    @Mapping(target = "fullName", expression = "java(user.getFirstName() + \" \" + user.getLastName())")
    UserDTO userToUserDTO(User user);
}

এখানে, firstName এবং lastName কে fullName এ কনভার্ট করা হচ্ছে।


সারাংশ

Object Mapping হল একটি গুরুত্বপূর্ণ প্রক্রিয়া যা ডেটা এক্সচেঞ্জ এবং কনভার্সনের সময় ব্যবহৃত হয়। MapStruct একটি জেনারেটেড কোড ভিত্তিক object mapping tool, যা compile-time এ কোড জেনারেট করে এবং DTO এবং Entity এর মধ্যে ডেটা ট্রান্সফার করতে সাহায্য করে। এটি performance, type safety, custom mapping, এবং flexibility প্রদান করে, যা প্রোজেক্টের স্কেল এবং পারফরম্যান্স উন্নত করতে সহায়তা করে।

MapStruct এর মাধ্যমে আপনি Object Mapping এবং Data Transformation অনেক সহজে এবং দ্রুত করতে পারবেন, যা আপনার প্রোজেক্টের কোডে দক্ষতা এবং মডুলারিটি বৃদ্ধি করে।


Content added By

MapStruct এর মাধ্যমে DTO এবং Entity Mapping করা

337

MapStruct হল একটি Java টুল যা ডেটা ট্রান্সফরমেশন (যেমন Entity থেকে DTO (Data Transfer Object) তে ম্যাপিং) করার জন্য ব্যবহৃত হয়। এটি কোড জেনারেট করে এবং compile-time এ ম্যাপিং সম্পন্ন করে, ফলে রানটাইমে কোনো অতিরিক্ত পারফরম্যান্স ওভারহেড থাকে না। MapStruct সাধারণত Entity ক্লাস এবং DTO ক্লাসের মধ্যে ডেটা ম্যানিপুলেশন করতে ব্যবহৃত হয়, যা সাধারণত RESTful API তে ব্যবহৃত হয়।

এখানে DTO এবং Entity এর মধ্যে MapStruct ব্যবহার করে কিভাবে ম্যাপিং করা যায় তা বিস্তারিতভাবে আলোচনা করা হবে।


১. DTO এবং Entity কি?

  • Entity: Entity ক্লাস সাধারণত ডাটাবেস টেবিলের সাথে সম্পর্কিত হয়। এটি ডেটাবেস থেকে তথ্য সংগ্রহ করতে ব্যবহৃত হয় এবং সাধারণত JPA বা Hibernate এর মাধ্যমে তৈরি হয়।
  • DTO (Data Transfer Object): DTO হল একটি অবজেক্ট যা একটি সিস্টেম থেকে আরেকটি সিস্টেমে ডেটা পাঠানোর জন্য ব্যবহৃত হয়। এটি সাধারণত ক্লায়েন্ট-সার্ভার কমিউনিকেশন এর জন্য ব্যবহৃত হয়, যেমন JSON ফরম্যাটে API রেসপন্স।

২. MapStruct এর সাহায্যে Entity থেকে DTO তে Mapping

ধরা যাক, আপনার একটি PersonEntity এবং একটি PersonDTO ক্লাস রয়েছে। আমরা MapStruct ব্যবহার করে Entity থেকে DTO তে ডেটা ম্যাপ করতে চাই।

২.১ Entity Class (PersonEntity)

import javax.persistence.Entity;
import javax.persistence.Id;

@Entity
public class PersonEntity {
    @Id
    private Long id;
    private String firstName;
    private String lastName;
    private int age;

    // Getters and Setters
}

এখানে, PersonEntity একটি ডাটাবেস entity ক্লাস যা JPA এর মাধ্যমে ডাটাবেস টেবিলের সাথে সম্পর্কিত।

২.২ DTO Class (PersonDTO)

public class PersonDTO {
    private String fullName;
    private int age;

    // Getters and Setters
}

এখানে, PersonDTO একটি DTO ক্লাস যা PersonEntity এর ডেটা ধারণ করবে এবং API এর মাধ্যমে ক্লায়েন্টকে পাঠানো হবে।

২.৩ Mapper Interface (PersonMapper)

এখন, MapStruct এর মাধ্যমে PersonEntity থেকে PersonDTO তে ডেটা ম্যাপ করতে একটি Mapper Interface তৈরি করতে হবে।

import org.mapstruct.Mapper;
import org.mapstruct.factory.Mappers;

@Mapper
public interface PersonMapper {
    PersonMapper INSTANCE = Mappers.getMapper(PersonMapper.class);

    PersonDTO personEntityToPersonDTO(PersonEntity personEntity);
}

এখানে, PersonMapper একটি MapStruct Mapper Interface যা personEntityToPersonDTO মেথডের মাধ্যমে PersonEntity থেকে PersonDTO তে ডেটা ম্যাপ করবে। Mappers.getMapper ব্যবহার করে আমরা Mapper Interface এর একটি ইনস্ট্যান্স তৈরি করেছি, যা MapStruct নিজে কোড জেনারেট করবে।


৩. MapStruct Mapper এর ব্যবহারের উদাহরণ

এখন, MapStruct ব্যবহার করে PersonEntity অবজেক্ট থেকে PersonDTO তে ডেটা কিভাবে ম্যাপ করা যায় তা দেখাবো।

৩.১ Main Class (Usage Example)

public class Main {
    public static void main(String[] args) {
        // Creating PersonEntity instance
        PersonEntity personEntity = new PersonEntity();
        personEntity.setId(1L);
        personEntity.setFirstName("John");
        personEntity.setLastName("Doe");
        personEntity.setAge(30);

        // Using MapStruct to map PersonEntity to PersonDTO
        PersonDTO personDTO = PersonMapper.INSTANCE.personEntityToPersonDTO(personEntity);

        // Print PersonDTO
        System.out.println("Full Name: " + personDTO.getFullName());
        System.out.println("Age: " + personDTO.getAge());
    }
}

এখানে:

  • PersonEntity ইনস্ট্যান্স তৈরি করা হয়েছে এবং তার ডেটা সেট করা হয়েছে।
  • PersonMapper.INSTANCE.personEntityToPersonDTO(personEntity) মেথড ব্যবহার করে PersonEntity থেকে PersonDTO তে ডেটা ম্যাপ করা হয়েছে।
  • তারপর, PersonDTO এর ডেটা প্রিন্ট করা হয়েছে।

MapStruct কোড জেনারেট করবে যা firstName এবং lastName ফিল্ডগুলিকে একত্রিত করে fullName তৈরি করবে।


৪. Custom Mapping (কাস্টম ম্যাপিং)

MapStruct কাস্টম ম্যাপিং সমর্থন করে, যার মাধ্যমে আপনি ফিল্ডের মধ্যে কাস্টম কনভার্সন লজিক প্রয়োগ করতে পারেন। ধরুন, আপনি চাইছেন যে fullName ফিল্ডে firstName এবং lastName যোগ করা হোক।

৪.১ Custom Mapping Example

import org.mapstruct.Mapper;
import org.mapstruct.Mapping;

@Mapper
public interface PersonMapper {
    @Mapping(source = "firstName", target = "fullName", expression = "java(personEntity.getFirstName() + \" \" + personEntity.getLastName())")
    PersonDTO personEntityToPersonDTO(PersonEntity personEntity);
}

এখানে, @Mapping অ্যানোটেশন ব্যবহার করে firstName এবং lastName কে fullName এ একত্রিত করা হয়েছে।


৫. MapStruct এবং Spring Integration

Spring ফ্রেমওয়ার্কে MapStruct ব্যবহার করা খুবই সহজ। আপনি MapStruct এর Mapper Interface কে Spring Bean হিসাবে কনফিগার করতে পারেন এবং Spring এর ডিপেনডেন্সি ইনজেকশন ব্যবহার করে এটিকে ইনজেক্ট করতে পারেন।

৫.১ Spring Integration Example

@Mapper(componentModel = "spring")
public interface PersonMapper {
    PersonDTO personEntityToPersonDTO(PersonEntity personEntity);
}

এখানে, componentModel = "spring" সেট করে আপনি PersonMapper ইন্টারফেসটিকে Spring Bean হিসেবে কনফিগার করেছেন। এর ফলে Spring এর মধ্যে PersonMapper ইনজেক্ট করা যাবে এবং @Autowired এর মাধ্যমে এটি ব্যবহার করা যাবে।

৫.২ Spring Service Example

@Service
public class PersonService {

    private final PersonMapper personMapper;

    @Autowired
    public PersonService(PersonMapper personMapper) {
        this.personMapper = personMapper;
    }

    public PersonDTO convertToDTO(PersonEntity personEntity) {
        return personMapper.personEntityToPersonDTO(personEntity);
    }
}

এখানে, PersonMapper Spring এর মধ্যে @Autowired ব্যবহার করে ইনজেক্ট করা হয়েছে এবং convertToDTO মেথডের মাধ্যমে PersonEntity থেকে PersonDTO তে ডেটা ট্রান্সফার করা হচ্ছে।


৬. MapStruct এর সুবিধা

  1. Compile-time Code Generation: MapStruct কম্পাইল টাইমে কোড জেনারেট করে, যা রানটাইম পারফরম্যান্সে কোনো প্রভাব ফেলে না।
  2. Type Safety: MapStruct টাইপ সেফ ম্যাপিং নিশ্চিত করে, যা ভুল টাইপের ডেটা ম্যাপিং থেকে রক্ষা করে।
  3. Custom Mapping: আপনি কাস্টম ম্যাপিং কনভার্সন ব্যবহার করতে পারেন, যেমন বিশেষ ক্ষেত্রের জন্য কাস্টম লজিক প্রয়োগ।
  4. Spring Integration: MapStruct সহজেই Spring ফ্রেমওয়ার্কের সাথে কাজ করে এবং Spring Bean হিসেবে ব্যবহৃত হতে পারে।
  5. Performance: MapStruct ব্যবহার করলে reflection এর মতো অতিরিক্ত লোড এড়ানো যায়, যা পারফরম্যান্স উন্নত করে।

সারাংশ

MapStruct JavaBeans বা POJOs এর মধ্যে ডেটা ট্রান্সফরমেশন বা ম্যাপিং করতে ব্যবহৃত একটি শক্তিশালী টুল। এটি DTO এবং Entity এর মধ্যে ডেটা ম্যাপ করতে খুবই সহজ, এবং Spring সহ অন্যান্য ফ্রেমওয়ার্কের সাথে ইন্টিগ্রেট করা যায়। MapStruct একটি compile-time কোড জেনারেটর হিসেবে কাজ করে, যার ফলে এটি দ্রুত এবং টাইপ-সেফ ম্যাপিং নিশ্চিত করে। Custom Mapping এবং Spring Integration এর মাধ্যমে আরও কার্যকরী এবং কাস্টম ডেটা ট্রান্সফরমেশন করা সম্ভব।


Content added By

উদাহরণ সহ বেসিক Object Mapping

248

MapStruct একটি শক্তিশালী কোড জেনারেশন টুল যা Java Beans এর মধ্যে ডেটা ট্রান্সফরমেশন সহজ এবং দ্রুত করার জন্য ব্যবহৃত হয়। এটি সাধারণত DTO (Data Transfer Object) এবং Entity ক্লাসের মধ্যে ডেটা ম্যাপিং করতে ব্যবহৃত হয়। এখানে, আমরা একটি সাধারণ Object Mapping উদাহরণের মাধ্যমে দেখাবো কিভাবে MapStruct ব্যবহার করে দুটি Java Beans এর মধ্যে ডেটা ম্যাপ করা যায়।


১. MapStruct কী এবং কেন ব্যবহার করবেন?

MapStruct একটি কোড জেনারেটর যা compile-time এ Java Beans এর মধ্যে ডেটা ম্যাপিং সম্পন্ন করে। এটি reflection ব্যবহার না করে, তাই দ্রুত এবং পারফরম্যান্সে কার্যকরী। MapStruct স্বয়ংক্রিয়ভাবে Java Beans এর মধ্যে ডেটা স্থানান্তর করার জন্য ম্যাপিং কোড জেনারেট করে, ফলে ডেভেলপারদের ম্যানুয়ালি ডেটা ট্রান্সফরমেশন কোড লিখতে হয় না।

এখানে আমরা MapStruct এর মাধ্যমে দুটি ক্লাসের মধ্যে একটি বেসিক Object Mapping দেখব।


২. উদাহরণ: বেসিক Object Mapping

ধরা যাক, আমাদের দুটি ক্লাস রয়েছে — Person এবং PersonDTO। আমরা Person ক্লাস থেকে PersonDTO ক্লাসে ডেটা ম্যাপ করতে চাই।

২.১ Person.java ক্লাস

public class Person {
    private String firstName;
    private String lastName;

    // Constructors
    public Person(String firstName, String lastName) {
        this.firstName = firstName;
        this.lastName = lastName;
    }

    // Getters and Setters
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

২.২ PersonDTO.java ক্লাস

public class PersonDTO {
    private String firstName;
    private String lastName;

    // Getters and Setters
    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

এখানে, Person এবং PersonDTO ক্লাসের মধ্যে firstName এবং lastName নামক দুইটি ফিল্ড রয়েছে, যা আমরা MapStruct ব্যবহার করে ম্যাপ করব।


৩. MapStruct Mapper Interface তৈরি করা

MapStruct ব্যবহার করতে, প্রথমে আপনাকে একটি Mapper Interface তৈরি করতে হবে যা দুটি ক্লাসের মধ্যে ম্যাপিং নির্দেশনা দিবে।

৩.১ PersonMapper.java 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 এর একটি অ্যানোটেশন যা এই ইন্টারফেসটিকে একটি Mapper হিসেবে চিহ্নিত করে।
  • personToPersonDTO: এই মেথডটি Person অবজেক্টকে PersonDTO তে কনভার্ট করবে।
  • Mappers.getMapper: এটি MapStruct এর মাধ্যমে PersonMapper ইন্টারফেসের একটি ইনস্ট্যান্স তৈরি করবে।

৪. Maven Dependency Configuration

MapStruct ব্যবহার করতে হলে, আপনাকে Maven এর মাধ্যমে নির্দিষ্ট ডিপেনডেন্সি ইমপোর্ট করতে হবে।

৪.১ pom.xml ফাইলে MapStruct এর ডিপেনডেন্সি

<dependencies>
    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct</artifactId>
        <version>1.4.2.Final</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.mapstruct</groupId>
            <artifactId>mapstruct-processor</artifactId>
            <version>1.4.2.Final</version>
            <scope>provided</scope>
        </plugin>
    </plugins>
</build>

এখানে:

  • mapstruct: এটি MapStruct লাইব্রেরি।
  • mapstruct-processor: এটি কোড জেনারেট করার জন্য ব্যবহার হয় এবং এটি কম্পাইল টাইমে কোড জেনারেট করে।

৫. MapStruct ব্যবহার করে Object Mapping

এখন, MapStruct ব্যবহার করে Person অবজেক্টকে PersonDTO তে ম্যাপ করার কোড তৈরি করা যাক।

৫.১ Main.java ক্লাস

public class Main {
    public static void main(String[] args) {
        // Create Person object
        Person person = new Person("John", "Doe");

        // Convert Person to PersonDTO using MapStruct
        PersonDTO personDTO = PersonMapper.INSTANCE.personToPersonDTO(person);

        // Print PersonDTO details
        System.out.println("First Name: " + personDTO.getFirstName());
        System.out.println("Last Name: " + personDTO.getLastName());
    }
}

এখানে, PersonMapper.INSTANCE.personToPersonDTO(person) মেথডটি Person অবজেক্ট থেকে PersonDTO তে ডেটা ট্রান্সফার করবে। কোডের আউটপুট হবে:

First Name: John
Last Name: Doe

৬. MapStruct এর কোড জেনারেশন

ম্যাভেন বা গ্রেডল বিল্ড করার সময়, MapStruct একটি কনক্রিট ক্লাস (যেমন PersonMapperImpl) জেনারেট করবে যা Person থেকে PersonDTO তে ডেটা ম্যাপিং করবে। এই কোডটি compile-time এ জেনারেট হয়, ফলে এটি দ্রুত এবং নিরাপদ।


৭. MapStruct এর অন্যান্য ফিচারসমূহ

৭.১ Nested Mapping

MapStruct সোজাসুজি nested mapping সাপোর্ট করে। উদাহরণস্বরূপ, যদি আপনার Person ক্লাসের মধ্যে আরও একটি অবজেক্ট (যেমন Address) থাকে, তবে আপনি সেগুলিও ম্যাপ করতে পারবেন।

৭.২ Custom Mapping

আপনি যখন বিশেষ ধরনের ডেটা কনভার্সন করতে চান (যেমন, ডেটা ফরম্যাট পরিবর্তন), তখন custom methods ব্যবহার করতে পারেন।

@Mapper
public interface PersonMapper {
    PersonDTO personToPersonDTO(Person person);

    @Mapping(target = "firstName", source = "firstName")
    String mapFirstName(String firstName);
}

এখানে, mapFirstName মেথডটি কাস্টম ম্যাপিংয়ের জন্য ব্যবহার করা হয়েছে।


সারাংশ

MapStruct Java প্রোজেক্টে object mapping দ্রুত এবং কার্যকরভাবে করার জন্য একটি শক্তিশালী টুল। Compile-time code generation এর মাধ্যমে এটি Person এবং PersonDTO এর মধ্যে ডেটা ম্যাপিং সহজ করে তোলে, এবং এটি কোনো runtime reflection ব্যবহার না করায় পারফরম্যান্সে দ্রুত। MapStruct স্বয়ংক্রিয়ভাবে কোড জেনারেট করার মাধ্যমে ডেটা ট্রান্সফরমেশন খুবই কার্যকরী এবং নির্ভরযোগ্য করে তোলে।

উপরে দেওয়া উদাহরণে, আমরা দেখেছি কীভাবে MapStruct ব্যবহার করে সহজ এবং দ্রুত Object Mapping করা যায়।


Content added By
Promotion

Are you sure to start over?

Loading...