Entity를 구성할 때, createdAt과 updatedAt을 필드로 포함하여 해당 필드의 생성시간과 수정시간을 남깁니다. 로그성 데이터로 활용하기 위해서 남기는 것이 일반적입니다.
모든 Entity에 공통으로 들어갈 createdAt과 updatedAt을 모든 생성, 수정 메서드에서 관리하는 것은 상당히 비효율적입니다.
그렇기 때문에 JPA에서는 @CreatedDate와 @LastModifiedDate를 이용하여 자동으로 값을 넣어주도록 했습니다. 이를 위해선 @EnableJpaAuditing이라는 어노테이션을 설정해야 했죠.
Spring Data MongoDB에서도 사용이 가능합니다. 코드 자체는 크게 어렵지 않으니 간단하게 살펴보겠습니다.
@SpringBootApplication
@EnableMongoAuditing
class OOOApplication
fun main(args: Array<String>) {
runApplication<OOOApplication>(*args)
}
@Document(collection = "Person")
data class Person(
@Id
val id: ObjectId? = null,
@CreatedDate
var createdAt: LocalDateTime? = null,
@LastModifiedDate
var updatedAt: LocalDateTime? = null,
val name: String? = null,
val age: Int? = null,
val sex: Sex? = null,
)
@Test
fun `AuditingTest`() {
val savedPerson = personRepository.save(Person(name = "강호동", age = 30, sex = Sex.MALE))
val updatedPerson = personRepository.save(savedPerson.copy(name = "유재석"))
println(savedPerson)
println(updatedPerson)
}

모든 생성, 수정 메서드에서 createdAt과 updatedAt을 관리하는 수고를 덜기 위해 어노테이션을 활용했습니다. 하지만, 위의 예시처럼 진행하는 경우, 모든 Entity에서 createdAt과 updatedAt 필드를 관리해주어야 합니다.
일반적으로는 Base라는 이름의 Entity를 별도로 두어 관리합니다.
abstract class Base {
@get:Id
abstract val id: ObjectId?
@get:CreatedDate
abstract var createdAt: LocalDateTime?
@get:LastModifiedDate
abstract var updatedAt: LocalDateTime?
}
@Document(collection = "Person")
data class Person(
override val id: ObjectId? = null,
override var createdAt: LocalDateTime? = null,
override var updatedAt: LocalDateTime? = null,
val name: String? = null,
val age: Int? = null,
val sex: Sex? = null,
) : Base()
@Test
fun `AuditingTest`() {
val savedPerson = personRepository.save(Person(name = "강호동", age = 30, sex = Sex.MALE))
val updatedPerson = personRepository.save(savedPerson.copy(name = "유재석"))
println(savedPerson)
println(updatedPerson)
}
Base를 통해 관리하는 것의 장점은 무엇일까요? 크게 두 가지가 있겠습니다. 우선 귀찮음을 덜을 수 있습니다. Entity를 만들 때마다 공통 필드에 대한 어노테이션을 달아주는 일은 생각보다 번거롭습니다. 안 그래도 작성해야할 코드가 많은데, 어노테이션까지 일일이 작성하는 건 상당히 귀찮습니다.
또, 이런 상황을 생각해볼 수 있습니다.팀 내에서 모든 Entity는 Base를 통해 관리하기로 했는데, 누군가는 공통관리되는 필드들에 어노테이션을 달지 않을 수도 있습니다. 하지만 Base에서 어노테이션을 지정해준다면 위와 같은 문제는 발생하지 않습니다