JPA Auditing으로 생성시간 / 수정시간 자동화하기

  • Entity에는 해당 데이터의 생성시간과 수정시간을 포함한다.
  • 공통으로 사용하게 되는 필드를 JPA Auditing을 통해 재사용하도록 한다.

LocalDate

  • Java8부터 LocalDate, LocalDateTime를 사용한다.
    • 8버전 이전에는 Date와 Calendar 클래스의 문제점
      • 불변 객체가 아니므로 멀티스레드 환경에서 문제가 발생할 가능성이 높다.
      • Calendar는 월(Month) 값 설계가 잘못되었다.
        • 10월을 나타내는 Calendar.OCTOBER는 숫자 값이 '9'이다.
    • Hibernate 5.2.10버전 이후, 데이터베이스에 제대로 매핑되지 않는 이슈 해결
    • SpringBoot 1.x 버전을 사용하는 경우 Hibernate 5.2.10 버전 이상을 사용하도록 설정 필요
    • SpringBoot 2.x 버전을 사용하는 경우 별다른 설정이 없이 바로 적용가능

BaseTimeEntity

  • BaseTimeEntity 클래스

    • domain 패키지에 생성
    • 모든 Entity의 상위 클래스로 사용하여 createDate, modifiedDate를 자동으로 관리
    1. @MappedSuperclass

      • JPA Entity 클래스들이 BaseTimeEntity를 사용할 경우 필드들(createDate, modifiedDate)도 컬럼으로 인식하도록 한다.
    2. @EntityListeners(AuditingEntityListener.class)

      • BaseTimeEntity 클래스에 Auditing 기능을 포함
    3. @CreatedDate

      • Entity가 생성되어 저장될 때 자동 저장
    4. @LastModifiedDate

      • 조회한 Entity의 값을 변경할 때 시간이 자동 저장
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;
}
  • domain 클래스에서 BaseTimeEntity 상속
@Getter
@NoArgsConstructor
@Entity
public class Posts extends BaseTimeEntity {
    ...
}
  • JPA Auditing 어노테이션들을 활성화 할 수 있도록 Application 클래스에 활성화 어노테이션 추가

@EnableJpaAuditing // JPA Auditing 활성화  
@SpringBootApplication  
public class Application {  
    public static void main(String\[\] args) {  
        SpringApplication.run(Application.class, args);  
    }  
}

JPA Auditing 테스트 코드

  • PostsRepositoryTest 클래스
    • LocalDateTime.of()로 날짜 설정
@RunWith(SpringRunner.class)
@SpringBootTest
public class PostsRepositoryTest {

    @Autowired
    PostsRepository postsRepository;

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

    // getBoard

    @Test
    public void regBaseTimeEntityTest() {
        // given
        LocalDateTime now = LocalDateTime.of(2020,5,28,19,28,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);
        assertThat(posts.getModifiedDate()).isAfter(now);
    }
}
  • createDate, modifiedDate 확인으로 정상적으로 JPA Auditing이 적용되었음을 알 수 있다.
    • 앞으로 생성되는 Entity들은 BaseTimeEntity를 상속받아 등록일/수정일을 자동화할 수 있다.

'Spring > SpringBoot' 카테고리의 다른 글

[SpringBoot] 게시글 등록  (0) 2020.05.29
[SpringBoot] Mustache  (0) 2020.05.28
[SpringBoot] Posts API 만들기  (2) 2020.05.28
[SpringBoot] 설정파일 yaml로 변경하기  (0) 2020.05.28
[SpringBoot] Spring Data JPA 설정  (0) 2020.05.28

+ Recent posts