Integrasi MongoDB Ke Proyek Spring Boot dengan Spring Data

Jika sebelumnya kita membahas terkait instalasi MongoDB ( pengenalan MongoDB sekilas info ) dan Terminologi umum pada MongoDB (terminologi yang biasa digunakan dalam MongoDB) kini kita akan membahas terkait integrasi MongoDB ke proyek Spring Boot dengan menggunakan Maven Project.

Mengintegrasikan MongoDB ke dalam proyek Spring Boot dan membuat RESTful API lengkap dengan unit testing bisa dibagi menjadi beberapa langkah. Ini akan membantu kamu membangun dasar yang kuat untuk bekerja dengan MongoDB di Spring Boot. Berikut panduan lengkapnya:

1. Setup dan Konfigurasi MongoDB

Sebelumnya pastikan MongoDB sudah menyala dan database "belajar" sudah dibuat.
Kita pakai nama database belajar (Dari Mongo Express http://localhost:8081/)

a. Tambahkan Dependency di pom.xml Pastikan kamu menambahkan dependency MongoDB untuk Spring Data di dalam file pom.xml.

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

Tambakan dependency ke pom.xml dan reload maven project dependenct


b. Konfigurasi MongoDB di application.properties atau application.yml

Pastikan untuk menyertakan URL koneksi ke MongoDB:

spring.application.name=YBoilerplate
spring.data.mongodb.uri=mongodb://root:example@localhost:27017/belajar?authSource=admin
Ingat bahwa root adalah admin username dan example adalah user password.
  • ME_CONFIG_MONGODB_ADMINUSERNAME: root
  • ME_CONFIG_MONGODB_ADMINPASSWORD: example


application.properties

2. Membuat Entity dan Repository

2.1. Membuat Model Entity Misalkan kita buat model sederhana untuk Product.

package com.mhyusuf.yboilerplate.entity;

import lombok.*;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;

import javax.management.ConstructorParameters;

@Setter
@Getter
@NoArgsConstructor
@RequiredArgsConstructor
@Document(collection = "products")
public class MongoProduct {
@Id
@NonNull private String id;
@NonNull private String name;
@NonNull private Double price;

}

2.2. Membuat Repository Interface Gunakan MongoRepository untuk menyediakan akses ke database MongoDB.

package com.mhyusuf.yboilerplate.repository;

import com.mhyusuf.yboilerplate.entity.MongoProduct;
import org.springframework.data.mongodb.repository.MongoRepository;

public interface MongoProductRepository extends MongoRepository<MongoProduct, String> {
}

3. Membuat Service Layer

Di sini, buatlah business logic dasar. Service layer berguna untuk memisahkan logika bisnis dari controller.

package com.mhyusuf.yboilerplate.service;

import com.mhyusuf.yboilerplate.entity.MongoProduct;
import com.mhyusuf.yboilerplate.repository.MongoProductRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class MongoProductService {
private final MongoProductRepository productRepository;

@Autowired
public MongoProductService(MongoProductRepository productRepository) {
this.productRepository = productRepository;
}

public List<MongoProduct> getAllProducts() {
return productRepository.findAll();
}

public MongoProduct getMongoProductById(String id) {
return productRepository.findById(id).orElse(null);
}

public MongoProduct addMongoProduct(MongoProduct product) {
return productRepository.save(product);
}

public void deleteMongoProduct(String id) {
productRepository.deleteById(id);
}
}

4. Membuat Controller RESTful API

Sekarang kita buat endpoint RESTful API di dalam controller.

package com.mhyusuf.yboilerplate.controller;

import com.mhyusuf.yboilerplate.entity.MongoProduct;
import com.mhyusuf.yboilerplate.service.MongoProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;
import java.util.Optional;

@RestController
@RequestMapping("/api/products")
public class MongoProductController {
private final MongoProductService productService;

@Autowired
public MongoProductController(MongoProductService productService) {
this.productService = productService;
}

@GetMapping
public List<MongoProduct> getAllMongoProducts() {
return productService.getAllMongoProducts();
}

@GetMapping("/{id}")
public MongoProduct getMongoProductById(@PathVariable String id) {
return productService.getMongoProductById(id);
}

@PostMapping
public MongoProduct addMongoProduct(@RequestBody MongoProduct product) {
return productService.addMongoProduct(product);
}

@PutMapping("/{id}")
public ResponseEntity<MongoProduct> updateProduct(@PathVariable String id, @RequestBody MongoProduct productDetails) {
Optional<MongoProduct> updatedProduct = productService.updateProduct(id, productDetails);

return updatedProduct
.map(product -> new ResponseEntity<>(product, HttpStatus.OK))
.orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));
}

