Spring/Spring Boot

[Spring Boot] JPA Auditing 생성시간, 수정시간

ozofweird 2020. 9. 16. 18:05

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