Yuk Belajar Web Service REST Spring Boot
Bismillah,
Beberapa artikel yang telah lalu saya telah membuat postingan tentang penggunaan Spring Boot, kali ini saya akan mencoba kembali untuk mengimplementasikan Web Service REST. Karena REST merupakan aplikasi web juga sehingga membutuhkan web server, tapi jangan kwatir Spring Boot telah menyediakan yaitu menggunakan Tomcat. Beberapa point yang akan kita bahas adalah sebagai berikut
- Konfigurasi Spring Boot
- Pembuatan Entitas
- Pembuatan DAO
- Pembuatan Controller
- Testing Aplikasi
- Referensi
Konfigurasi Spring Boot
Untuk kebutuhan REST kita membutuhkan beberapa depedensi seperti Spring Web Starter, Spring Data JPA, MySQL Driver, dan Lombok
. Spring Web Started
adalah depedensi yang di dalamnya terdapat paket-paket seperti Spring MVC, Tomcat, dan kebutuhan untuk aplikasi web. Potongan dari file pom.xml
adalah sebagai berikut
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
...
Selanjutnya kita akan mengkonfigurasi terkait dengan konfigurasi database, konfigurasi terkait dengan Spring Boot pada file application.properties
yang terdapat di dalam folder resources
. Isinya adalah sebagai berikut
spring.datasource.username=root
spring.datasource.password=
spring.jpa.hibernate.ddl-auto=validate
spring.datasource.url=jdbc:mysql://localhost:3306/akademik?useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=true
server.port=8081
spring.jackson.serialization.indent_output=true
Penjelasannya adalah sebagai berikut terkait dengan konfigurasi di atas
spring.jpa.hibernate.ddl-auto=validate;
memastikan stuktur yang terdapat pada entitas sama dengan struktur di database, jika beda akan ada error.spring.jpa.show-sql=true;
untuk menampilkan query ketika terjadi operasi di dalam databasespring.jpa.properties.hibernate.format_sql=true;
agara format query yang tampil di output lebih terformat.server.port=8081;
port yang digunakan oleh tomcat, defaultnya adalah 8080.spring.jackson.serialization.
indent_output
=true;
digunakan untuk merapikan tampilan ouput JSON
Pembuatan Entitas
Entitas yang akan kita gunakan adalah entitas mahasiswa, sehingga kita butuh class Mahasiswa
untuk kebutuhan tersebut. Deklarasi class dapat ditunjukkan seperti di bawah ini
@Data
@Entity
public class Mahasiswa {
@Id
private String nim;
@NotNull
@NotEmpty
private String nama;
@NotNull
@NotEmpty
private String jurusan;
@NotNull
private float ipk;
}
Penjelasan dari deklarasi class di atas, terdapat anotasi @Data
merupakan deklarasi untuk menyediakan method setter dan getter oleh Lombok. Sedangkan anotasi @NotNull
dan @NotEmpty
digunakan agar field tersebut tidak boleh NULL
dan tidak boleh kosong(empty String), anotasi tersebut membutuhkan Hibernate Validator.
Pembuatan DAO
Sementara untuk DAO menggunakan extends interface PagingAndSortingRepository
, sama seperti CrudRepository
yaitu membutuhkan wrapper berupa entitas(Mahasiswa) dan tipe data untuk ID(String). Hal utama menggunakan PagingAndSortingRepository
adalah Spring Boot telah menyediakan untuk kebutuhan pagination dan sorting. Kodenya disajikan seperti di bawah ini
import com.sinaungoding.akademik.aplikasiakademik.entity.Mahasiswa;
import org.springframework.data.repository.PagingAndSortingRepository;
public interface MahasiswaDao extends PagingAndSortingRepository<Mahasiswa, String> {
}
Di dalam interface di atas tidak ada method yang lain, tetapi misalkan ada kebutuhan lain yang tidak disediakan oleh PagingAndSortingRepository
bisa mendeklarasikan method di dalamnya.
Untuk membuat method sesuai dengan kebutuhan, perlu diperhatikan penamaan method yang kita buat. Misalkan kita akan menampilkan mahasiswa dengan ipk tertentu, nama method yang digunakan berarti
getMahasiswaByIpk
.
Pembuatan Controller
Controller diibaratkan adalah pintu masuk request dari pengguna, dalam controller bertindak meneruskan request dari pengguna atau mengembalikan kembali ke pengguna. Kira-kira potongan kode untuk controller adalah sebagai berikut
@RestController
public class MahasiswaApiController {
private static final Logger LOGGER = LoggerFactory.getLogger(MahasiswaApiController.class.getName());
@Autowired
private MahasiswaDao mahasiswaDao;
@GetMapping("/api/mahasiswa")
@ResponseBody
public Page<Mahasiswa> getAll(Pageable page) {
return mahasiswaDao.findAll(page);
}
@GetMapping("/api/mahasiswaNama")
@ResponseBody
public Page<Mahasiswa> getAllByNama(@RequestParam(name = "nama") String nama, Pageable pageable) {
return mahasiswaDao.getMahasiswaByNamaContaining(nama, pageable);
}
@GetMapping("/api/mahasiswa/{nim}")
@ResponseBody
public Mahasiswa getByNim(@PathVariable(name = "nim") Mahasiswa mahasiswa) {
return mahasiswa;
}
@PostMapping("/api/mahasiswa")
@ResponseStatus(HttpStatus.CREATED)
public void insert(@RequestBody @Valid Mahasiswa mahasiswa) {
mahasiswaDao.save(mahasiswa);
}
@PutMapping("/api/mahasiswa/{nim}")
@ResponseStatus(HttpStatus.OK)
public void update(@PathVariable("nim") String nim, @RequestBody @Valid Mahasiswa mahasiswa) {
Mahasiswa mhs = mahasiswaDao.findById("nim").get();
if (mhs == null) {
LOGGER.warn("Mahasiswa nim {} tidak ditemukan", nim);
return;
}
BeanUtils.copyProperties(mahasiswa, mhs);
mahasiswaDao.save(mhs);
}
@DeleteMapping("/api/mahasiswa/{nim}")
@ResponseStatus(HttpStatus.OK)
public void delete(@PathVariable("nim") Mahasiswa mahasiswa) {
if (mahasiswa != null) {
mahasiswaDao.delete(mahasiswa);
}
}
}
Beberapa point untuk penjelasan kode di atas adalah sebagai berikut
@RestController
; memberitahukan ke Spring bahwa class MahasiswaApiController merupakan sebuah kontroller.@Autowired
; digunakan untuk menginstance dariinterface MahasiswaDao
@GetMapping("/api/mahasiswa")
; menggunakna methodGET
untuk mendapatkan data mahasiswa,http://[host]:[port]/api/mahasiswa
@ResponseBody
; untuk memberikan response ke pemanggil menggunakan format JSON.Class Pageable
berarti data yang disajikan bisa disajikan per halaman(page).@PathVariable
; mekanisme yang digunakan untuk request menggunakan path. Misalkanhttp://[host]:[port]/api/mahasiswa/075410099
@PostMapping("/api/mahasiswa")
; berarti methodPOST
digunakan untuk menyimpan data/insert.@ResponseStatus(HttpStatus.CREATED)
; mengembalikan response ke pemanggilnya menggunakan status hpp,HttpStatus.CREATED = 201.
@RequestBody @Valid Mahasiswa mahasiswa
; berarti ketika akan melewatkan data pada sebuah body,@Valid
untuk memvalidasi data ketika melakukan request. Misalkan sebuah nama tidak boleh null atau nama tidak boleh kosong.BeanUtils.
copyProperties
(mahasiswa, mhs)
; maksudnya adalah digunakan untuk mengcopy property(nim, nama, ipk, …) objekmahasiswa
ke objekmhs
.
Testing Aplikasi
Untuk melakukan ujicoba bisa menggunakan CURL, browser, atau tool yang lain misalkan Postman. Misalkan saya menggunakan Postman untuk melakukan ambil data semua mahasiswa, contoh alamat yang bisa diakses sebagai berikut dengan methode GET
.
http://localhost:8081/api/mahasiswa
Output dari request di atas adalah sebagai berikut
{ "content": [ { "nim": "075410099", "nama": "Noprianto", "jurusan": "Teknolog Informasi", "ipk": 3.99 }, { "nim": "075410100", "nama": "Singgih Kuncoro", "jurusan": "Manajemen Informasi", "ipk": 3.5 }, { "nim": "075410101", "nama": "Singgih Permana", "jurusan": "Teknologi Informasi", "ipk": 3.54 } ], "pageable": { "sort": { "sorted": false, "unsorted": true, "empty": true }, "offset": 0, "pageSize": 20, "pageNumber": 0, "unpaged": false, "paged": true }, "last": true, "totalPages": 1, "totalElements": 3, "size": 20, "number": 0, "numberOfElements": 3, "first": true, "sort": { "sorted": false, "unsorted": true, "empty": true }, "empty": false }
Output di atas ketika kita menggunakan class Pageable
, bisa dibuat per halaman. Silakan diganti alamat requestnya seperti di bawah ini kira-kira outputnya seperti apa?
http://localhost:8081/api/mahasiswa?size=2
Jika perintah di atas hasilnya adalah jumlah data yang ditampilkan hanya menjadi 2 data saja. Kode lengkap dapat Anda dapat di sini.
Demikianlah artikel saya mengenai Web Service REST dengan Spring Boot, semoga menjadi pengetahuan yang baru bagi yang sedang belajar Java. Kritik dan saran sangat dibutuhkan untuk meningkatkan kwalitas blog ini. 🙂