본문 바로가기

JPA

[JPA] Auditing

데이터의 기록을 남길 때 보통 공통적으로 가지고있는 컬럼이 있습니다. 바로 생성일자, 수정일자 등이 있습니다.

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