Java의 ORM 기술인 JPA에서는 Auditing을 제공한다. 이를 통해서 DB 테이블에 자동으로 값을 넣어주거나 수정해줄 수 있다.

Created at, Updated at 구현

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의 값이 변경된 시간이 자동으로 저장됨