[스프링부트와 AWS로 혼자 구현하는 웹 서비스] JPA Auditing으로 생성시간/수정시간 자동화하기

세이라·2023년 7월 22일
0

스터디를 통해 스프링부트와 AWS로 혼자 구현하는 웹 서비스(저자 이동욱) 서적을 공부하는 중입니다.

공부/실습한 내용을 정리한 포스팅입니다.
책에 모르는 부분이 있으면 구글링하거나 챗gpt에 물어봐서 보충하였습니다.
(아직 초보라 모르는 부분이 많아 이것저것 다 적었습니다.)

참고한 사이트 출처는 포스팅 맨 하단에 적었습니다.


차후 유지보수를 위해 Entity에 해당 데이터의 생성시간과 수정시간을 포함.
JPA Auditing을 통해서 매번 DB 삽입/갱신 전에 넣는 날짜 데이터 등록/수정 코드를 굳이 쓰지 않아도 되게 만듦.

JPA Auditing

  • DB에선 생성시간, 수정시간이 굉장히 중요한데, JPA의 Audit(감시하다, 감사하다) 기능을 이용하여 시간에 대해 자동으로 값을 넣어줌.

LocalDate 사용

  • Java8부터 등장. LocalDate,LocalDateTime 등장.

Date / Calendar 문제점

Java8 이전에 쓰여짐.

  • 불변 객체가 아니여서 멀티스레드 환경에서 문제 발생 가능.
  • Calendar의 경우, 월 설계가 잘못됨. : 1월이 0부터 시작

BaseTimeEntity 클래스

domain 패키지에 생성 후 아래와 같이 코드 작성.
그리고 다른 Entity 클래스가 BaseTimeEntity 상속하도록 변경

package com.webservice.springboot.springboot_board.domain.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 abstract class BaseTimeEntity {
    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;
}
  • @MappedSuperclass : JPA Entity 클래스들이 BaseTimeEntity 상속 시 필드들을 모두 칼럼으로 인식하도록 함.
  • @EntityListeners(AuditingEntityListener.class) : BaseTimeEntity 클래스에 Auditing 기능 포함.
  • @CreatedDate : Entity 생성되어 저장 시 시간 자동 저장.
  • @LastedModifiedDate : 조회 Entity 값 변경 시 시간 자동 저장.

@EntityListeners : JPA Entity에서 이벤트가 발생할 때마다 특정 로직을 실행시킬 수 있음. Entity의 변화를 감지하고 데이블의 데이터를 조작하는 일을 함.

Jpa Auditing annotation 활성화

  • SpringBoot 프로그램 시작점인 Application 클래스에 @EnableJpaAuditing 추가.

JPA Auditing 테스트 코드 작성

PostsRepositoryTest.java에 추가

    @Test
    public void BaseTimeEntity_등록(){
        //given
        LocalDateTime now = LocalDateTime.of(2023,7,22,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);
    }

출처

JPA Auditing 기능이란?
Spring boot :: JPA @EntityListeners 정리
[Spring JPA] Entity Listener

0개의 댓글