JPA Auditing이란?

JPA Auditing이란?



JPA를 사용하여 Domain을 RDBS의 테이블에 매핑할 때 공통적으로 Domain을 가진 필드와 열이 존재합니다.

대표적으로는 이하가 됩니다.
  • CreateDate
  • UpdateDate
  • 식별자

  • 같은 필드와 열이 있습니다.
    도메인마다 존재한다는 것은 코드가 중복되는 것입니다.
    데이터베이스를 누가 언제 작성했는지 등 기록을 남기는 편이 유지보수에도 도움이 되기 때문입니다.
    따라서 생성 날짜, 수정 날짜와 같은 열은 정말 중요한 데이터입니다.

    그래서 JPA는 Audit라는 기능을 제공합니다. Audit는 감시한다는 의미에서 Spring Data JPA에서 시간에 대해 자동으로 값을 넣어주는 기능입니다. 도메인을 지속성 컨텍스트에 저장하거나 쿼리 등을 수행한 후 업데이트를 수행하는 경우 매번 시간 데이터를 입력해야 합니다. 넣어줍니다.

    연습



    1. domain package 내에 BaseTimeEntity 클래스를 만듭니다.


    2. BaseTimeEntity를 다음과 같이 만듭니다.
    
    package jojoidu.boot.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
    @EntityListeners(AuditingEntityListener.class)
    public abstract class BaseTimeEntity {
    
        @CreatedDate
        private LocalDateTime createdDate;
    
        @LastModifiedDate
        private LocalDateTime modifiedDate;
    }
    
    

    BaseTimeEntity 클래스는 모든 Entity 클래스의 부모 클래스가 되어 Entity 클래스의 createdDate, modifiedDate 를 자동으로 관리하는 역할을 합니다.

  • @MappedSuperclass
  • JPA Entity 클래스가 BaseTimeEntity를 상속하는 경우 필드 (createdDate, modifiedDate)도 열로 인식됩니다.


  • @ EntityListeners (AuditingEntityListener.class)
  • BaseTimeEntity 클래스에 Auditing 기능을 부여합니다.


  • @CreatedDate
  • Entity가 생성되고 저장될 때 시간이 자동으로 저장됩니다.


  • @ LastModifiedDate
  • 조회한 Entity 값을 변경하면 시간이 자동으로 저장됩니다.


  • 3. Entity 클래스에 BaseTimeEntity 클래스를 상속합니다.
    
    package jojoidu.boot.springboot.domain.posts;
    
    import jojoidu.boot.springboot.domain.BaseTimeEntity;
    import lombok.Builder;
    import lombok.Getter;
    import lombok.NoArgsConstructor;
    
    import javax.persistence.*;
    
    @Getter
    @NoArgsConstructor
    @Entity // テーブルとリンクされるクラスを示す
    public class Posts extends BaseTimeEntity {
    
        @Id // PKフィールドを示す
        @GeneratedValue(strategy = GenerationType.IDENTITY)
        private long id;
    
        @Column(length = 500, nullable = false)
        private String title;
    
        @Column(columnDefinition = "TEXT", nullable = false)
        private String content;
    
        private String author;
    
        @Builder
        public Posts(String title, String content, String author) {
            this.title = title;
            this.content = content;
            this.author = author;
        }
    
        public void update(String title, String content) {
            this.title = title;
            this.content = content;
        }
    }
    
    
    

    4. 마지막으로 JPA Auditing 어노테이션이 활성화되도록 main 클래스에 활성화 어노테이션을 추가합니다.
    
    package jojoidu.boot.springboot;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
    
    @EnableJpaAuditing
    @SpringBootApplication
    public class Application {
        public static void main(String[] args) {
            SpringApplication.run(Application.class, args);
        }
    }
    

    테스트



    테스트는 빠뜨릴 수 없기 때문에 테스트 메소드도 추가해 보았습니다.
    
    @Test
        public void saveBaseTimeEntity() {
            // given
            LocalDateTime now = LocalDateTime.of(2020, 8,12,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(">>>>>>>createdDate=" + posts.getCreatedDate() + ", modifiedDate=" + posts.getModifiedDate());
    
            assertThat(posts.getCreatedDate()).isAfter(now);
            assertThat(posts.getModifiedDate()).isAfter(now);
        }
    

    결과




    정상적으로 움직이는 것을 확인할 수 있었습니다.
    이런 즐거움이 너무 기뻐요.

    좋은 웹페이지 즐겨찾기