audit란?
엔터티(Entity)의 생성 및 변경 이력을 자동으로 감지. 이를 통해 데이터 변경 내역을 자동으로 기록할 수 있고, 수동으로 createdAt, updatedAt 등을 설정할 필요가 없음
예제
package com.contact.management.entity
import jakarta.persistence.*
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 java.time.LocalDateTime
@Entity
@Table(name = "users")
class User2 (
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long?= null,
var name: String,
var email: String,
@CreatedDate
@Column(updatable = false)
var createdAt: LocalDateTime,
@LastModifiedDate
var updatedAt: LocalDateTime,
@CreatedBy
@Column(updatable = false)
var createdBy: String,
@LastModifiedBy
var updatedBy: String
)
-> entity를 생성할때 등록자, 수정자, 등록일, 수정일을 추가하고싶을때 수많은 entity에 동일한 코드가 들어가게 된다.
audit를 적용하면 중복된 코드들을 하나의 entity로 관리를 할수 있다.
audit 적용 예제
audit 패키지를 생성후 아래 .kt 파일들을 생성
AuditorAwareConfig.kt
package com.contact.management.audit
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.data.domain.AuditorAware
import java.util.Optional
@Configuration
class AuditorAwareConfig {
@Bean
fun auditorProvider(): AuditorAware<String> {
return AuditorAware { Optional.of("system") } // 실제 환경에서는 SecurityContext에서 가져오기
}
}
-> 아직 spring security를 적용하기 전이므로 system이라는 값을 하드코딩 하였음, security를 적용한 이후에는 로그인한 사용자의 아이디를 가져오게 변경해야함
BaseEntity.kt
package com.contact.management.audit
import jakarta.persistence.Column
import jakarta.persistence.EntityListeners
import jakarta.persistence.MappedSuperclass
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.jpa.domain.support.AuditingEntityListener
import java.time.LocalDateTime
@EntityListeners(AuditingEntityListener::class)
@MappedSuperclass
abstract class BaseEntity {
@CreatedDate
@Column(updatable = false)
lateinit var createdAt: LocalDateTime
@LastModifiedDate
lateinit var updatedAt: LocalDateTime
@CreatedBy
@Column(updatable = false)
lateinit var createdBy: String
@LastModifiedBy
lateinit var updatedBy: String
}
Application.kt
package com.contact.management
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
import org.springframework.data.jpa.repository.config.EnableJpaAuditing
@SpringBootApplication
@EnableJpaAuditing
class ManagementApplication
fun main(args: Array<String>) {
runApplication<ManagementApplication>(*args)
}
처음 프로젝트를 생성할때 만들어지는 Application.kt 파일에 @EnableJpaAuditing을 추가한다.
User.kt
package com.contact.management.entity
import com.contact.management.audit.BaseEntity
import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import jakarta.persistence.Table
@Entity
@Table(name = "users")
class User (
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long?= null,
var name: String,
var email: String
) : BaseEntity()
audit를 적용하고자 하는 entity 뒤에 : BaseEntity()를 추가해준다.
결과
-> 이전에 만든 사용자 등록 api를 호출
USERS 테이블을 조회하면 날짜와 하드 코딩한 system이 등록자, 수정자에 insert가 된것을 확인할수 있음