Java Technologies Spring Bean Mapping এবং Dependency Injection এর ব্যবহার গাইড ও নোট

281

MapStruct একটি শক্তিশালী Java annotation processor ভিত্তিক লাইব্রেরি যা compile-time এ ম্যাপিং কোড জেনারেট করে। এটি JavaBeans বা POJOs (Plain Old Java Objects) এর মধ্যে ম্যাপিং করতে ব্যবহৃত হয় এবং ডেটা ট্রান্সফার অবজেক্ট (DTO) বা ডোমেইন অবজেক্টের মধ্যে ডেটা এক্সচেঞ্জ সহজ করে তোলে। MapStruct এর সুবিধা হলো, এটি compile-time এ কোড জেনারেট করে, তাই রানটাইম পারফরম্যান্সের উপর কোনো নেতিবাচক প্রভাব পড়ে না।

Spring ফ্রেমওয়ার্কের সাথে MapStruct ইন্টিগ্রেট করা খুবই সহজ এবং এটি Spring Beans এবং Dependency Injection (DI) এর মাধ্যমে আরো কার্যকরী হয়ে ওঠে। এই টিউটোরিয়ালে, আমরা MapStruct এর মাধ্যমে Spring Bean Mapping এবং Dependency Injection কিভাবে কাজ করে তা উদাহরণসহ দেখব।


১. MapStruct এবং Spring Integration

Spring Framework এর সাথে MapStruct ইন্টিগ্রেট করার জন্য, আপনাকে Mapper ইন্টারফেসে componentModel = "spring" কনফিগারেশন ব্যবহার করতে হবে। এর মাধ্যমে MapStruct Spring Beans তৈরি করে এবং Spring এর Dependency Injection (DI) ব্যবহারের মাধ্যমে Mapper Beans ইনজেক্ট করা যায়।

উদাহরণ: Spring Integration

Person.java (Domain Object):

public class Person {
    private String name;
    private int age;

    // Getters and Setters
}

PersonDTO.java (DTO):

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

    // Getters and Setters
}

PersonMapper.java (Mapper Interface with Spring Integration):

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

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

    PersonDTO personToPersonDTO(Person person);
}

এখানে, componentModel = "spring" যুক্ত করার মাধ্যমে PersonMapper ইন্টারফেসটি Spring Bean হিসাবে কনফিগার করা হয়েছে।


২. Spring Bean Dependency Injection এর ব্যবহার

এখন, আপনি Spring কনটেক্সটে এই Mapper ইন্টারফেস ব্যবহার করতে পারেন। Spring এর Dependency Injection ব্যবহারের মাধ্যমে MapStruct Mapper সহজেই Spring Beans হিসাবে ইনজেক্ট করা যেতে পারে।

PersonService.java (Spring Service Class):

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 convertPersonToDTO(Person person) {
        return personMapper.personToPersonDTO(person);
    }
}

এখানে, @Autowired অ্যানোটেশন ব্যবহার করে PersonMapper ইনজেক্ট করা হয়েছে। Spring স্বয়ংক্রিয়ভাবে PersonMapper Bean ইনজেক্ট করবে, কারণ এটি componentModel = "spring" ব্যবহার করে Spring Bean হিসাবে কনফিগার করা হয়েছে।


৩. Spring Boot Application Setup

আপনার Spring Boot অ্যাপ্লিকেশন কনফিগারেশন করতে, আপনি @SpringBootApplication এবং @ComponentScan ব্যবহার করতে পারেন, যাতে Spring ফ্রেমওয়ার্ক সমস্ত Bean সঠিকভাবে স্ক্যান এবং ইনজেক্ট করতে পারে।

Application.java (Main Application 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);
    }
}

Spring Boot অ্যাপ্লিকেশন চালানোর সময়, PersonMapper Bean স্বয়ংক্রিয়ভাবে Spring কনটেক্সটে ইনজেক্ট হবে এবং আপনি PersonService ক্লাসের মাধ্যমে Mapper ফাংশন ব্যবহার করতে পারবেন।


