[본 포스팅은 실전! 스프링 데이터 JPA -인프런 편을 기반으로 작성하였습니다.]
(스프링 데이터 JPA를 사용합니다.)
JPA에서 Auditing을 사용해 등록일, 수정일, 등록자, 수정자 기록을 남길 수 있다.
실무에서는 최소한의 등록일, 수정일 정도의 기록이 없으면 나중에 힘들어진다고 한다..!
코드로 따라 해 보기
STEP 1)
main 함수가 들어가 있는 클래스에
@EnableJpaAuditing 애노테이션을 넣고, 작성자, 수정자를 넣을 수 있도록 함수 넣어주기
@EnableJpaAuditing
@SpringBootApplication
public class DataJpaApplication {
public static void main(String[] args) {
SpringApplication.run(DataJpaApplication.class, args);
}
@Bean
public AuditorAware<String> auditorProvider() {
//작성자, 수정자 아이디 생성
//실무에서는 쿠키나 세션 ID를 넣어서 저장해야 된다!
return () -> Optional.of(UUID.randomUUID().toString());
}
}
이렇게 애노테이션과 함수를 넣어주는데 함수의 경우 현재 UUID로 랜덤값을 넣어줬지만 실제로는 쿠키나 세션 정보를 가져와 ID를 넣어줘야 한다.
STEP 2)
최상위 부모인 저장일, 수정일을 저장할 엔티티 만들기!
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public class BaseTimeEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifiedDate;
}
위와 같이 애노테이션과 변수를 넣어주면 된다.
updatable = false를 준 이유는 수정이 불가능하도록 하기 위해서이다.
여기서 왜 최상위 부모라고 했냐면 작성자와 수정자는 필요가 없는 테이블들이 존재할 수밖에 없기 때문에 날짜 엔티티를 최상위로 두고 작성자, 수정자 엔티티는 자식으로 둘 것이다.
STEP 3)
자식인 작성자, 수정자를 저장할 엔티티 만들기!
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public class BaseEntity extends BaseTimeEntity {
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String lastModifiedBy;
}
이렇게 날짜와 작성자, 수정자를 따로 둔 이유는 앞서 말한 것처럼 작성자와 수정자는 비었을 수 있기 때문이다.
STEP 4)
Auditing을 Member 엔티티에 적용해 보기
public class Member extends BaseEntity
클래스에 상속만 받으면 끝이다!
STEP 5)
저장된 엔티티 시간 정보와 작성자, 수정자 꺼내서 보기
@Test
public void JpaEventBaseEntity() throws Exception {
//given
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.createdDate = " + findMember.getCreatedDate());
System.out.println("findMember.lastModifiedDate = " + findMember.getLastModifiedDate());
System.out.println("findMember.createdBy = " + findMember.getCreatedBy());
System.out.println("findMember.lastModifiedBy = " + findMember.getLastModifiedBy());
}
테스트 코드를 사용해봤고 위와 같이 꺼내서 볼 수 있다.
더티 체킹이 일어날 경우 자동으로 수정으로 인식하고 수정일, 수정자만 업데이트한다.
'JAVA > JPA' 카테고리의 다른 글
[JPA/QueryDSL] N+1 문제 해결하는 방법(EntityGraph, fetchJoin) (0) | 2023.05.31 |
---|---|
[JPA] 스프링 데이터 JPA로 벌크성 수정 쿼리 날려보기 (0) | 2023.01.02 |
[JPA] 스프링 데이터 JPA 페이징과 정렬 (feat. DTO를 사용해야 하는 이유) (0) | 2023.01.02 |
[JPA/JPQL] 페치 조인(fetch join)이란? 특징과 한계 - 엔티티 페치 조인, 컬렉션 페치 조인, DISTINCT로 중복 제거 (0) | 2022.12.29 |
[JPA] @MappedSuperclass로 공통 칼럼 상속받기 (0) | 2022.12.23 |