[Spring/Mongo] Auditing 설정

민찬기·2023년 4월 24일
0

Spring & MongoDB

목록 보기
3/4

개요

Entity를 구성할 때, createdAtupdatedAt을 필드로 포함하여 해당 필드의 생성시간과 수정시간을 남깁니다. 로그성 데이터로 활용하기 위해서 남기는 것이 일반적입니다.

모든 Entity에 공통으로 들어갈 createdAtupdatedAt을 모든 생성, 수정 메서드에서 관리하는 것은 상당히 비효율적입니다.

그렇기 때문에 JPA에서는 @CreatedDate@LastModifiedDate를 이용하여 자동으로 값을 넣어주도록 했습니다. 이를 위해선 @EnableJpaAuditing이라는 어노테이션을 설정해야 했죠.

Mongo에서도 써보자

Spring Data MongoDB에서도 사용이 가능합니다. 코드 자체는 크게 어렵지 않으니 간단하게 살펴보겠습니다.

기본설정

예제

OOOApplication.kt

@SpringBootApplication
@EnableMongoAuditing
class OOOApplication

fun main(args: Array<String>) {
	runApplication<OOOApplication>(*args)
}

Person.kt

@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,
)

결과 확인

RepositoryTest.kt

@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)
}

매번 넣을 수는 없다!

모든 생성, 수정 메서드에서 createdAtupdatedAt을 관리하는 수고를 덜기 위해 어노테이션을 활용했습니다. 하지만, 위의 예시처럼 진행하는 경우, 모든 Entity에서 createdAtupdatedAt 필드를 관리해주어야 합니다.

일반적으로는 Base라는 이름의 Entity를 별도로 두어 관리합니다.

예제

Base.kt

abstract class Base {
    @get:Id
    abstract val id: ObjectId?
    @get:CreatedDate
    abstract var createdAt: LocalDateTime?
    @get:LastModifiedDate
    abstract var updatedAt: LocalDateTime?
}

Person.kt

@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()

결과 확인

RepositoryTest.kt

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

profile
https://github.com/devmizz

0개의 댓글