Skip to main content

Membuat REST API CRUD Spring Boot sederhana menggunakan Database H2

ยท 7 min read
Ucup TopekoX
Ucup TopekoX
TimposuLabs creator

๐Ÿ‘‹ Hi Guys.. pada tutorial kali ini kita akan membangun aplikasi Spring Boot sederhana, dengan fitur REST API sederhana dengan menggunakan database H2. Project yang akan dibuat sederhana saja, tidak menggunakan banyak layer cukup layer Controller -> Repository -> Database. Jadi tutorial kali ini sebenarnya bukan best practice, tapi hanya untuk pembuatan project REST API sederhana ๐Ÿ’ช.

๐Ÿ“Œ Apa itu H2 Databaseโ€‹

H2 Database adalah database ringan (lightweight), yang berjalan di atas memory RAM (in-memory database), dan sudah kompatibel dengan Spring Boot. Jadi kita tidak perlu melakukan instalasi database H2 decara manual, karena sudah embedded dengan Spring Boot, cukup memasukan dependency-nya ke dalam project Spring Boot ๐Ÿš€. Jadi sangat cocok untuk testing aplikasi sebelum menggunakan database yang lebih proper seperti MySQL, Postgres, Oracle, MsSQL atau sebagainya.

๐Ÿ” Alur Arsitektur Aplikasiโ€‹

rest simple

warning

Arsitektur yang digunakan bukan merupakan best practice tetapi hanya untuk education purpose/proses pembelajaran dan tidak direkomendasikan untuk digunakan di production.

๐Ÿ“Œ Client (Pengguna API)โ€‹

Client adalah layer yang akan berinteraksi dengan API di antaranya seperti browser, mobile, Postman, frontend app dan sebagainya. Client akan:

  • โœ”๏ธ Akan mengirim HTTP Request (GET, POST, PUT, DELETE)
  • โœ”๏ธ Akan menerima API Response (Json format)

Contoh client:

  • โ˜‘๏ธ API Testing tools (Postman, Curl)
  • โ˜‘๏ธ Frontend App (React, Angular, Vue.js)
  • โ˜‘๏ธ Mobile App (Iphone, Android)

โœ… Dependencyโ€‹

Tambahkan dependency yang dibutuhkan pada pom.xml

<!-- Spring Boot Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>

<!-- Spring Boot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<!-- Spring Boot H2 Database-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>

โœ… Konfigurasi Propertiesโ€‹

spring.datasource.url=jdbc:h2:mem:belajar
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update

spring.h2.console.enabled=true
spring.h2.console.path=/h2

Konfigurasi di atas adalah konfigurasi minimal untuk terhubung ke database H2. Beberapa variable yang dimasukan adalah nama database adalah belajar dengan urljdbc:h2:mem:belajar , username adalah sa dan tanpa password. Konfigurasi adalah kita mengaktifkan console database H2 ketika dijalankan dengan nilai true, serta url path akses consolenya adalah /h2. Konfigurasi sisanya adalah konfigurasi JPA dan Hibernate.

โœ… Membuat Entityโ€‹

Membuat Entity sebagai table mapping ke database, dalam contoh kali ini kita akan membuat entity Product yang akan di mapping menjadi tabel ke dalama database:

import jakarta.persistence.*;

@Entity
@Table(name = "product")
public class Product {

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

private String name;

private String description;

private Double price;

public Product() {
}

public Product(Integer id, String name, String description, Double price) {
this.id = id;
this.name = name;
this.description = description;
this.price = price;
}

public Integer getId() {
return id;
}

public void setId(Integer id) {
this.id = id;
}

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getDescription() {
return description;
}

public void setDescription(String description) {
this.description = description;
}

public Double getPrice() {
return price;
}

public void setPrice(Double price) {
this.price = price;
}
}

โœ… Membuat Repositoryโ€‹

