Spring MVC & REST API development


Spring Boot হলো Spring Framework এর উপর ভিত্তি করে তৈরি একটি production-ready framework, যা দিয়ে খুব সহজে ওয়েব অ্যাপ্লিকেশন ও RESTful API তৈরি করা যায়। এই টিউটোরিয়ালে আমরা শিখব কীভাবে Spring MVC আর্কিটেকচার ব্যবহার করে REST API ডেভেলপ করা যায়।


Spring MVC কী?

Spring MVC (Model-View-Controller) হলো একটি ওয়েব ফ্রেমওয়ার্ক যা অ্যাপ্লিকেশনকে তিনটি প্রধান অংশে ভাগ করে:

Layer দায়িত্ব
Model ডেটা ও বিজনেস  লজিক হ্যান্ডল করে
View UI বা Presentation দেখায়
Controller Request ও Response সমন্বয় করে

REST API তৈরিতে আমরা সাধারণত View অংশ ব্যবহার করি না, কারণ এখানে JSON বা XML response ফেরত দেওয়া হয়।


Spring Boot প্রজেক্ট তৈরি

👉 তুমি Spring Initializr থেকে একটি নতুন প্রজেক্ট তৈরি করতে পারো:
🔗 https://start.spring.io

Dependencies:

- Spring Web

- Spring Boot DevTools

- Spring Data JPA (optional)

- H2 বা MySQL Database (optional)


Controller তৈরি করা

চলো একটি সাধারণ REST Controller তৈরি করি 👇

@RestController
@RequestMapping("/api/users")
public class UserController {

    private final UserService userService;

    public UserController(UserService userService) {
        this.userService = userService;
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    @PostMapping
    public User createUser(@RequestBody User user) {
        return userService.saveUser(user);
    }

    @PutMapping("/{id}")
    public User updateUser(@PathVariable Long id, @RequestBody User user) {
        return userService.updateUser(id, user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable Long id) {
        userService.deleteUser(id);
    }
}

এখানে প্রতিটি HTTP মেথড (GET, POST, PUT, DELETE) Spring এর Annotation দিয়ে ম্যাপ করা হয়েছে।


Service Layer

@Service
public class UserService {

    private final UserRepository userRepository;

    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    public List<User> getAllUsers() {
        return userRepository.findAll();
    }

    public User getUserById(Long id) {
        return userRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("User not found"));
    }

    public User saveUser(User user) {
        return userRepository.save(user);
    }

    public User updateUser(Long id, User user) {
        User existing = getUserById(id);
        existing.setName(user.getName());
        existing.setEmail(user.getEmail());
        return userRepository.save(existing);
    }

    public void deleteUser(Long id) {
        userRepository.deleteById(id);
    }
}


Repository Layer

@Repository
public interface UserRepository extends JpaRepository<User, Long> {
}


Entity Class

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;
    private String email;

    // Getter & Setter
}


REST API Endpoint গুলো

HTTP Method Endpoint বর্ণনা
GET /api/users সব ইউজার লিস্ট করে
GET /api/users/{id} নির্দিষ্ট ইউজার ডিটেইল
POST /api/users নতুন ইউজার তৈরি
PUT /api/users/{id} ইউজার আপডেট
DELETE /api/users/{id} ইউজার ডিলিট


JSON Request উদাহরণ

POST /api/users

{
  "name": "Maruf Hasan",
  "email": "maruf@example.com"
}


Response:

{
  "id": 1,
  "name": "Maruf Hasan",
  "email": "maruf@example.com"
}


Exception Handling যোগ করা

API তে সুন্দর error response দিতে @ControllerAdvice ব্যবহার করা যায় 👇

@RestControllerAdvice
public class GlobalExceptionHandler {

    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<Map<String, String>> handleRuntimeException(RuntimeException ex) {
        Map<String, String> error = new HashMap<>();
        error.put("message", ex.getMessage());
        return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(error);
    }
}


Validation যোগ করা

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @NotBlank(message = "Name cannot be blank")
    private String name;

    @Email(message = "Email must be valid")
    private String email;
}

এবং Controller এ @Valid ব্যবহার করো

@PostMapping
public User createUser(@Valid @RequestBody User user) {
    return userService.saveUser(user);
}


API টেস্ট করা

তুমি Postman বা cURL দিয়ে API টেস্ট করতে পারো।

curl -X GET http://localhost:8080/api/users


Advanced Topic: Versioning API

একাধিক ভার্সন রাখতে পারো header বা path ভিত্তিকভাবে 👇

@RestController
@RequestMapping("/api/v1/users")
public class UserControllerV1 { ... }
@RestController
@RequestMapping("/api/v2/users")
public class UserControllerV2 { ... }


Best Practices

- Controller-এ শুধুমাত্র HTTP হ্যান্ডলিং রাখো
- Service-এ Business Logic রাখো
- Repository-তে শুধুমাত্র Database Operations রাখো
- Proper Exception Handling করো
- Logging & Monitoring ব্যবহার করো (Spring Boot Actuator সহ)
- Validation সবসময় যোগ করো
- DTO ব্যবহার করে Response ক্লিন রাখো