Java의 ORM 기술인 JPA에서는 Auditing을 제공한다. 이를 통해서 DB 테이블에 자동으로 값을 넣어주거나 수정해줄 수 있다.
package com.kym8821.kotlinspringboot.kotlinspringboot.domain
import jakarta.persistence.*
import org.springframework.data.annotation.CreatedDate
import org.springframework.data.annotation.LastModifiedDate
import java.time.LocalDateTime
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import java.io.Serializable
// kotlin에서는 클래스가 하나의 객체 취급을 받기에 값으로 클래스를 넘겨줄 수 있음
@EntityListeners(value = [AuditingEntityListener::class])
@MappedSuperclass
abstract class AuditingEntity(
) : AuditingEntityId() {
// 추후 초기화되는 값이니 lateinit을 해줌
@CreatedDate
@Column(name = "created_at", nullable = false, updatable = false)
lateinit var createdAt: LocalDateTime
protected set // protected로 상속받는 놈만 setter 쓸 수 있도록 해줌
@LastModifiedDate
@Column(name = "updated_at")
lateinit var updatedAt: LocalDateTime
protected set
}
@EntityListeners(value = [AuditingEntityListener::class])
@MappedSuperclass
abstract class AuditingEntityId : Serializable {
// 원시 타입에는 lateinit를 사용할 수 없는듯 함.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null
protected set
}
이 코드에서 어노테이션은 각각 다음을 뜻한다.
@어노테이션 | 설명 |
---|---|
@MappedSuperClass |
JPA Entity 클래스가 해당 어노테이션이 있는 추상 클래스 상속 시 그 추상 클래스의 필드를 칼럼으로 인식 |
@EventListener(value = [AuditingEntityListener::class]) |
해당 클래스에 Auditing 기능을 포함함 |
@CreatedDate |
Entity가 생성된 시간이 자동으로 저장됨 |
@LastModifiedDate |
Entity의 값이 변경된 시간이 자동으로 저장됨 |