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
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>
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
- 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 Mongo
ProductController
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}'
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}'
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 -vorigin https://github.com/yoesoff/YBoilerplate.git (fetch)origin https://github.com/yoesoff/YBoilerplate.git (push)PS D:\analisa\YBoilerplate> git branch* mongodb
Comments
Post a Comment