실무에서 데이터의 생성 시간과 수정 시간이 모든 테이블에 필수적으로 존재해야 한다.
하지만 개발할때 무언가를 생성하거나 수정할때마다 이 컬럼들을 신경쓰는 것은 매우 귀찮은 일이다.
JPA Auditing을 사용하면 생성 시간과 수정 시간을 자동화 할 수 있다.
BaseTimeEntity 생성
package com.usedcar.admin.domain;
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;
}
- @MappedSuperclass: Entitiy들이 해당 클래스를 상속할 경우 정의된 필드도 컬럼으로 인식되도록 한다.
- @EntityListeners(AuditingEntityListener.class): BaseTimeEntity 클래스에 Auditing 기능을 포함시킨다.
- @CreatedDate: Enitity가 생성되어 저장될 때 시간이 자동 저장된다.
- @LastModifiedDate: 조회한 Entity의 값을 변경할 때 시간이 자동 저장된다.
Entity 클래스는 BaseTimeEntity를 상속받아야 한다.
@Getter
@NoArgsConstructor
@Entity
public class Car extends BaseTimeEntity {
...
}
메인 클래스에 JPA Auditing를 활성화 해주는 어노테이션을 추가한다.
@EnableJpaAuditing //JPA Auditing 활성화
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
테스트 코드로 확인
@Test
@Rollback(value = false)
public void 차량매입_불러오기() throws Exception {
// given
String carNumber = "04구4716";
String vin = "12345678";
Category category = Category.DOMESTIC;
String model = "더 뉴 K5";
String color = "검정";
String productionYear = "2018";
LocalDateTime purchaseDate = LocalDateTime.now();
carRepository.save(Car.builder()
.carNumber(carNumber)
.vin(vin)
.category(category)
.model(model)
.color(color)
.productionYear(productionYear)
.purchaseDate(purchaseDate)
.build());
// when
List<Car> carList = carRepository.findAll();
// then
Car car = carList.get(0);
assertThat(car.getCarNumber()).isEqualTo(carNumber);
assertThat(car.getVin()).isEqualTo(vin);
assertThat(car.getCategory()).isEqualTo(category);
assertThat(car.getModel()).isEqualTo(model);
assertThat(car.getColor()).isEqualTo(color);
assertThat(car.getProductionYear()).isEqualTo(productionYear);
assertThat(car.getPurchaseDate()).isNotNull();
assertThat(car.getCreatedDate()).isAfter(purchaseDate); //createdDate
assertThat(car.getModifiedDate()).isAfter(purchaseDate); //modifiedDate
}
결과
테이블 확인
참고
'JPA' 카테고리의 다른 글
양방향 관계 맵핑 (0) | 2021.05.20 |
---|---|
Id 필드에 @GeneratedValue(strategy = GenerationType (0) | 2021.05.12 |
H2 쿼리 문법을 MySQL 쿼리 문법으로 변경하여 로그 출력하기 (0) | 2021.05.12 |
쿼리 로그 세팅 (0) | 2021.04.28 |
ddl-auto 옵션 관련 주의할 점!!!!!!!!! (5) | 2021.04.28 |
댓글