보통 entity에는 언제 만들어졌는지, 언제 수정됐는지 등 유지보수를 위해 데이터의 생성/수정시간을 포함한다.
DB에 삽입 전, 갱신 전 날짜 데이터를 등록/수정하는 코드가 여기저기 들어가게 되는 단순하고 반복적인 코드를 매번 작성하는게 번거롭고 코드가 지저분해진다.
이를 해결하기 위한 것이 JPA Auditing이다.
시간을 구하는데 Date, Calendar, LocalDate 등 여러가지가 있다.
이슈
- Date와 Calendar는 몇 가지 문제가 있었는데, Java 8에서는 이를 개선하며 LocalDate가 등장했다. ( yeonyeon.tistory.com/24?category=916856 참고)
- LocalDate와 LocalDateTime이 db에 제대로 매핑되지 않는 이슈가 있었는데 이는 Hibernate 5.2.10 버전에서 해결했다.
Spring boot 1.x를 쓴다면 별도로 설정을 하고, 2.x 라면 상관없다.
예제
com.spaws.book.springboot.domain패키지에 BaseTimeEntity.java 생성
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
@MappedSuperclass
- JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 필드들도 컬럼으로 인식하도록 함
@EntityListeners(AuditingEntityListener.class)
- BaseTimeEntity 클래스에 Auditing 기능 포함
@CreatedDate
- Entity가 생성되어 저장 시간 자동 저장
@LastModifiedDate
- 조회한 Entity 값 변경 시 시간 자동 저장
domain.posts 안의 Posts를 BaseTimeEntity 상속시키게 한다.
public class Posts extends BaseTimeEntity{ ... }
Application.java에 어노테이션을 하나 추가해준다.
@EnableJpaAuditing // JPA Auditing어노테이션들 모두 활성화할 수 있게 함
@SpringBootApplication
public class Application { ... }
테스트 코드
기존의 PostsRepositoryTest.java에 메소드를 하나 추가했다.
@Test
public void BaseTimeEntity_등록() {
//given
LocalDateTime now = LocalDateTime.of(2019, 6,4,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);
}
앞으로 추가될 엔티티들은 BaseTimeEntity만 상속받으면 등록일/수정일로 고민할 필요가 없게 된다.
해당 게시글은 [ 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 / 이동욱 ] 책을 따라한 것을 정리하기 위한 게시글입니다. 요약, 생략한 부분이 많으니 보다 자세한 설명은 책 구매를 권장합니다.
'Clone Coding > 스프링 부트와 AWS' 카테고리의 다른 글
[Mustache] 게시글 등록 화면 만들기 (0) | 2021.01.19 |
---|---|
[Mustache] 화면 구성 (0) | 2021.01.18 |
[Spring] 등록 API 만들기 (+h2 웹 콘솔 이용하기) (0) | 2021.01.15 |
[Spring] JPA로 database 다루기 (0) | 2021.01.11 |
[Spring] 테스트 코드 작성하기 (0) | 2021.01.08 |