Java8부터 LocalDate와 LocalDateTime이 등장 기존의 날짜 타입인 Date의 문제점을 제대로 고친 타입이라 Java8일 경우 무조건 써야한다고 생각하면 됨
- Date와 Calendar 클래스의 문제점
- 불변(변경이 불가능한) 객체가 아님
- 멀티스레드 환경에서 언제든 문제가 발생할 수 있음
- Calendar는 월(Month) 값 설계가 잘못되었음
- 10월을 나타내는 Calendar.OCTOBER의 숫자 값은 '9'
- 당연히 10이라 생각했던 개발자들에게는 큰혼란이 있었음
- 기존엔 JodaTime이라는 오픈소스를 사용해서 문제점들을 피했고, Java8에선 LocalDate를 통해 해결함
- 불변(변경이 불가능한) 객체가 아님
- LocalDate와 LocalDateTime이 데이터베이스에 제대로 매핑되지 않는 이슈가 Hibernate 5.2.10 버전에서 해결되었음
- 스프링 부트 1.x를 쓴다면 별도로 Hibernate 5.2.10이상 버전을 사용하도록 설정이 필요함 (2.x 버전은 기본버전이라 해당사항 X)
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
// BaseTimeEntity클래스는 모든 Entity의 상위 클래스가되어
// Entity들의 createDate, modifiedDate를 자동으로 관리하는 역할 입니다.
@CreatedDate
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
- @MappedSuperclass
- JPA Entity 클래스들이 BaseTimeEntity를 상속할 경우 필드들(createDate,modified)도 칼럼으로 인식하도록 합니다.
- @EntityListeners(AutidingEntityListener.class)
- BaseTimeEntity 클래스에 Auditing 기능을 포함시킵니다 (Auditing : Spring JPA Data에서 해당 데이터를 보고 있다가 생성 또는 수정이 발생하면 자동으로 값을 넣어주는 편리한 기능)
- @CreateDate
- Entity가 생성되어 저장될 때 시간이 자동 저장됨
- @LastModifiedDate
- 조회한 Entity의 값을 변경할 때 시간이 자동 저장됨
Test(JUnit5)
// PostsRepositoryTest
@Test
public void BaseTimeEntity_register() {
//given
LocalDateTime now = LocalDateTime.of(2021, 8, 21, 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());
//isBefore() : 인자보다 과거일 때 true가 리턴
//isAfter() : 인자보다 미래일 때 true가 리턴
//isEqual() : 인자와 같은 시간일 때 true가 리턴
assertThat(posts.getCreatedDate()).isAfter(now);
assertThat(posts.getModifiedDate()).isAfter(now);
}
- 참고자료
스프링 부트와 AWS로 혼자 구현하는 웹 서비스
'FrameWork > Spring' 카테고리의 다른 글
게시글 등록 화면 (0) | 2021.08.21 |
---|---|
머스테치 (0) | 2021.08.21 |
등록/수정/조회 API (0) | 2021.08.19 |
Spring Data JPA (0) | 2021.08.18 |
Spring Boot Test(JUnit 5) (0) | 2021.08.18 |