본문 바로가기
FrameWork/Spring

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

by 태윤2 2021. 8. 20.

Java8부터 LocalDate와 LocalDateTime이 등장 기존의 날짜 타입인 Date의 문제점을 제대로 고친 타입이라 Java8일 경우 무조건 써야한다고 생각하면 됨

  • Date와 Calendar 클래스의 문제점
    • 불변(변경이 불가능한) 객체가 아님
      • 멀티스레드 환경에서 언제든 문제가 발생할 수 있음
    • Calendar는 월(Month) 값 설계가 잘못되었음
      • 10월을 나타내는 Calendar.OCTOBER의 숫자 값은 '9'
      • 당연히 10이라 생각했던 개발자들에게는 큰혼란이 있었음
    • 기존엔 JodaTime이라는 오픈소스를 사용해서 문제점들을 피했고, Java8에선 LocalDate를 통해 해결함

 

 

  • LocalDate와 LocalDateTime이 데이터베이스에 제대로 매핑되지 않는 이슈가 Hibernate 5.2.10 버전에서 해결되었음
  • 스프링 부트 1.x를 쓴다면 별도로 Hibernate 5.2.10이상 버전을 사용하도록 설정이 필요함 (2.x 버전은 기본버전이라 해당사항 X)
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    // BaseTimeEntity클래스는 모든 Entity의 상위 클래스가되어
    // Entity들의 createDate, modifiedDate를 자동으로 관리하는 역할 입니다.

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;
}
  1. @MappedSuperclass
    1. JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 필드들(createDate,modified)도 칼럼으로 인식하도록 합니다.
    2. @EntityListeners(AutidingEntityListener.class)
      1. BaseTimeEntity 클래스에 Auditing 기능을 포함시킵니다 (Auditing : Spring JPA Data에서 해당 데이터를 보고 있다가 생성 또는 수정이 발생하면 자동으로 값을 넣어주는 편리한 기능)
    3. @CreateDate
      1. Entity가 생성되어 저장될 때 시간이 자동 저장됨
    4. @LastModifiedDate
      1. 조회한 Entity의 값을 변경할 때 시간이 자동 저장됨

Posts 클래스에에 BaseTimeEntity 상속
Application 클래스에 활성화 어노테이션 추가

Test(JUnit5)

// PostsRepositoryTest
@Test
    public void BaseTimeEntity_register() {
        //given
        LocalDateTime now = LocalDateTime.of(2021, 8, 21, 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());

        
        //isBefore() : 인자보다 과거일 때 true가 리턴
        //isAfter() : 인자보다 미래일 때 true가 리턴
        //isEqual() : 인자와 같은 시간일 때 true가 리턴
        assertThat(posts.getCreatedDate()).isAfter(now);
        assertThat(posts.getModifiedDate()).isAfter(now);
    }

      

 

  • 참고자료

              스프링 부트와 AWS로 혼자 구현하는 웹 서비스

'FrameWork > Spring' 카테고리의 다른 글

게시글 등록 화면  (0) 2021.08.21
머스테치  (0) 2021.08.21
등록/수정/조회 API  (0) 2021.08.19
Spring Data JPA  (0) 2021.08.18
Spring Boot Test(JUnit 5)  (0) 2021.08.18