@DeleteMapping("/{id}")
public void deleteMongoProduct(@PathVariable String id) {
productService.deleteMongoProduct(id);
}
}

5. Menambahkan Unit Test Sederhana

Untuk menguji integrasi MongoDB, kamu bisa membuat unit test dengan @SpringBootTest.

5.1. Unit Test untuk MongoProductService

package com.mhyusuf.yboilerplate;

import com.mhyusuf.yboilerplate.entity.MongoProduct;
import com.mhyusuf.yboilerplate.service.MongoProductService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

@SpringBootTest
public class MongoProductServiceTests {

@Autowired
private MongoProductService productService;

@Test
public void testAddProduct() {
MongoProduct product = new MongoProduct("1", "Test Product", 10.0);
MongoProduct savedProduct = productService.addMongoProduct(product);
assertThat(savedProduct.getName()).isEqualTo("Test Product");
}

@Test
public void testGetAllProducts() {
List<MongoProduct> products = productService.getAllMongoProducts();
assertThat(products).isNotNull();
}
}

5.2. Unit Test untuk MongoProductController

Menggunakan @WebMvcTest untuk fokus pada pengujian controller.

package com.mhyusuf.yboilerplate;

import com.mhyusuf.yboilerplate.controller.MongoProductController;
import com.mhyusuf.yboilerplate.service.MongoProductService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.web.servlet.MockMvc;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@WebMvcTest(MongoProductController.class)
public class MongoProductControllerTests {

@Autowired
private MockMvc mockMvc;

@MockBean
private MongoProductService productService;

@Test
public void testGetAllProducts() throws Exception {
mockMvc.perform(get("/api/products"))
.andExpect(status().isOk());
}
}

6. Jalankan dan Uji API Dengan Curl

Setelah konfigurasi selesai, jalankan aplikasi menggunakan IDE atau command line. Pastikan MongoDB juga aktif.

6.1 Buat Data/Row baru di Database Collection

curl -X POST http://localhost:8080/api/products \
  -H "Content-Type: application/json" \
  -d '{"name": "Product 1", "price": 100.0}'

6.2 Dapatkan semua Data/Row di Database Collection

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

6.3 Dapatkan sebuah Data/Row di Database Collection dengan id

curl -X GET http://localhost:8080/api/products/{id}
Misalnya: curl -X GET http://localhost:8080/api/products/64e7d7eace8e3f6d3a3c5e42

6.4 Update (PUT) - Memperbarui Product Berdasarkan ID

curl -X PUT http://localhost:8080/api/products/{id} \
  -H "Content-Type: application/json" \
  -d '{"name": "Updated Product 1", "price": 150.0}'

5.5 Delete (DELETE) - Menghapus Product Berdasarkan ID

curl -X DELETE http://localhost:8080/api/products/64e7d7eace8e3f6d3a3c5e42

Contoh curls di atas dari terminal

Kode ada di Gihub berikut ini

PS D:\analisa\YBoilerplate> git remote -v
origin  https://github.com/yoesoff/YBoilerplate.git (fetch)
origin  https://github.com/yoesoff/YBoilerplate.git (push)
PS D:\analisa\YBoilerplate> git branch
* mongodb


Selanjutnya: 

 

Comments

Popular posts from this blog

Numpang Kerja Remote dari Bandung Creative Hub

Numpang Kerja Remote dari Bandung Digital Valley

Cara Decompile berkas Dex dan Apk Android