[E-2-5] JPA Auditing 으로 생성시간 및 수정시간 자동화하기
2020. 1. 31. 00:52ㆍProject E/Project E 파트2
반응형
단순한 시간을 등록 / 수정하는 코드가 여기저기 들어가면 귀찮고, 코드가 지저분해지기때문에 JPA Auditing로 해결한다.
자바8 이상에서는 기본날짜타입인 Date 문제점을 해결하고 LocalDate / LocalDateTime이 등장했다.
src/main/java
com.minokuma.book.springboot
domain
BaseTimeEntity.java
더보기
package com.minokuma.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
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
BaseTimeEntity클래스는 모든 엔티티의 상위 클래스가 되서
엔티티들의 createdDate, modifiedDate를 자동으로 관리한다.
JPA Auditing 어노테이션 활성화 : BaseTimeEntity
Application.java
더보기
package com.minokuma.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);
}
}
src/main/java
com.minokuma.book.springboot
domain/posts
Posts.java
더보기
package com.minokuma.book.springboot.domain.posts;
import com.minokuma.book.springboot.domain.BaseTimeEntity;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Getter
@NoArgsConstructor
@Entity
public class Posts extends BaseTimeEntity {
@Id
@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;
}
}
JPA Auditing 테스트 코드
src/test/java
com.minokuma.book.springbook
domain.posts
PostsRepositoryTest.java
더보기
package com.minokuma.book.springboot.domain.posts;
import org.junit.After;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.time.LocalDateTime;
import java.util.List;
import static org.assertj.core.api.Assertions.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository;
@After
public void cleanup(){
postsRepository.deleteAll();
}
@Test
public void retrieveBoardSave(){
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author("minokuma@gmail.com").build());
List<Posts> postsList = postsRepository.findAll();
Posts posts = postsList.get(0);
assertThat(posts.getTitle()).isEqualTo(title);
assertThat(posts.getContent()).isEqualTo(content);
}
@Test
public void registBaseTimeEntity(){
LocalDateTime now = LocalDateTime.of(2019,6,4,0,0,0);
postsRepository.save(Posts.builder()
.title("title")
.content("content")
.author("author")
.build());
List<Posts> postsList = postsRepository.findAll();
Posts posts = postsList.get(0);
System.out.println(">>>>>> createDate=" + posts.getCreatedDate() + ", modifiedDate=" + posts.getModifiedDate());
assertThat(posts.getCreatedDate()).isAfter(now);
assertThat(posts.getModifiedDate()).isAfter(now);
}
}
테스트 코드 실행결과
이후에 추가될 엔티티들은 BaseTimeEntity만 상속받으면 자동으로 해결된다.
반응형
'Project E > Project E 파트2' 카테고리의 다른 글
[E-2-4] 등록 / 수정 / 조회 API 생성 (0) | 2020.01.31 |
---|---|
[E-2-3] 스프링 부트에서 JPA로 데이터베이스 조작 (0) | 2020.01.30 |