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
에서 어노테이션을 지정해준다면 위와 같은 문제는 발생하지 않습니다