- Auditing은 데이터베이스 테이블의 생성, 수정, 삭제와 같은 작업들에 대한 변경 이력을 추적하는 기능을 제공하는 방법이다.
- JPA를 이용한 방법
@MappedSuperclass
@Getter
public class JpaBaseEntity {
@Column(updatable = false)
private LocalDateTime createdDate;
private LocalDateTime updateDate;
@PrePersist
public void prePersist() {
LocalDateTime now = LocalDateTime.now();
createdDate = now;
updateDate = now;
}
@PreUpdate
public void preUpdate() {
updateDate = LocalDateTime.now();
}
}
- @MappedSuperClass : JPA에서 제공하는 기능으로, 엔티티 클래스가 아니며, 테이블과 매핑되지 않는다. @MappedSuperClass로 지정한 클래스는 실제로 테이블로 생성되지 않으며, 자식 엔티티 클래스들이 상속을 통해 필드와 매핑 설정을 재사용할 수 있다.
- @PrePersist : 엔티티가 영속화(persist)되기 전에 자동으로 호출한다.
- @PreUpdate : 엔티티가 업데이트되기 전에 자동으로 호출한다.
- 스프링 데이터 JPA 사용 방법
- BaseEntity 분리 사용
- BaseTimeEntity 클래스 생성
@EntityListeners(AuditingEntityListener.class) //알아서 다 받아서 처리해준다.
@MappedSuperclass
@Getter
public class BaseTimeEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
- 생성, 수정만 사용하는 클래스 생성
- BaseEntity
@EntityListeners(AuditingEntityListener.class) //알아서 다 받아서 처리해준다.
@MappedSuperclass
@Getter
public class BaseEntity extends BaseTimeEntity {
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
- BaseEntity는 생성, 수정자에 대한 정보를 가지고 있으며 생성, 수정 시간에 대한 클래스를 상속 받고 있다.
@EnableJpaAuditing
@SpringBootApplication
class DataJpaApplication {
static void main(String[] args) {
SpringApplication.run(DataJpaApplication, args)
}
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.of(UUID.randomUUID().toString());
}
}
- @EnableJpaAuditing 스프링 부트 설정 클래스에 적용해야한다.
- @EntityListeners(AuditingEntityListener.class) 엔티티에 적용
- Member 엔티티 BaseEntity 상속
public class Member extends BaseEntity
- Test 코드
@Test
public void JpaEventBaseEntity() throws InterruptedException {
//given
Member member = new Member("member1");
memberRepository.save(member); //@PrePersist 발생
Thread.sleep(100);
member.setUsername("member2");
em.flush(); //@PreUpdate 실행
em.clear();
//when
Member member1 = memberRepository.findById(member.getId()).get();
//then
System.out.println("member1.getCreatedDate() = " + member1.getCreatedDate());
System.out.println("member1.getUpdateDate() = " + member1.getLastModifiedDate());
}
출처 : 인프런 - 김영한(실전! 스프링 데이터 JPA)
728x90
'Programming > Spring' 카테고리의 다른 글
Spring Data JPA - 새로운 엔티티 구별하기 (0) | 2023.07.26 |
---|---|
Spring Data JPA - Web 확장 (도메인 클래스 컨버터, 페이징과 정렬) (0) | 2023.07.26 |
Spring Data JPA - 사용자 정의 리포지토리 (0) | 2023.07.26 |
Spring Data JPA - @EntityGraph (0) | 2023.07.26 |
Spring Data JPA - (벌크성 수정 쿼리) (0) | 2023.07.26 |