Arsitektur Spring Boot - Controller, Service, Repository dan Database
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.

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
@Repositoryannotation 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.