JPA Auditing이란?
12327 단어 SpringBootAuditing자바jpa
JPA Auditing이란?
JPA를 사용하여 Domain을 RDBS의 테이블에 매핑할 때 공통적으로 Domain을 가진 필드와 열이 존재합니다.
대표적으로는 이하가 됩니다.
같은 필드와 열이 있습니다.
도메인마다 존재한다는 것은 코드가 중복되는 것입니다.
데이터베이스를 누가 언제 작성했는지 등 기록을 남기는 편이 유지보수에도 도움이 되기 때문입니다.
따라서 생성 날짜, 수정 날짜와 같은 열은 정말 중요한 데이터입니다.
그래서 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 를 자동으로 관리하는 역할을 합니다.
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;
}
@MappedSuperclass
@ EntityListeners (AuditingEntityListener.class)
@CreatedDate
@ LastModifiedDate
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);
}
결과
정상적으로 움직이는 것을 확인할 수 있었습니다.
이런 즐거움이 너무 기뻐요.
Reference
이 문제에 관하여(JPA Auditing이란?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/Anveloper/items/c66373bdb8ab002974e6
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
@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);
}
Reference
이 문제에 관하여(JPA Auditing이란?), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/Anveloper/items/c66373bdb8ab002974e6텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)