Spring Data - JPA Audit
Pendahuluan
Audit..
Maksudnya ?
Iyaa.. Audit, masak nggak tau ?
Dari wikipedia di sini:
Audit merupakan sebuah proses pengumpulan serta pemeriksaan bukti mengenai informasi guna menentukan dan membuat laporan terkait tingkat kesesuaian antara informasi dan kriteria yang ditetapkan.
Aaargh, lagi-lagi tentang definisi, bisa lebih sederhana lagi ?
Baiklah..
Audit secara sederhana merupakan proses pengecekan sesuatu.
Dimulai dengan pengumpulan catatan-catatan mengenai semua kejadian yang dibutuhkan.
Jadi bahan mentahnya adalah catatan-catatan.
Spring Data JPA ?
Kalau untuk kasus kita ini, adalah mengenai Data
Yaa, tentu saja, namanya juga Spring Data JPA.
Catatan-catatan mengenai :
- Kapan sebuah data dibuat ?
- Kapan data tersebut diubah ?
- Attribut apa saja yang diubah dari data tersebut ?
- Siapa yang mengubah data tersebut ?
- Apa alasan data tersebut diubah ?
- dll.
Tentunya informasi diatas disimpan dalam bentuk Data juga, misalnya sebagai tambahan kolom di table.
Biasanya kita dapati kolom-kolom tambahan di sebuah tabel dengan nama :
- CREATED_DATE
- CREATED_BY
- LAST_MODIFIED_DATE
- LAST_MODIFIED_BY
- REMARKS
- REASON
- dll.
Kita bisa saja membuat secara manual kolom-kolom tersebut, dan mengisi datanya ketika sebuah data dibuat, dimodifikasi, oleh siapa, karena apa, dll.
Spring Data JPA Audit ?
Spring Data JPA membantu kita agar tidak melakukan hal-hal diatas secara manual.
Terutama untuk kasus Kapan dan Siapa yang memodifikasi sebuah data.
Kalau kita mapping ke hal yang lebih teknikal, maka untuk sebuah record di database, perlu dicatat :
- @CreatedDate
- @CreatedBy
- @LastModifiedDate
- @LastModifiedBy
Secara otomatis, Spring Data JPA Audit akan memapping ke kolom :
- CREATED_DATE
- CREATED_BY
- MODIFIED_DATE
- MODIFIED_BY
Untuk kolom-kolom lainnya seperti REMARKS, REASON, dll tetap saja kita harus melakukan update nya secara manual.
Contoh
Misalnya kita memakai library Spring Boot Data JPA sbb :
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
Dan kita mesti menambahkan @EnableJpaAuditing di file konfigurasi atau di class Application Spring Boot kita.
Agar Spring framework mengaktifkan fungsi JPA Auditing ini.
@SpringBootApplication
@EnableJpaAuditing
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Dan POJO untuk record data di database, sbb :
Kita perlu menambahkan @EntityListener(AuditingEntityListener.class) di POJO kita ini agar bisa otomatis diisi kolom yang bersesuaian dengan data yang cocok.
@EntityListener ini berfungsi sebagai listener kalau ada insert atau update terhadap POJO/Entity kita ini.
@Data
@Entity
@EntityListener(AuditingEntityListener.class)
@Table(name = "TABLE_MENU")
public class Menu {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(nullable = false)
@NotBlank(message = "name is required")
private String judulMenu;
@CreatedBy
@Column(nullable = false, updatable = false)
private String createdBy;
@CreatedDate
@Column(nullable = false, updatable = false, columnDefinition="TIMESTAMP")
private LocalDateTime created;
@LastModifiedBy
@Column(nullable = false)
private String modifiedBy;
@LastModifiedDate
@Column(nullable = false, columnDefinition="TIMESTAMP")
private LocalDateTime modifiedDate;
}
Dan tentunya kita juga menambahkan 4 anotasi berikut untuk kolom-kolom yang bersesuaian :
- @CreatedDate
- @CreatedBy
- @LastModifiedDate
- @LastModifiedBy
CreatedBy dan LastModifiedBy didapat dari mana ?
Oh iya, hampir saja ketinggalan.
CreatedBy dan LastModifiedBy bisa didapat dari konfigurasi terpisah sendiri yang implements AuditorAware interface :
public class AuditorAwareImpl implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
return Optional.of("Huzefril");
}
}
Dan tentunya kita mesti passing nama bean ini di Spring Boot Application kita, dan register sebagai bean.
@SpringBootApplication
@@EnableJpaAuditing(auditorAwareRef = "auditorAware")
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
public AuditorAware<String> auditorProvider() {
return new AuditorAwareImpl();
}
}
Dan taddaaa…otomatis kalau kita melakukan insert dan update terhadap POJO/Entity diatas , maka field-field Audit di atas akan terisi secara otomatis.