개발/Spring Data JPA(KYH)

Spring Data JPA - Auditing

잇(IT) 2023. 7. 26. 13:45
728x90

- 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