이번 포스팅에서는 JPA Auditing이라는 것을 이용하여 생성시간, 수정시간 생성을 자동화 하는 방법에 대해 알아본다.
DB에 정보를 삽입할 때 우리는 보통 생성시간과 수정시간을 함께 삽입한다.
MyBatis를 사용하는 경우에는 SYSDATE를 이용하여 쿼리에서 시간을 생성하거나 아래와 같은 코드를 사용하여 생성시간 또는 수정시간을 만들어서 삽입한다.
public void savePosts() {
...
posts.setCreateDate(new LocalDate());
postsRepository.save(posts);
}
SYSDATE를 사용하던 자바코드로 시간을 생성하던 코드중복이 발생하게 되고 규모가 커질수록 코드가 지저분해질 수 밖에 없다.
이러한 문제점을 JPA에서는 JPA Auditing을 사용하여 해결할 수 있다.
자바에서 시간이라고 하면 보통 Date
, Calendar
를 사용한다.
하지만 이 둘은 아래와 같은 문제점을 가지고 있다.
Java8부터는 이러한 문제점들을 해결한 LocalDate
, LocalDateTime
이라는 클래스가있다.
이제부터 시간관련 함수는 이 두 클래스를 사용하는 것을 권장한다.
LocalDate, LocalDateTime이 데이터베이스에 제대로 매핑되지 않는 이슈가 Hibernate 5.2.10 버전에서 해결되었는데 스프링부트 1.x버전을 사용한다면 별도의 설정을 통해 Hibernate5.2.10을 사용해야한다.(스프링 부트 2.x버전은 기본적으로 사용중)
domain패키지에 다음과 같이 BaseTimeEntity를 작성한다.
위에 사용된 어노테이션들을 살펴보자
생성시간과 수정시간을 자동화 하고싶은 Entity클래스에 BaseTimeEntity클래스를 상속시킵니다.
스프링 부트의 Main함수가 있는 클래스에 @EnableJpaAuditing
을 선언합니다.
JpaAuditing을 사용하기 위한 준비가 완료되었으니 H2 데이터베이스와 Junit을 사용하여 테스트를 해보도록 하겠습니다.
다음과 같이 테스크 코드를 작성하여 테스트를 진행합니다.
테스트 결과를 보면 createDate와 modifiedDate를 볼 수 있습니다.
이렇게 JpaAuditing 기능을 이용하면 코드의 중복을 방지하고 코드를 더욱 깨끗하게 작성할 수 있습니다.