데이터의 기록을 남길 때 보통 공통적으로 가지고있는 컬럼이 있습니다. 바로 생성일자, 수정일자 등이 있습니다.
JPA에서는 Audit라는 기능을 제공하고있는데, 이것은 JPA에서 도메인을 영속성 컨텍스트에 저장하거나 혹은 업데이트를 하는 경우에 자동으로 값을 넣어주는 편리한 기능입니다.
1. @EnableJpaAuditing 추가
@EnableJpaAuditing 어토네이션을 추가합니다.
@SpringBootApplication
@EnableJpaAuditing
public class WhiteApplication {
public static void main(String[] args) {
SpringApplication.run(WhiteApplication.class, args);
}
}
2. AuditingEntity 클래스 생성
@MappedSuperclass를 이용하여 부모클래스를 만들어 줍니다. 생성일자, 수정일자는 대부분의 엔티티에 들어가기 때문입니다.
그리고 @EntityListeners(AuditingEntityListener.class) 어노테이션을 선언합니다.
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity {
@CreatedDate
private LocalDateTime createdTime;
@LastModifiedDate
private LocalDateTime modifiedDate;
}
@CreatedDate
데이터 생성 날짜를 자동 저장합니다.
@LastModifiedFieldDate
데이터 수정 날짜를 자동 저장합니다.
@CreatedBy
데이터 생성자를 자동 저장합니다.
@LastModifiedBy
데이터 수정자를 자동 저장합니다.
3. Entity에 적용
클래스를 하나 생성합니다. 이 클래스는 @MappedSuperclass를 이용하여 만든 클래스를 상속한 클래스입니다.
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Category extends BaseTimeEntity{
@Id
@Column(name = "category_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private int orderNum;
데이터 저장
@Override
@Transactional
public void saveCategory(Category category) {
categoryRepository.save(category);
}
데이터 수정
데이터를 조회 후 다시 @Transactional에 의해 엔티티를 업데이트 합니다.
@Override
@Transactional
public void updateCategory(Long categoryId, CategoryDto categoryDto) {
Category findCategory = categoryRepository.findById(categoryId).orElse(null);
if (findCategory == null) throw new NullPointerException("유효한 접근이 아니거나 해당 게시물이 삭제되었습니다.");
else{
findCategory.updateCategory(categoryDto.getName(), categoryDto.getOrderNum());
}
}
4. 테스트
데이터 저장시
created_time과 modified_date가 같은 걸 볼 수 있습니다.
데이터 수정시
created_time과 modified_date가 달라진 것을 볼 수 있습니다.
'JPA' 카테고리의 다른 글
[JPA] 영속성 컨텍스트 (0) | 2021.11.17 |
---|---|
[Spring Boot] JPA application.yml (properties)기능 (0) | 2021.11.08 |
[JPA] 쿼리 작성 법 (0) | 2021.01.21 |
[JPA] 페치 조인(fetch join)의 한계 (0) | 2021.01.21 |
[JPA] 페치조인(fetch join)이란? (0) | 2021.01.21 |