# SE1EP4 - Framework

# References

# 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

spring-boot-start

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. sb1

# - Running Project

Untuk menjalankan project, kamu tidak pelu menambahkan konfigurasi baru, karena secara default Intellij Idea sudah menyediakan konfigurasi yang sudah bisa jalankan:
sb2

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

sb3

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: sb4

Kemudian buatlah 1 class dengan nama HelloController (tanpa extensi .java): sb5

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:

sb6

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