본문 바로가기
Java

JPA Auditing 이란? ( + Audit 기능 적용 방법, 생성일/수정일 자동화)

by yapdol 2023. 9. 1.

 

 

 

 

 

 

 

 

 

 

✅  JPA Auditing 이란?

(사전적 의미) Audit : 감시하다

Spring Data JPA 에서 제공하는 Audit 기능은 DB에서 값이 변경되었을때, '누가/언제' 변경했는지 감사하는 기능.

→ 누가/언제 데이터를 변경했는지 엔티티의 변화를 추적.

 

  Audit 기능을 적용할 수 있는 필드 (애너테이션)

- 생성 시간 필드 (@CreatedDate : 데이터 생성 날짜 자동 저장)

- 수정 시간 필드 (@LastModifiedDate : 데이터 수정 날짜 자동 저장)

- 생성자 ID 필드 (@CreatedBy : 데이터 생성자 자동 저장)

- 수정자 ID 필드 (@LastModifiedBy : 데이터 수정자 자동 저장)

@CreatedDate // 엔티티 생성/ DB 저장 될 때, 생성 시간 자동 저장
private LocalDateTime createdAt;

@LastModifiedDate // 엔티티의 값이 변경될 때, 수정 시간 자동 저장
private LocalDateTime updatedAt;

@CreatedBy // 엔티티를 생성한 유저의 ID 자동 저장.
private Long createdId;

@LastModifiedBy // 엔티티를 수정한 유저의 ID 자동 저장.
priavte Long modifiedId;

 

 

✅  Audit 기능 적용 방법  

(모든 Entity에 날짜를 적용하는 등) 중복 코드를 제거하기위해 Auditing을 사용 (AOP 처럼 구현)

 

1. JP A Audit 활성화 ( @EnableJpaAuditing )

@EnableJpaAuditing 

: configuration 애너테이션을 통해 JPA 에서 auditing 을 가능하게 하는 애너테이션.

데이터의 변화추적된 값들을 필드에 적용하기 위해 사용.

@EnableJpaAuditing // created_at, updated_at 자동 업데이트
@SpringBootApplication
public class SpringBootDeveloperApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootDeveloperApplication.class, args);
    }
    
}

 

2. Auditable 클래스 생성

모든 엔티티에 Audit 필드를 적용하기 위한 클래스.

 

Auditable 클래스에 적용해야하는 애너테이션 ]

@Getter 
@MappedSuperclass :
해당 클래스를 부모 클래스로 정의 (상속받는 Entity에 공통으로 필드 제공).
@EntityListeners :
Entity를 DB에 적용 전/후에 커스텀콜백 요청.

    * 커스텀콜백 : 특정 이벤트가 발생한 시점에 알림을 수신하는 메서드.

 

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class Auditable {

@CreatedDate // 엔티티 생성/ DB 저장 될 때, 생성 시간 자동 저장
private LocalDateTime createdAt;

@LastModifiedDate // 엔티티의 값이 변경될 때, 수정 시간 자동 저장
private LocalDateTime updatedAt;

@CreatedBy // 엔티티를 생성한 유저의 ID 자동 저장.
private Long createdId;

@LastModifiedBy // 엔티티를 수정한 유저의 ID 자동 저장.
priavte Long modifiedId;

}

 

 

3.  Entity 에 적용

@MappedSuperclass가 적용된 클래스를 상속받는 모든 엔티티에 

생성시간, 수정시간, 생성자, 수정자 컬럼 자동 생성 및 값 저장.

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Answer extends Auditable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", updatable = false)
    private Long id;

    @Column(name = "title", nullable = false)
    private String title;

    @Column(name = "content", nullable = false)
    private String content;
    
}

 

 

 

 

 

 

참고자료 :

https://taegyunwoo.github.io/jpa/JPA_AutoCreatedModifiedTime

https://kang-james.tistory.com/entry/JPA-JPA%EC%97%90%EC%84%9C-Spring-Data%EC%9D%98-Audit-%EA%B8%B0%EB%8A%A5-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0