09. JPA Auditing스프링부트와 AWS로 혼자 구현하는 웹서비스2024. 10. 20. 16:32
Table of Contents
db 데이터가 수정될 때마다
매번 모든 객체에 '수정일자일시' 필드를 따로 넣어주고 세팅하는 반복적인 일은, 매우 귀찮은 일.
(만약 domains 하위에 객체가 40개다. 40개 전부 각각 들어가서 세팅해줬는데, 수정일자 변수명을 수정된다고 한다.
으악. 그럼 40개 파일 다 들어가서 한땀한땀 수정한다면 매우 비효율적.)
모든 Entity의 상위 추상클래스로 만들어서 , 한땀한땀 넣지 않고 자동화하도록 수정.
src/main/java/com/jojoldu/springboot/domain - abstract class BaseTimeEntity.java 생성
package com.jojoldu.springboot.domain.posts;
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;
}
src/main/java/com/jojoldu/springboot/domain/posts - Posts.java 확장 extends 추가
package com.jojoldu.springboot.domain.posts;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import javax.persistence.*;
@Getter // lombok
@NoArgsConstructor
@Entity // for JPA
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을 활성화시키는 어노테이션을 Application.java에 추가
package com.jojoldu.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 하기 위한 test 소스 작성하러감.
src/test/java/com/jojoldu/springboot/domain/posts - PostsRepositoryTest.java - BaseTimeEntity 함수 추가
package com.jojoldu.springboot.domain.posts;
import org.junit.Test;
import org.junit.After;
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.AssertionsForClassTypes.assertThat;
@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {
@Autowired
PostsRepository postsRepository;
@After
public void cleanup(){
postsRepository.deleteAll();
}
@Test
public void readPosts(){
String title = "테스트 게시글";
String content = "테스트 본문";
postsRepository.save(Posts.builder()
.title(title)
.content(content)
.author("jojoldu@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 BaseTimeEntity() {
LocalDateTime now = LocalDateTime.of(2024,10,20,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);
}
}
@Test 어노테이션이 달린 BaseTimeEntity 함수의 좌측 ▷ 실행.
오류 없이 정상 수행.
'스프링부트와 AWS로 혼자 구현하는 웹서비스' 카테고리의 다른 글
11. CDN 추가, '게시글 등록' 기능 추가 (0) | 2024.10.20 |
---|---|
10. 템플릿 엔진 mustache 사용 (0) | 2024.10.20 |
08. CRUD API 만들기2 (0) | 2024.10.20 |
07. CRUD API 만들기 (0) | 2024.10.20 |
06. JPA, h2 디비 적용하기 (0) | 2024.10.19 |