[Spring Boot] JPA Auditing 생성시간, 수정시간
2020. 9. 16. 18:05ㆍSpring/Spring Boot
1. JPA Auditing
1) JPA Auditing
보통 Entity에는 데이터의 생성시간과 수정시간을 포함한다. 그렇기 때문에 매번 DB에 날짜 데이터를 등록하는 코드가 들어간다. 하지만 JPA Auditin을 이용하게 되면 조금 더 간편하게 날짜 데이터를 다룰 수 있다.
2) LocalDate
Java 8 부터는 LocalDate와 LocalDateTime이 등장하면서 기본 날짜 타입인 Date의 문제점이 해결되었다. 또한 LocalDate와 LocalDateTime이 데이터베이스에 제대로 매핑되지 않는 이슈도 Hibernate 5.2.10 버전에서 해결이 되었다.
3) Enitity
domain 패키지 하위에 BaseTimeEntity 클래스를 생성한다. BaseTimeEntity는 모든 Entity의 상위 클래스가 되어 Entity들의 생성시간과 수정시간을 자동으로 관리하는 역할을 수행한다.
어노테이션 및 코드 | 설명 |
@MappedSuperclass | JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 필드들도 칼럼으로 인식하도록 한다. |
@EntityListeners(AuditingEntityListener.class) | BaseTimeEntity 클래스에 Auditing 기능을 포함시킨다. |
@CreatedDate | Entity가 생성되어 저장될 때 시간이 자동 저장된다. |
@LastModifiedDate | 조회한 Entity의 값을 변경할 때 시간이 자동 저장된다. |
package com.springbook.biz.domain;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
4) 적용
생성한 BaseTimeEntity클래스를 Posts Entity 클래스가 상속받도록 변경하고, JPA Auditing 어노테이션들을 모두 활성화할 수 있도록 Application 메인 클래스에 활성화 어노테이션을 추가한다.
public class Posts extends BaseTimeEntity {
@EnableJpaAuditing
@SpringBootApplication
public class Application {
5) 테스트 코드
PostRepositoryTest 클래스에 테스트 메서드를 작성하여 확인한다.
package com.springbook.biz.domain.posts;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.time.LocalDateTime;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {
... // 추가될 내용
@Test
public void BaseTimeEntitySave() {
// given
LocalDateTime now = LocalDateTime.of(2020,9,16,0,0,0);
postsRepository.save(Posts.builder()
.title("title")
.content("content")
.author("author")
.build());
// when
List<Posts> postsList = postsRepository.findAll();
// then
Posts posts = postsList.get(0);
System.out.println(">>>>>>>>>>>>>>>>>> createDate=" + posts.getCreatedDate() + ", modifiedDate=" + posts.getModifiedDate());
assertThat(posts.getCreatedDate()).isAfter(now);
assertThat(posts.getModifiedDate()).isAfter(now);
}
}
[참고] 스프링 부트와 AWS로 혼자 구현하는 웹 서비스
728x90
'Spring > Spring Boot' 카테고리의 다른 글
[Spring Boot] 게시물 화면 구성 (2) (0) | 2020.09.17 |
---|---|
[Spring Boot] 게시물 화면 구성 (1) (0) | 2020.09.16 |
[Spring Boot] 간단한 API 제작 (0) | 2020.09.16 |
[Spring Boot] 스프링 부트 JPA (0) | 2020.09.16 |