From aad8d3a4ff1f1383e2ae77b9e8f1277404341f87 Mon Sep 17 00:00:00 2001 From: pricelees Date: Wed, 27 Aug 2025 16:15:56 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EC=83=88=EB=A1=9C=20=EC=82=AC=EC=9A=A9?= =?UTF-8?q?=ED=95=A0=20Auditing=20+=20PK=20BaseEntity=20=EB=B0=8F=20JPA=20?= =?UTF-8?q?AuditorAwareConfig=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../roomescape/common/config/JpaConfig.kt | 25 +++++++++ .../roomescape/common/entity/BaseEntityV2.kt | 55 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 src/main/kotlin/roomescape/common/config/JpaConfig.kt create mode 100644 src/main/kotlin/roomescape/common/entity/BaseEntityV2.kt diff --git a/src/main/kotlin/roomescape/common/config/JpaConfig.kt b/src/main/kotlin/roomescape/common/config/JpaConfig.kt new file mode 100644 index 00000000..72f2620e --- /dev/null +++ b/src/main/kotlin/roomescape/common/config/JpaConfig.kt @@ -0,0 +1,25 @@ +package roomescape.common.config + +import org.slf4j.MDC +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration +import org.springframework.data.domain.AuditorAware +import org.springframework.data.jpa.repository.config.EnableJpaAuditing +import roomescape.auth.web.support.MDC_MEMBER_ID_KEY +import java.util.* + +@Configuration +@EnableJpaAuditing +class JpaConfig { + + @Bean + fun auditorAware(): AuditorAware = MdcAuditorAware() +} + +class MdcAuditorAware : AuditorAware { + override fun getCurrentAuditor(): Optional { + val memberIdStr = MDC.get(MDC_MEMBER_ID_KEY) + + return Optional.ofNullable(memberIdStr.toLongOrNull()) + } +} diff --git a/src/main/kotlin/roomescape/common/entity/BaseEntityV2.kt b/src/main/kotlin/roomescape/common/entity/BaseEntityV2.kt new file mode 100644 index 00000000..f0f94700 --- /dev/null +++ b/src/main/kotlin/roomescape/common/entity/BaseEntityV2.kt @@ -0,0 +1,55 @@ +package roomescape.common.entity + +import jakarta.persistence.Column +import jakarta.persistence.EntityListeners +import jakarta.persistence.Id +import jakarta.persistence.MappedSuperclass +import jakarta.persistence.PostLoad +import jakarta.persistence.PrePersist +import org.springframework.data.annotation.CreatedBy +import org.springframework.data.annotation.CreatedDate +import org.springframework.data.annotation.LastModifiedBy +import org.springframework.data.annotation.LastModifiedDate +import org.springframework.data.domain.Persistable +import org.springframework.data.jpa.domain.support.AuditingEntityListener +import java.time.LocalDateTime + +@MappedSuperclass +@EntityListeners(AuditingEntityListener::class) +abstract class AuditingBaseEntity( + @Id + @Column(name = "id") + private val _id: Long, + + @Transient + private var isNewEntity: Boolean = true +) : Persistable { + @Column(updatable = false) + @CreatedDate + lateinit var createdAt: LocalDateTime + protected set + + @Column(updatable = false) + @CreatedBy + var createdBy: Long = 0L + protected set + + @Column + @LastModifiedDate + lateinit var updatedAt: LocalDateTime + protected set + + @Column + @LastModifiedBy + var updatedBy: Long = 0L + protected set + + @PostLoad + @PrePersist + fun markNotNew() { + isNewEntity = false + } + + override fun getId(): Long = _id + override fun isNew(): Boolean = isNewEntity +}