৪. Spring Bean Mapping ব্যবহার করার সুবিধা

  • Automatic Dependency Injection: Spring Framework এর মাধ্যমে Mapper Bean গুলি স্বয়ংক্রিয়ভাবে ইনজেক্ট হয়, যাতে ডেভেলপারের কোনো ম্যানুয়াল ইনজেকশন প্রয়োজন হয় না।
  • Modular Design: Spring এবং MapStruct এর সংমিশ্রণ আপনার অ্যাপ্লিকেশনকে আরও মডুলার করে তোলে। আপনার ডোমেইন অবজেক্টের পরিবর্তন প্রভাবিত না করে ডেটা ট্রান্সফার অবজেক্টগুলি (DTOs) খুব সহজেই অ্যাডজাস্ট করা যায়।
  • Code Reusability: Spring Bean Mapping ব্যবহার করলে আপনি আপনার Mapper ইন্টারফেসটি পুনরায় ব্যবহার করতে পারেন বিভিন্ন জায়গায়, এবং এটি একত্রিত করা সহজ হয়।
  • Separation of Concerns: Spring Beans এবং MapStruct এর মাধ্যমে অ্যাপ্লিকেশনের লজিক এবং ডেটা ম্যাপিং আলাদা রাখা যায়, যা কোড রিয়ুসেবিলিটি এবং মেনটেনেন্স সহজ করে।

৫. MapStruct এবং Spring এর মধ্যে ডিপেনডেন্সি ইনজেকশন

Spring Dependency Injection (DI) এর মাধ্যমে আপনি সহজেই Mapper Beans বা অন্যান্য Beans ইনজেক্ট করতে পারেন। এতে আপনাকে Mapper ইন্টারফেস বা অটোমেটিক ম্যাপিং কোডের জন্য আলাদা ক্লাস তৈরি করার প্রয়োজন পড়ে না। Spring Bean হিসেবে ব্যবহৃত Mapper গুলি @Autowired অ্যানোটেশন দ্বারা স্বয়ংক্রিয়ভাবে ইনজেক্ট হয়ে যায়।

উদাহরণ: Main.java (Spring Controller Example)

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class PersonController {

    private final PersonService personService;

    @Autowired
    public PersonController(PersonService personService) {
        this.personService = personService;
    }

    @GetMapping("/convert")
    public PersonDTO getPersonDTO(@RequestParam String name, @RequestParam int age) {
        Person person = new Person();
        person.setName(name);
        person.setAge(age);
        return personService.convertPersonToDTO(person);
    }
}

এখানে, PersonController ক্লাসে PersonService ইনজেক্ট করা হয়েছে এবং Spring Boot এর মাধ্যমে PersonDTO এর মান কনভার্ট করা হচ্ছে।


৬. MapStruct এবং Spring Boot Testing

Spring Boot Testing এর মাধ্যমে আপনি MapStruct মেপার ফাংশন এবং ইনজেকশন প্রক্রিয়াগুলিকে সহজেই টেস্ট করতে পারেন। @SpringBootTest ব্যবহার করে আপনার অ্যাপ্লিকেশন টেস্ট করা যায়।

উদাহরণ: PersonServiceTest.java (JUnit Test)

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import static org.junit.jupiter.api.Assertions.assertEquals;

@SpringBootTest
public class PersonServiceTest {

    @Autowired
    private PersonService personService;

    @Test
    public void testPersonMapping() {
        Person person = new Person();
        person.setName("John");
        person.setAge(30);
        
        PersonDTO personDTO = personService.convertPersonToDTO(person);
        
        assertEquals("John", personDTO.getName());
        assertEquals(30, personDTO.getAge());
    }
}

এখানে, @SpringBootTest এর মাধ্যমে PersonService ইনজেক্ট করা হয়েছে এবং Person অবজেক্ট থেকে PersonDTO তে ম্যাপিং পরীক্ষা করা হচ্ছে।


সারাংশ

MapStruct এবং Spring ফ্রেমওয়ার্কের মধ্যে ইন্টিগ্রেশন অত্যন্ত কার্যকরী। MapStruct এর মাধ্যমে Spring Beans এবং Dependency Injection ব্যবহারের মাধ্যমে ম্যাপিং প্রক্রিয়া সহজ এবং দ্রুত করা যায়। MapStruct এর সাথে Spring DI ব্যবহার করলে ডোমেইন অবজেক্ট থেকে DTO-তে ম্যাপিং করা সহজ হয়, এবং এতে পারফরম্যান্সে কোন প্রভাব পড়ে না। Spring কনটেক্সটের মধ্যে মেভেন ও গ্র্যাডল সাপোর্টেড MapStruct এর মাধ্যমে অ্যাপ্লিকেশন টেস্টিং এবং প্রোজেক্ট ডেভেলপমেন্ট আরও সহজ হয়ে ওঠে।


Content added By
Promotion

Are you sure to start over?

Loading...