JPA Auditing 생성시간/수정시간 자동화

iseon_u·2023년 3월 22일
0

Book

목록 보기
7/16
post-thumbnail

CH03 - JPA Auditing 생성시간/수정시간 자동화


  • 생성시간과 수정시간은 유지보수에 중요한 정보
  • DB 삽입, 갱신 전에 날짜 데이터 등록, 수정
  • 반복 코드를 제거하기 위해 JPA Auditing 사용

LocalDate 사용

  • Java8 일 경우 필수로 사용
🗯️ Date, Calendar 클래스의 문제점 1. 불변 객체가 아니다 2. Calendar는 월 (Month) 값 설계 문제

BaseTimeEntity 클래스

BaseTimeEntity.java

@Getter
@MappedSuperclass // 1
@EntityListeners(AuditingEntityListener.class) // 2
public abstract class BaseTimeEntity {

    @CreatedDate // 3
    private LocalDateTime createdDate;

    @LastModifiedDate // 4
    private LocalDateTime modifiedDate;

}
  • BaseTimeEntity 클래스는 모든 Entity 의 상위 클래스로 사용
  • Entity 들의 createdDate, modifiedDate 를 자동 관리 역할
  1. @MappedSuperclass
    • JPA Entity 클래스들이 BaseTimeEntity 을 상속할 경우 필드들도 칼럼으로 인식
  2. @EntityListeners(AuditingEntityListener.class)
    • BaseTimeEntity 클래스에 Auditing 기능을 포함
  3. @CreatedDate
    • Entity 가 생성되어 저장될 때 시간이 자동 저장
  4. @LastModifiedDate
    • 조회한 Entity 의 값을 변경할 때 시간이 자동 저장
  • Entity 클래스인 Posts 클래스가 BaseTimeEntity 를 상속 받도록 변경
  • JPA Auditing 어노테이션 활성화를 위해 Application 클래스에 활성화 어노테이션 추가
    • @EnableJpaAuditing

JPA Auditing 테스트 코드

@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {

    @Autowired
    PostsRepository postsRepository;

    @After
    public void cleanup() {
        postsRepository.deleteAll();
    }

    @Test
    public void BaseTimeEntity_등록() {

        //given
        LocalDateTime now = LocalDateTime.of(2019, 6, 4, 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(">>>>> createDate="+posts.getCreatedDate()+", modifiedDate="+posts.getModifiedDate());

        assertThat(posts.getCreatedDate()).isAfter(now);
        Assertions.assertThat(posts.getModifiedDate()).isAfter(now);
    }

}
  • 등록일/수정일은 BaseTimeEntity 만 상속 받으면 해결
profile
🧑🏻‍💻 Hello World!

0개의 댓글