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.