# SE1EP4 - Framework
# References
- Spring Boot (opens new window)
- Spring JPA (opens new window)
- Spring Boot H2 Database (opens new window)
- Spring Hibernate Entity Manager (opens new window)
# Spring Boot Basic
# - Spring Boot Framework
Spring merupakan framework Java yang mempermudah para programmer dalam membuat sebuah aplikasi Java dengan menerapkan salah satunya adalah design-patern : dependency-injection. Beberapa Fitur yang disediakan Spring Framework adalah sebagai berikut:
- Depedency Injection
- Aspect Oriented Programming
- Spring MVC dan Restful Web Service
- Support koneksi database, dsb.
- Spring framework digunakan karena kemudahan dalam pengaturan projek kedepannya, karena segala sesuatunya sudah disediakan oleh Spring Framework.
Spring Boot merupakan salah satu jenis framework dari Spring. Namun di Spring Boot , kita lebih dipermudah dalam pembuatan program karena :
Sudah disediakan Tomcat dan beberapa server lain, sehingga kita hanya perlu run. Menggunakan Maven sebagai build manager yang dapat kita atur di Project Object Model (POM) Anotasi-anotasi ajaib yang mempermudah kita dalam menentukan komponen kelas-kelas, dsb.
# - Membuat Project
Untuk membuat project Spring Boot cukup mudah, kamu cukup mengunjungi link berikut ini:
start.spring.io
- Pilih Project Maven
- Language Java
- Tambahkan Dependency Spring Web
- Lalu klik generate
Kemudian extract file hasil download:
unzip demo.zip
Buka folder yang sudah di extract dengan Intellij Idea dan tunggu sampai proses inisialisasi selesai pada progress bar di kanan bawah.
# - Running Project
Untuk menjalankan project, kamu tidak pelu menambahkan konfigurasi baru, karena secara default Intellij Idea sudah menyediakan konfigurasi yang sudah bisa jalankan:
Atau melalui terminal dengan perintah berikut:
./mvnw spring-boot:run
Setelah project berhasil dijalankan, maka aplikasi bisa dibuka melalui web browser pada url berikut:
http://localhost:8080
Tampilan dari web secara default masih error 404, karena belum memiliki endpoint. Sampai tahap ini kamu sudah berhasil menjalankan project Spring Boot.
# - Controller
Controller adalah class dimana logic dari sebuah endpoint akan didefinisikan. Untuk membuat controller kamu perlu membuat 1 package (folder) baru dengan nama controller, pada package com.example
:
Kemudian buatlah 1 class dengan nama HelloController
(tanpa extensi .java
):
Isi controller dengan kode berikut:
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class HelloController {
@GetMapping("/")
public Map<String, String> indexAction() {
Map<String, String> res = new HashMap<>();
res.put("message", "Hello world");
return res;
}
}
Kemudian jalankan ulang spring boot, lalu refresh web browser:
Maka pada tahap ini API endpoint kamu sudah siap digunakan.
# - Restful API
Untuk membuat Restful API pada Spring Boot kamu cukup menambahkan annotation @RestController
pada controller yang akan kamu gunakan sebagai Rest API.
Response object bisa saja beragam, seperti java.util.List
, java.util.Map
dan lain sebagainya.
# - Autowired
Autowired merupakan salah satu annotation yang penting pada framework spring. Dengan Autowired kita bisa melakukan dependency injection dari class yang dibutuhkan ke sebuah attribute pada class lainnya.
Untuk mencoba menggunakan autowired, kamu bisa membuat sebuah class dengan nama com.example.demo.config.ApplicationConfig
dengan isi sebagai berikut:
package com.example.demo.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
@Configuration
public class ApplicationConfig {
@Value("${base_url}")
public String baseURL;
}
Kemudian tambahkan konfigurasi baru pada file application.properties
di folder resources
:
base_url=http://localhost:8080
Lalu tambahkan @Autowired
pada controller dan restart project:
package com.example.demo.controller;
import com.example.demo.config.ApplicationConfig;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@RestController
public class HelloController {
@Autowired
ApplicationConfig config;
@GetMapping("/")
public Map<String, String> indexAction() {
Map<String, String> res = new HashMap<>();
res.put("message", "Hello world");
res.put("base_url", config.baseURL);
return res;
}
}
# - Spring Data JPA
Untuk menggunakan Spring Data JPA, kamu perlu menambahkan beberapa dependency pada pom.xml
:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
Siapkan 2 package baru dalam package com.example.demo
yaitu:
com.example.demo.entity
com.example.demo.repository
# - Konfigurasi Database
Tambahkan konfigurasi berikut pada application.properties
:
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
# - Entity
Buatlah 1 class dengan nama com.example.demo.entity.Product
dengan kode berikut:
package com.example.demo.entity;
import jakarta.persistence.*;
@Entity
public class Product {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
Long id;
String name;
// setter getter ...
}
# - JPA Repository
Buatlah 1 interface dengan nama com.example.demo.repository.ProductRepository
dengan kode berikut:
package com.example.demo.repository;
import com.example.demo.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
public interface ProductRepository extends JpaRepository<Product, Long> {}
Setelah entity dan repository dibuat, tambahkan autowired untuk ProductRepository
pada controller, serta 2 endpoint baru untuk menampung method POST
dan GET
:
@Autowired
ProductRepository productRepository;
@PostMapping("/api/v1/products")
public Product createProduct(@RequestBody Product product) {
productRepository.save(product);
return product;
}
@GetMapping("/api/v1/products")
public List<Product> getProduct() {
return productRepository.findAll();
}
jalankan ulang project kemudian cobalah kirimkan data melalui http client seperti contoh berikut:
curl -X POST \
-d '{"name": "air mineral"}' \
-H 'Content-type: application/json' \
http://localhost:8080/api/v1/products
# - Query
Pada Spring Data JPA, hampir tidak ada query manual ke database. Segala aktifitas CRUD hampir secara keseluruhan dapat ditangani oleh ORM. Tapi jika kamu membutuhkan query yang advanced atau lebih kompleks kamu bisa menggunakan EntityManager
seperti berikut:
@Autowired
EntityManager em;
@GetMapping("/api/v1/products/search")
public List<Product> findProduct(@RequestParam(value = "name", required = false) String name) {
TypedQuery<Product> query =
em.createQuery("SELECT p FROM Product p WHERE LOWER(p.name) ILIKE :name", Product.class);
query.setParameter("name", "%" + name + "%");
return query.getResultList();
}
Jalankan ulang project, kemudian buka url berikut di web browser:
http://localhost:8080/api/v1/products/search?name=product1
# - Build Project
Untuk melakukan build project pada Spring Boot, kamu cukup menjalankan perintah berikut di terminal:
./mvnw package
# Output file: target/demo-0.0.1-SNAPSHOT.jar