Mary's log 2024. 10. 20. 16:32

 

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 함수의 좌측 ▷ 실행.

 

오류 없이 정상 수행.