Project/토이 프로젝트

[Refactoring] Spring Data JPA Auditing - 시간 한 곳에서 관리

Lea Hwang 2022. 12. 11. 19:58

리팩토링 하게 된 이유

Cinemagram 토이 프로젝트를 하면서 엔티티마다 데이터의 생성시간, 수정시간이 칼럼으로 존재합니다. 

private LocalDateTime createDate;

@PrePersist // DB에 insert되기 전 실행
public void createDate() {
    this.createDate = LocalDateTime.now();
}

 

지금은 User, Follow 두 엔티티만 있지만 앞으로 더 늘어날 텐데 그럼 불필요하게 코드 중복이 발생합니다.

 

 


Spring Data JPA의 Auditing 사용하기 

1. domain 패키지 안에 BaseTimeEntity abtract calss 생성

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;

}

모든 Entity들의 생성, 수정시간을 자동으로 관리하게 됩니다.

 

@MappedSuperclass JPA Entity 클래스들이 해당 BaseTimeEntity를 상속할 경우 createdDate,
modifiedDate를 칼럼으로 인식합니다.
@EntityListeners(AuditingEntityListener.class) BaseTimeEntity클래스에 Auditing기능을 포함시킵니다.
@CreatedDate BaseTimeEntity를 상속한 Entity가 생성되어 저장될 때 시간이 자동 저장 됩니다.
@LastModifiedDate BaseTimeEntity를 상속한 Entity를 조회해 값을 변경 시 시간이 자동 저장됩니다.

 

 

2. Entity가 BaseTimeEntity를 상속받도록 코드를 추가하고 이전 시간관련 칼럼들은 삭제합니다.

public class User extends BaseTimeEntity {
	...
}

 

 

3. Application클래스에 JPA Auditing 어노테이션을 활성화 시키는 어노테이션을 추가합니다.

@EnableJpaAuditing
@SpringBootApplication
public class Application {

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

}

 

 

 

확인

자! 그럼 application.yml ddl-auto: create로 바꾼 후 회원 가입해서 DB에 과연 저장이 잘 되는지 Test 해보겠습니다.