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 버전을 사용하는 경우 별다른 설정이 없이 바로 적용가능
- 8버전 이전에는 Date와 Calendar 클래스의 문제점
BaseTimeEntity
-
BaseTimeEntity 클래스
- domain 패키지에 생성
- 모든 Entity의 상위 클래스로 사용하여 createDate, modifiedDate를 자동으로 관리
-
@MappedSuperclass
- JPA Entity 클래스들이 BaseTimeEntity를 사용할 경우 필드들(createDate, modifiedDate)도 컬럼으로 인식하도록 한다.
-
@EntityListeners(AuditingEntityListener.class)
- BaseTimeEntity 클래스에 Auditing 기능을 포함
-
@CreatedDate
- Entity가 생성되어 저장될 때 자동 저장
-
@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 |