Skip to main content

Arsitektur Spring Boot - Controller, Service, Repository dan Database

ยท 5 min read
Ucup TopekoX
Ucup TopekoX
TimposuLabs creator

Spring Boot ๐Ÿƒ adalah salah satu framework paling populer untuk membangun API RESTful dan Microservices di Java. Spring Boot menyederhanakan pengembangan aplikasi Java dengan menyediakan environtment yang telah dikonfigurasi sebelumnya, menyederhanakan penulisan kode, dan memastikan scalability dan maintainability.

๐Ÿ“Œ Arsitektur Spring Bootโ€‹

Pada tutorial ini kita akan meng-eksplore Spring Boot Layered Architecture, dan bagaimana data mengalir di antara masing-masing komponen layer tersebut. Sebelumnya, kenapa kita harus menggunakan arsitektur tersebut:

  • โ˜‘๏ธ Struktur kode program lebih terorganisasi.
  • โ˜‘๏ธ Scalability: Membuat aplikasi lebih mudah dikembangkan/diperluas.
  • โ˜‘๏ธ Maintainability: Masing-masing layer memiliki tugasnya masing-masing.
  • โ˜‘๏ธ Faster Development: Menyederhanakan interaksi API dan database.

๐Ÿ” Spring Boot Layered Architectureโ€‹

Arsitektur Spring Boot didasarkan pada pendekatan berlapis/layered, di mana setiap lapisan/layer bertanggung jawab atas bagian tertentu dari aplikasi.

 Spring Boot Architecture

1๏ธโƒฃ Client Layer (Pengguna API)โ€‹

Client Layer adalah entitas eksternal dari aplikasi Spring Boot (browser, aplikasi seluler, Postman, aplikasi frontend) yang berinteraksi dengan API.

Client akan:

  • โœ”๏ธ Mengirim HTTP Requests (GET, POST, PUT, DELETE)
  • โœ”๏ธ Menerima API Responses (JSON format)

Contoh client:

  • โœ”๏ธ Frontend apps (React, Angular, Vue.js)
  • โœ”๏ธ Mobile apps (Android, iOS)
  • โœ”๏ธ API testing tools (Postman, cURL)

2๏ธโƒฃ Controller Layer (Menangani HTTP Requests & Responses)โ€‹

Controller Layer bertindak sebagai pintu masuk untuk permintaan API. Dia bertanggung jawab untuk memproses permintaan HTTP yang masuk/request dan mengembalikan response yang sesuai.

๐Ÿ“Œ Tugas Controller Layerโ€‹

  • โœ”๏ธ Menerima requests dari client (@GetMapping, @PostMapping, dsb.).
  • โœ”๏ธ Melakukan validasi dari data yang diinput.
  • โœ”๏ธ Memanggil Service Layer untuk business logic.
  • โœ”๏ธ Mengembalikan response HTTP yang sesuai.

๐Ÿ“Œ Contoh Controllerโ€‹

@RestController
@RequestMapping("/api/person")
public class PersonController {

private final PersonService personService;

public PersonController(PersonService personService) {
this.personService = personService;
}

// โœ… GET: get all person (200 OK)
@GetMapping
public ResponseEntity<List<PersonDTO>> getAll() {
return ResponseEntity.ok(personService.getAll());
}
}

๐Ÿš€ Controller bukan untuk bussines logic. Dia hanya mengatur permintaan ke method pada layer service yang sesuai.

3๏ธโƒฃ Service Layer (Business Logic Processing)โ€‹

Service Layer bertanggung jawab untuk menerapkan bussines logic dan memproses data sebelum mengirimkannya ke client.

๐Ÿ“Œ Tugas Service Layerโ€‹

  • โœ”๏ธ Mengimplementasikan business rules dan logic.
  • โœ”๏ธ Menangani transactions.
  • โœ”๏ธ Memanggil Layer Repositori untuk interaksi ke database.
  • โœ”๏ธ Menggunakan DTO (Data Transfer Objek) untuk struktur data.

๐Ÿ“Œ Contoh Serviceโ€‹

@Service
public class PersonService {

private final PersonRepository personRepository;
private final PersonMapper personMapper;

public PersonService(PersonRepository personRepository, PersonMapper personMapper) {
this.personRepository = personRepository;
this.personMapper = personMapper;
}

public List<PersonDTO> getAll() {
return personRepository.findAll().stream()
.map(personMapper::toPersonDTO)
.toList();
}
}

