JPA Auditing으로 생성시간/수정시간 자동화하기

신광진·2021년 6월 6일
0
post-thumbnail

OVERVIEW

이번 포스팅에서는 JPA Auditing이라는 것을 이용하여 생성시간, 수정시간 생성을 자동화 하는 방법에 대해 알아본다.

기존 방법

DB에 정보를 삽입할 때 우리는 보통 생성시간과 수정시간을 함께 삽입한다.
MyBatis를 사용하는 경우에는 SYSDATE를 이용하여 쿼리에서 시간을 생성하거나 아래와 같은 코드를 사용하여 생성시간 또는 수정시간을 만들어서 삽입한다.

public void savePosts() {
	...
    posts.setCreateDate(new LocalDate());
    postsRepository.save(posts);
}

SYSDATE를 사용하던 자바코드로 시간을 생성하던 코드중복이 발생하게 되고 규모가 커질수록 코드가 지저분해질 수 밖에 없다.
이러한 문제점을 JPA에서는 JPA Auditing을 사용하여 해결할 수 있다.

LocalDate, LocalDateTime

자바에서 시간이라고 하면 보통 Date, Calendar를 사용한다.
하지만 이 둘은 아래와 같은 문제점을 가지고 있다.

  • Immutable하지 않다.
    • 불변 객체가 아니기 때문에 멀티스레딩 환경에서 문제가 발생할 수 있다.
  • Calendar의 월(Month)값 설계가 잘못되었다.
    • Calendar를 사용해본 사람은 알겠지만 값이 0부터 시작한다.
      즉, 1월은 0이다.
      이러한 문제점은 개발자에게 혼란을 줄 수 있다.

Java8부터는 이러한 문제점들을 해결한 LocalDate, LocalDateTime이라는 클래스가있다.
이제부터 시간관련 함수는 이 두 클래스를 사용하는 것을 권장한다.

LocalDate, LocalDateTime이 데이터베이스에 제대로 매핑되지 않는 이슈가 Hibernate 5.2.10 버전에서 해결되었는데 스프링부트 1.x버전을 사용한다면 별도의 설정을 통해 Hibernate5.2.10을 사용해야한다.(스프링 부트 2.x버전은 기본적으로 사용중)

생성시간과 수정시간 자동화하기

1. BaseTimeEntity 클래스 작성

domain패키지에 다음과 같이 BaseTimeEntity를 작성한다.
위에 사용된 어노테이션들을 살펴보자

  • @MappedSuperClass
    • JPA Entity 클래스들이 해당 어노테이션이 붙은 클래스를 상속한 경우 해당 클래스의 필드를 컬럼으로 인식하게 한다.
  • @EntityListeners(AuditingEntityListener.class)
    • 해당 어노테이션이 붙은 클래스에 Auditing 기능을 포함시킨다.
  • @CreatedDate
    • Entity가 생성되어 저장될 때 시간이 자동 저장된다.
  • @LastModifiedDate
    • 조회한 Entity의 값을 변경할 때 시간이 자동 저장된다.

2. 상속하기

생성시간과 수정시간을 자동화 하고싶은 Entity클래스에 BaseTimeEntity클래스를 상속시킵니다.

3. JPA Auditing 기능 활성화

스프링 부트의 Main함수가 있는 클래스에 @EnableJpaAuditing을 선언합니다.

4. Test

JpaAuditing을 사용하기 위한 준비가 완료되었으니 H2 데이터베이스와 Junit을 사용하여 테스트를 해보도록 하겠습니다.

다음과 같이 테스크 코드를 작성하여 테스트를 진행합니다.

테스트 결과를 보면 createDate와 modifiedDate를 볼 수 있습니다.
이렇게 JpaAuditing 기능을 이용하면 코드의 중복을 방지하고 코드를 더욱 깨끗하게 작성할 수 있습니다.

profile
이거 왜안되냐

0개의 댓글