본문 바로가기
스프링 부트와 AWS

03장. 스프링 부트에서 JPA로 데이터베이스 다뤄보자06

by danny-j 2022. 11. 14.

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


JPA Auditing을 사용하는 이유

  • 보통 Entity에는 해당 데이터의 생성시간과 수정시간을 포함
  • 데이터가 언제 생성/수정 되었는지 등은 차후 유지보수에 있어서 굉장히 중요한 정보이기 때문
  • 매번 DB에 삽입/갱신하기 전에 날짜 데이터를 등록/수정 하는 코드가 여기저기 들어가면 귀찮고 코드가 지저분해지기 때문에 JPA Auditing을 사용

 

LocalDate 사용

  • Java8 부터 LocalDate와 LocalDateTime이 등장
  • 스프링부트 1.x버전을 쓴다면 별도로 Hibernate 5.2.10버전 이상이 필요
  • 스프링부트 2.x버전을 사용하면 별다른 설정 없이 바로 적용됨

 

Domain 패키지에 BaseTimeEntity 클래스 생성

package com.danny.makewebalone.service.posts;

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 ModifiedData;
}

@MappedSuperclass

  • JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 필드들(createDate, modifiedDate)도 컬럼으로 인식하게 함

@EntityListeners(AuditingEntityListener.class)

  • BaseTimeEntity 클래스에 Auditing 기능을 포함시킴

@CreatedDate

  • Entity가 생성되어 저장될 때 시간이 자동 저장됨

@LastModifiedDate

  • 조회한 Entity의 값을 변경할 때 시간이 자동 저장됨

 

Posts클래스가 BaseTimeEntity를 상속받도록 변경

public class Posts extends BaseTimeEntity {
...
}

 

PostsRepositoryTest클래스에 JPA Auditing 테스트 코드 작성하기

@Test
    public void BaseTimeEntity_등록(){
        //given
        LocalDateTime now = LocalDateTime.of(2022,9,20,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()+", modifiedData="+posts.getModifiedData());

        assertThat(posts.getCreatedDate()).isAfter(now);
        assertThat(posts.getModifiedData().isAfter(now));
    }

 

Test 결과

Passed

댓글