๐Ÿš€ Service layer memastikan bahwa Controller tidak mengandung bussines logic. Dia bertanggung jawab untuk menangani business operations pada aplikasi.

4๏ธโƒฃ Repository Layer (Database Access Layer)โ€‹

Repository Layer bertanggung jawab untuk berkomunikasi dengan database.

Hal-hal yang perlu diperhatikan:

  • โ˜‘๏ธ Menggunakan Spring Data JPA untuk melakukan operasi CRUD.
  • โ˜‘๏ธ Menggunakan @Repository annotation untuk menandai bahwa dia adalah DAO (Data Access Object).
  • โ˜‘๏ธ Mengimplementasikan queri database menggunakan JPA, Hibernate, atau Native SQL.

๐Ÿ“Œ Contoh Repositoryโ€‹

public interface PersonRepository extends JpaRepository<Person, Long> {
}

๐Ÿš€ Spring Data JPA mengurangi penggunaan kode CRUD boilerplate dengan menyediakan method yang telah dibuat oleh Spring Data JPA secara otomatis seperti findAll(), save(), deleteById() dll.

5๏ธโƒฃ Model Layer (Entity & DTO Representation)โ€‹

Model Layer mewakili tabel yang ada dalam database dan memastikan enkapsulasi data.

Hal-hal yang diperhatikan:

  • Entity dipetakan ke tabel database.
  • DTO (Objek Transfer Data) hanya membantu mentransfer data yang diperlukan.

๐Ÿ“Œ Contoh Entityโ€‹

@Entity
public class Person {

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

private String firstName;

private String lastName;

}

๐Ÿš€ Entity tidak boleh diekspose secara langsung dalam response API. Sebagai gantinya, kita menggunakan DTO.

๐Ÿ“Œ Contoh DTO menggunakan Java Recordโ€‹

public record PersonDTO(Long id, String firstName, String lastName) {
}

๐Ÿš€ Menggunakan record untuk DTO, akan membuat immutable dan kode lebih clean.

6๏ธโƒฃ Database Layerโ€‹

Database Layer untuk menyimpan dan mengambil data menggunakan framework persistence Spring Boot.

Hal-hal yang diperhatikan:

  • Menggunakan database relasional (MySQL, MariaDB, PostgreSQL, Oracle, Ms SQL, H2, dll.).
  • Menggunakan JPA dan Hibernate untuk mengelola entity mapping.
  • Menjalankan query menggunakan operasi CRUD.

๐Ÿ“Œ Contoh Konfigurasi Database pada application.propertiesโ€‹

spring.datasource.url=jdbc:mariadb://localhost:3306/belajar
spring.datasource.driverClassName=org.mariadb.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.jpa.database-platform=org.hibernate.dialect.MariaDBDialect
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update

๐Ÿš€ Konfigurasi di atas menggunakan database MariaDB. Untuk database lain tentunya memiliki konfigurasi yang berbeda.

โœ… Bagaimana Alur Data Mengalir?โ€‹

  • 1๏ธโƒฃ Client mengirim request HTTP ke layer Controller.
  • 2๏ธโƒฃ Layer Controller melakukan validasi request dan meneruskan ke layer Service.
  • 3๏ธโƒฃ Layer Service memproses bussines logic dan memanggil layer Repository.
  • 4๏ธโƒฃ Layer Repository mengambil atau memperbaharui data yang ada di Database.
  • 5๏ธโƒฃ Layer Model memetakan/mapping database record ke Java object.
  • 6๏ธโƒฃ Data yang sudah diproses dikirim kembali ke layer Service, lalu ke layer Controller, dan akhirnya dikembalikan ke Client sebagai response API.

๐ŸŽฏ Kesimpulanโ€‹

  • โœ… Memisahkan layer arsitektur berdasarkan fungsinya, sehingga penanganan permasalahan antar layer lebih baik.
  • โœ… Menggunakan Controller, Service, Repository, Model dan Database layer.
  • โœ… Memastikan kode program lebih clean, maintainability dan scalability.
  • โœ… Menggunakan Spring Data JPA untuk interaksi ke database.

๐ŸŒ Referensiโ€‹