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 ক্লিন রাখো