빡코

[스프링데이터 JPA] Auditing 본문

Java/JPA

[스프링데이터 JPA] Auditing

chris.djang 2023. 5. 11. 21:59

엔티티를 생성, 변경할 때 변경한 살마과 시간을 추적하고 싶을 때 사용한다. 

등록일, 수정일, 등록자, 수정자 

 

@MappedSuperclass //속성들을 내려서 테이블에서 생성이된다.

package study.datajpa.entity;


import javax.persistence.Column;
import javax.persistence.MappedSuperclass;
import javax.persistence.PrePersist;
import javax.persistence.PreUpdate;
import java.time.LocalDateTime;

@MappedSuperclass //속성들을 내려서 테이블에서 생성이된다.
public class JpaBaseEntity {

    @Column(updatable = false)
    private LocalDateTime createdDate;
    private LocalDateTime updatedDate;

    @PrePersist
    public void prePersist(){
        LocalDateTime now = LocalDateTime.now();
        createdDate = now;
        updatedDate = now;
    }

    @PreUpdate
    public void preUpdate() {
        updatedDate = LocalDateTime.now();
    }


}

 

상속 

public class Member extends JpaBaseEntity {
}

 

내려 받은 두개의 컬럼이 생성된 것을 확인할 수 있다. 

테스트 코드 

@Autowired
MemberRepository memberRepository;

@Test
@Transactional
public void JpaEventBaseEntity() throws Exception {
    Member member = new Member("member1");
    memberRepository.save(member); // @PrePersist 발생


    Thread.sleep(100);
    member.setUsername("member2");
    em.flush();
    em.clear();

    //when
    Member findMember = memberRepository.findById(member.getId()).get();

    //then
    System.out.println("findMember.getCreatedDate " + findMember.getCreatedDate());
    System.out.println("findMember.getUpdatedDate " + findMember.getUpdatedDate());
}

실행 결과 

findMember.getCreatedDate 2023-05-11T22:05:51.915430
findMember.getUpdatedDate 2023-05-11T22:05:52.084978

 

 

스프링데이터 Auditing 적용 - 등록일, 수정일

@EnableJpaAuditing 어노테이션 필수 추가 

@EnableJpaAuditing
@SpringBootApplication
public class DataJpaApplication {

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

	@Bean
	public AuditorAware<String> auditorProvider(){
		return()-> Optional.of(UUID.randomUUID().toString());
	}
    
    //위와 같은 코드 
//	@Bean
//	public AuditorAware<String> auditorProvider() {
//		return new AuditorAware<String>() {
//			@Override
//			public Optional<String> getCurrentAuditor(){
//				return Optional.of(UUID.randomUUID().toString());
//			}
//		}
//	}

}
@EntityListeners(AuditingEntityListener.class) //이벤트 기반으로 동작한다
@MappedSuperclass
@Getter
public class BaseEntity {

    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;

    //등록자, 수정자
    @CreatedBy
    @Column(updatable = false)
    private String createdBy;

    @LastModifiedBy
    private String lastModifiedBy;

}

Meber 엔티티 변경 

public class Member extends BaseEntity {
}
@Autowired
MemberRepository memberRepository;

@Test
@Transactional
//@Rollback(value = false)
public void JpaEventBaseEntity() throws Exception {
    Member member = new Member("member1");
    memberRepository.save(member); // @PrePersist 발생


    Thread.sleep(100);
    member.setUsername("member2");
    em.flush();
    em.clear();

    //when
    Member findMember = memberRepository.findById(member.getId()).get();

    //then
    System.out.println("f/indMember.getCreatedDate " + findMember.getCreatedDate());
    System.out.println("findMember.getUpdatedDate " + findMember.getLastModifiedDate());
    System.out.println("findMember.getCreateBy " + findMember.getCreatedBy());
    System.out.println("findMember.getLastModifiedBy " + findMember.getLastModifiedBy());
}
f/indMember.getCreatedDate 2023-05-11T23:07:16.074374
findMember.getUpdatedDate 2023-05-11T23:07:16.253899
findMember.getCreateBy 39c08ec8-2dcd-4c77-ac9a-c432e0045226
findMember.getLastModifiedBy 44c8ec53-f47f-4be4-8c16-a97e12103e7b