[Spring] Auditing

박준형·2023년 11월 22일
0

Spring

목록 보기
10/17
post-thumbnail

📌순수 JPA 사용

@Getter
@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();
    }
}
  • @PrePersit 를 적용하면 값이 저장(save)될 때 자동으로 실행된다.
  • @PreUpdate 를 적용하면 값이 수정(update)될 때 자동으로 실행된다.

테스트 코드

	@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 findMember = memberRepository.findById(member.getId()).get();

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

수정일과 생성일 속성이 자동으로 생성되고 값이 정상적으로 들어갔다.


📌Data JPA 사용

주의사항❗

Data JPA 사용시 Application 클래스에 @EnableJpaAuditing을 꼭 써줘야 작동한다.

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {

    @CreatedDate
    @Column(updatable = false) // 생성일은 수정 못하게 하기
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
}
  • @CreatedDate@PrePersist 밑에 구현한 기능을 자동으로 지원해준다.
  • @LastModifiedDate@PreUpdate 밑에 구현한 기능을 자동으로 지원해준다.

✅생성자와 수정자 추가

	@CreatedBy
    @Column(updatable = false) // 생성자는 수정 못하게 하기
    private String createdBy;

    @LastModifiedBy
    private String lastModifiedBy;

해당 코드를 BaseEntity 클래스에 추가하면 된다.

✅생성자와 수정자를 아는 방법

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

auditorProvider 메서드를 구현하여 그 안에서 세션이나 쿠키(jwt를 사용하면 토큰 정보)를 사용하여 값을 반환하면 된다.


📌실무팁

보통 생성일, 수정일은 모든 테이블에서 사용하지만 생성자, 수정자는 사용하지 않을 경우가 많다. 그렇다면 어떻게 해야할까?

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
    @CreatedDate
    @Column(updatable = false) // 생성일은 수정 못하게 하기
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
}

BaseTimeEntity 클래스에 생성일, 수정일을 따로 만들어주고

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity extends BaseTimeEntity{
    @CreatedBy
    @Column(updatable = false) // 생성자는 수정 못하게 하기
    private String createdBy;

    @LastModifiedBy
    private String lastModifiedBy;
}

BaseEntity에 생성자, 수정자를 만들어주고 BaseTimeEntity를 상속해준다.

이렇게 하면 생성일, 수정일만 필요한 엔티티는 BaseTimeEntity를 상속하면 되고 모두 필요한 엔티티는 BaseEntity를 상속하면 된다.

profile
으쌰 으쌰

0개의 댓글

관련 채용 정보