[실전! 스프링 데이터 JPA] Auditing (등록일, 수정일, 등록자, 수정자)

강신현·2022년 8월 12일
0

✅ @EnableJpaAuditing ✅ @MappedSuperclass ✅ @CreatedDate ✅ @LastModifiedDate ✅ @CreatedBy ✅ @LastModifiedBy


필요성

엔티티를 생성, 변경할 때 변경한 사람과 시간을 추적하고 싶을 때마다 로그를 뒤지는 것은 시간적으로 비효율적이다.
따라서 강사님은 운영시 편리함을 위해 모든 엔티티에 아래 Auditing을 적용한다고 한다.

  • 등록일
  • 수정일
  • 등록자
  • 수정자

구현

  • main
@EnableJpaAuditing // 등록일, 수정일 기능 제공
@SpringBootApplication
public class DataJpaApplication {

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

	// 등록자, 수정자 처리를 위한 AuditorAware 스프링 빈 등록
	@Bean
	public AuditorAware<String> auditorProvider() {
		return () -> Optional.of(UUID.randomUUID().toString());
	}
}

👉 실무에서는 세션 정보나, 스프링 시큐리티 로그인 정보에서 ID를 받음

  • BaseEntity
@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;
}
  • Member
public class Member extends BaseEntity{
	...
}
  • test
@Test
public void JpaEventBaseEntity() throws Exception {
    //given
    Member member = new Member("member1");
    memberRepository.save(member); //@PrePersist

    Thread.sleep(100);
    member.setUsername("member2");

    em.flush(); //@PreUpdate
    em.clear();

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

    //then
    System.out.println("findMember.createdDate = " + findMember.getCreatedDate());
    System.out.println("findMember.updatedDate = " + findMember.getLastModifiedDate());
    System.out.println("findMember.createdBy = " + findMember.getCreatedBy());
    System.out.println("findMember.lastModifiedBy = " + findMember.getLastModifiedBy());
}

구현2

실무에서 대부분의 엔티티는 등록시간, 수정시간이 필요하지만, 등록자, 수정자는 없을 수도 있다.
그래서 다음과 같이 Base 타입을 분리하고, 원하는 타입을 선택해서 상속한다.

  • BaseTimeEntity
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public class BaseTimeEntity {
        @CreatedDate
        @Column(updatable = false)
        private LocalDateTime createdDate;
        @LastModifiedDate
        private LocalDateTime lastModifiedDate;
}
  • BaseEntity
public class BaseEntity extends BaseTimeEntity {
    @CreatedBy
    @Column(updatable = false)
    private String createdBy;
    @LastModifiedBy
    private String lastModifiedBy;
}

강의 출처

[인프런 - 김영한] 실전! 스프링 데이터 JPA

profile
땅콩의 모험 (server)

0개의 댓글