import com.timposulabs.belajar_springboot_h2.model.Product;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ProductRepository extends JpaRepository<Product, Integer> {
}

๐Ÿš€ Menggunakan JpaRepository untuk standar CRUD, dibanding menbuatnya secara manual ๐Ÿ˜ตโ€๐Ÿ’ซ.

โœ… Membuat Controllerโ€‹

import com.timposulabs.belajar_springboot_h2.model.Product;
import com.timposulabs.belajar_springboot_h2.repository.ProductRepository;
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 ProductController {

@Autowired
private final ProductRepository repository;

public ProductController(ProductRepository repository) {
this.repository = repository;
}

// โœ… GET: Get All Product (200 OK / 204 No Content)
@GetMapping
ResponseEntity<List<Product>> getAll() {
List<Product> list = repository.findAll();

if (list.isEmpty()) {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
return new ResponseEntity<>(list, HttpStatus.OK);
}

// โœ… GET: Get by Id Product (200 OK / 404 Not Found)
@GetMapping("/{id}")
ResponseEntity<Product> getById(@PathVariable Integer id) {
Optional<Product> product = repository.findById(id);
return product.map(value -> new ResponseEntity<>(value, HttpStatus.OK))
.orElseGet(() -> new ResponseEntity<>(HttpStatus.NOT_FOUND));
}

// โœ… POST: Create Book
@PostMapping("/add")
ResponseEntity<Product> add(@RequestBody Product product) {
Product p = repository.save(product);
return new ResponseEntity<>(p, HttpStatus.OK);
}

// โœ… PUT: Update Book (200 OK / 404 Not Found)
@PutMapping("/{id}")
ResponseEntity<Product> update(@PathVariable Integer id, @RequestBody Product product) {
Optional<Product> p = repository.findById(id);

if (p.isPresent()) {
Product updateProduct = p.get();
updateProduct.setName(product.getName());
updateProduct.setDescription(product.getDescription());
updateProduct.setPrice(product.getPrice());

return new ResponseEntity<>(repository.save(updateProduct), HttpStatus.OK);
}
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}

// โœ… DELETE: Delete Book (200 OK)
@DeleteMapping("/delete/{id}")
ResponseEntity<Product> delete(@PathVariable Integer id) {
repository.deleteById(id);
return new ResponseEntity<>(HttpStatus.OK);
}

}

Membuat Controller yang akan mengatur request yang masuk dan memberikan response kepada User dimana dalam kasus ini, menjadikan Controller juga sebagai business logic dari aplikasi ini.

๐Ÿงช Uji Coba API CRUDโ€‹

Sekarang waktunya untuk testing REST API yang telah dibuat, menggunakan testing tools dengan menggunakan Postman atau cURL. Pada contoh testing kali ini saya menggunakan cURL.

Testing yang akan kita coba berdasarkan Controller yang telah dibuat adalah:

  • โœ”๏ธ Mengirim HTTP Request (GET, POST, PUT, DELETE)
  • โœ”๏ธ Validasi Response dengan format JSON yang diberikan

๐Ÿš€ Run Spring Boot Appโ€‹

mvn spring-boot:run

Setelah Spring Boot sukses berjalan, maka secara otomatis akan dibuatkan table product sesuai entity model yang telah dibuat.

๐Ÿ›ข๏ธ H2 Database Consoleโ€‹

Setelah Spring Boot berjalan, kita dapat mengakses H2 Console dengan path /h2 (sesuaikan dengan konfigurasi di file properties) melalui browser sesuai url dan port Spring Boot yang aktif, yang secara default adalah hhttp://localhost:8080/h2, maka kita kita akan di arahkan halaman console H2, masukan sesuai konfigurasi di file properties:

  • Masukan user sa dan password kosong (sesuaikan dengan konfigurasi di file properties).

H2 Console

  • Jika sukses akan masuk ke dalam H2 Console.

H2 Console

1๏ธโƒฃ Test Request GET All Productโ€‹

๐Ÿ“ API Detail:โ€‹

  • HTTP Method: GET
  • Endpoint: http://localhost:8080/api/products
  • Target: Mendapatkan semua data product.

2๏ธโƒฃ Test Request GET Product by idโ€‹

๐Ÿ“ API Detail:โ€‹

  • HTTP Method: GET
  • Endpoint: http://localhost:8080/api/products/{id}
  • Target: Mendapatkan data product berdasarkan id.

cURL commandโ€‹

curl -v http://localhost:8080/api/products

atau jika hanya langsung menggunakan http method GET:

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

โœ… Response yang diharapkanโ€‹

  • โ˜‘๏ธ Jika Data dalam Tabel Kosong
[]
  • โ˜‘๏ธ Jika Ada Data dalam Tabel (contoh dengan sample data)
[
{
"id":1,
"name":"iphone 16",
"description":"The New Generation Iphone Generation",
"price":200000.0
},
{
"id":2,
"name":"Asus ROG",
"description":"Gamin Laptop Powerfull",
"price":500000.0
}
]
info

๐Ÿ“Œ Data payload yang digunakan adalah JSON.

  • โ˜‘๏ธ Jika Ada Data berdasarkan Id:

Perintah cURL:

curl -X GET http://localhost:8080/api/products/2
  • โ˜‘๏ธ Response yang diinginkan:
{
"id":2,
"name":"Asus ROG",
"description":"Gamin Laptop Powerfull",
"price":500000.0
}

3๏ธโƒฃ Test Request POST Createโ€‹

๐Ÿ“ API Detail:โ€‹

  • HTTP Method: POST
  • Endpoint: http://localhost:8080/api/products/add
  • Content-Type: application/json
  • Request Body:
{
"name":"Macbook Pro",
"description":"Macbook Laptop for Professional",
"price":400000
}

โœ… cURL commandโ€‹

curl -d '{"name":"Macbook Pro","description":"Macbook Laptop for Professional","price":400000}' -H 'Content-Type: application/json' http://localhost:8080/api/products/add
  • โ˜‘๏ธ Response yang diinginkan
{
"id":3,
"name":"Macbook Pro",
"description":"Macbook Laptop for Professional",
"price":400000.0
}

๐Ÿ’ญ Response API akan mengembalikan product yang telah dibuat dengan id yang digenerate secara automatis.

4๏ธโƒฃ Test Request PUTโ€‹

  • HTTP Method: PUT
  • Endpoint: http://localhost:8080/api/products/{id}
  • Content-Type: application/json
  • Request Body:
{
"name":"Thinkpad X1",
"description":"Laptop for Professional",
"price":350000
}

โœ… cURL commandโ€‹

curl -d '{"name":"Thinkpad X1","description":"Laptop for Professional","price":350000}' -H 'Content-Type: application/json' -X PUT http://localhost:8080/api/products/3
  • โ˜‘๏ธ Response yang diinginkan
{
"id":3,
"name":"Thinkpad X1",
"description":"Laptop for Professional",
"price":350000.0
}

5๏ธโƒฃ Test Request DELETEโ€‹

  • HTTP Method: POST
  • Endpoint: http://localhost:8080/api/products/delete/{id}

โœ… cURL commandโ€‹

curl -X DELETE http://localhost:8080/api/products/delete/3

๐Ÿ‘€ Check Database di H2 Consoleโ€‹

Kita bisa melihat data tabel dalam database H2 melalui console web H2:

H2 Console

๐ŸŽฏ Kesimpulanโ€‹

Kita sudah dapat membuat:

  • โœ… REST API sederhana.
  • โœ… Implementasi CRUD.
  • โœ… Melakukan testing API dari client.

Project ini masih sangat sederhana, kita dapat improve lagi misalnya dengan menambahkan layer service agar businness logic tidak menumpuk di controller.