Back-End/스프링부트와 AWS로 구현하는 웹서비스

[스프링][Spring] - 6. JPA Auditing으로 생성시간/수정시간 자동화하기

얄루몬 2022. 2. 2. 23:57

📖본 포스팅은 '스프링부트와 aws로 혼자 구현하는 웹서비스 - 이동욱 저자'를 보고 포스팅 되었습니다. 


1. JPA Auditing

보통 엔티티(Entity)에는 데이터의 생성시간, 수정시간이 포함된다. 보통 언제 만들어졌는지 언제 수정되었는지 등은 차후 유지보수에 매우 중요한 정보이기 때문입니다. 이를 매번 DB에 삽입하기 전, 갱신하기 전에 날짜 데이터를 등록하고 수정하는 코드를 여기 저기 넣는 일은 매우 귀찮고 코드가 지저분해지게 됩니다. 그래서 이를 해결하고자 JPA Auditing이 나오게 되었고 우리는 JPA Auditing을 사용해 이를 해결해보도록 하겠습니다.

 

 

 

2. LocalDate 사용

  • LocalDate / LocalDateTime 날짜 타입을 사용해서 진행하도록 하겠습니다.
  • Java 8이 나오고 기본 날짜 타입인 Date의 문제점을 제대로 고친 타입이라 Java8의 경우엔 LocalDate와 LocalDateTime을 사용해야 합니다.

[BaseTimeEntity - 날짜 데이터를 등록, 수정하는 Entity class]

그냥 클래스 아니고 추상화 클래스!!

 

  • BaseTimeEntity를 위와 같은 패키지에 넣어주세요. (그냥 클래스로 만드시면 안 되고 추상화 클래스로 만들어주셔야 합니다. 캡쳐 시점에는 그냥 클래스로 만들어서 저런 모양이고 abstract로 만들어주셔야 합니다)

 

[Entity들의 생성, 수정 시간을 관리하는 역할]

package com.yeomyaloo.book.springboot.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 //JPA Entity들이 BaseTimeEntity를 상속할 경우 필드들도 칼럼으로 인식하도록 한다.
@EntityListeners(AuditingEntityListener.class) //이 클래스에 Auditing 기능을 포함시킨다.
public abstract class BaseTimeEntity {
    
    @CreatedDate // Entity가 생성되어 저장될 때 시간이 자동으로 저장된다.
    private LocalDateTime createdDate;

    @LastModifiedDate //조회한 Entity 값이 변경될 때 시간이 자동으로 저장된다.
    private LocalDateTime modifiedDate;

}
  • 이를 추상클래스로 만든 이유는 모든 Entity 클래스의 상위 클래스로 만들어 하위 Entity 클래스들의 createdDate, modifiedDate를 자동으로 관리하기 위해서입니다!!.

 

[Posts 수정해주세요]

public class Posts extends BaseTimeEntity

 

[main class 수정해주세요]

package com.yeomyaloo.book.springboot;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing //JPA Auditing의 활성화를 위한 어노테이션
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class,args);
    }

}
  • JPA Auditing을 모두 활성화 시키기 위해서는 Main 클래스인 어플리케이션 클래스를 위와 같이 수정해주세요.

 

 

 

3. 테스트 코드

    @Test
    public void BaseTimeEntity_등록(){
        //given
        LocalDateTime now = LocalDateTime.of(2019,6,4,0,0,0);
        postsRepository.save(Posts.builder()
                .title("title")
                .author("author")
                .content("content")
                .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);
    }

}

  • 테스트는 PostsRepositoryTest.java에서 진행했습니다
  • 앞으로 추가될 Entity들은 BaseTimeEntity를 상속받으면 더이상 등록일과 수정일로 고민하지 않아도 된다.