프로그래밍/JPA

스프링 데이터 JPA - Auditing 등록일, 수정일, 등록자, 수정자 자동 입력?

duburani 2023. 6. 20. 21:56

하.. 개인 프로젝트 하면서도 어떻게 하면 해당 값들을 자동적으로 넣어줄 수 있을까? 하며 고민했던 부분이다.

그런데 강의로 이렇게 나와 있고 너무나도 간편하게 사용할 수 있다니..! 대박적

진짜 우물 안 개구리가 맞았다.. ㅠㅠ 이런 기능들 모르고 있었다니.. 그리고 쓰지 않는다니.. 흑흑.. 넘 절망적 ㅠ

그치만 지금이라도 알게되어서 다행이다

 

 

 

@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public class BaseEntity extends BaseTimeEntity{
    @CreatedBy
    @Column(updatable = false)
    private String createBy;

    @LastModifiedBy
    private String lastModifiedBy;
}

 

@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
@Getter
public class BaseTimeEntity {
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
}

 

등록일, 수정일은 사실 거의 모든 Entity에서 쓰인다고 보면 되고 등록자, 수정자가 쓰이지 않는 경우도 있기 때문에 둘을 분리하여 사용하는 걸 권장한다고 한다.

내 경우에도 이게 좀 더 맞는 걸로 보여서 위와 같은 방식을 따라가기로 ~!

 

 

@Entity
public class Member extends BaseEntity{}

아무튼 BaseEntity를 상속하면 된다.

 

 

아참

이전에 Application.java에 설정을 또 따로 해줘야하는데..

@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());
    }
}

@EnableJpaAuditing 필수필수

 

그리고 아래의 빈은 등록, 수정자 구현할 때 추가적으로 필요하다.

 

 

    @Test
    public void JpaEventBaseEntity() throws InterruptedException {
        Member member = new Member("member1");
        memberRepository.save(member);

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

        em.flush();
        em.clear();

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

        System.out.println("findMember.createDate() = " + findMember.getCreateDate());
        System.out.println("findMember.updateDate() = " + findMember.getLastModifiedDate());
        System.out.println("findMember.createBy() = " + findMember.getCreateBy());
        System.out.println("findMember.updateBy() = " + findMember.getLastModifiedBy());
    }

아무튼 이렇게 구현해주면...

 

결과로도 알 수 있듯이 등록, 수정일이 다르게 나온다~!

등록, 수정자는 UUID로 계속 랜덤한 값이 나오도록 설정해놔서 다른 값이지만 이건 세션에서 꺼내오도록 하면 뭐 동일하게 나올 것이다.

 

이 부분은 정말 실무에서든 개인 프로젝트이든 중요하게 쓰일 것 같으니 그때 다시 파헤쳐보도록 하겠다.

하하 강의를 들으면 들을 수록 개인 프로젝트를 뜯어고칠 생각에 가슴이 또 한번 웅장..~