728x90
개요
Spring Data는 엔티티를 만든 사람이나 변경한 사람, 변경이 발생한 시점을 추적하기 위한 Auditing 기능을 제공한다. Spring Data의 Auditing 기능을 사용하면 Entity 변경 데이터에 대하여 별도의 코드를 작성하지 않아도 Spring Data에서 해당 데이터를 추가해 준다.
Example
게시글을 저장하는 간단한 web application을 작성하여 Auditing 기능을 살펴본다.
Entity
Spring Data에서는 @CreatedBy, @CreatedDate, @LastModifiedBy, @LastModifiedDate 어노테이션을 제공한다. 시간 Type은 사용하려는 타입에 맞춰서 변경 가능하다.
@Document("artices")
public class Article {
@Id
private String id;
private String title;
private String content;
@CreatedBy
private AuditUser createdBy;
@CreatedDate
private Instant createdDate;
@LastModifiedBy
private AuditUser lastModifiedBy;
@LastModifiedDate
private Instant lastModifiedDate;
public Article() {
}
public Article(String title, String content) {
this.title = title;
this.content = content;
}
......
Auditing Metadata
AuditUser 정보를 저장할 객체를 생성한다. Long, String 등 아이디만 저장할 수도 있다.
public class AuditUser {
private String id;
public AuditUser() {
}
public AuditUser(String id) {
this.id = id;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
AuditorAware
AuditorAware 인터페이스 구현체를 Bean으로 등록한다. 예제에서는 UUID값을 랜덤으로 사용했지만 Spring Security를 상요하는 경우 SecurityContext에서 사용자 데이터를 조회하여 설정할 수 있다.
@Configuration
@EnableMongoAuditing
public class AuditingConfig {
@Bean
AuditorAware<AuditUser> auditorAware() {
return () -> Optional.of(new AuditUser(UUID.randomUUID().toString()));
}
}
Example Controller
사용자 정보를 저장하고 업데이트하는 예제 Controller를 작성한다.
@RestController
public class ArticleController {
private final ArticleRepository articleRepository;
public ArticleController(ArticleRepository articleRepository) {
this.articleRepository = articleRepository;
}
@GetMapping("/save")
Article save(@RequestParam("title") String title, @RequestParam("content") String content) {
return this.articleRepository.save(new Article(title, content));
}
@GetMapping("/update")
Article update(@RequestParam("id") String id, @RequestParam("content") String content) {
var article = this.articleRepository.findById(id).get();
article.setContent(content);
return this.articleRepository.save(article);
}
}
Demo
Article 저장 : created, lastModified에 같은 사용자 정보가 저장
$ http://localhost:8080/save?title=igooo&content=1
{
"id" : "66cc4bd6852bd44795ca3a54",
"title" : "igooo",
"content" : "1",
"createdBy" : {
"id" : "47ae286d-d20c-45ce-b988-0fb57dbf712c"
},
"createdDate" : "2024-08-26T13:33:10.243990600Z",
"lastModifiedBy" : {
"id" : "47ae286d-d20c-45ce-b988-0fb57dbf712c"
},
"lastModifiedDate" : "2024-08-26T13:33:10.243990600Z"
}
Article 수정 : lastModifiedBy, lastModifiedDate 값이 변경되었다.
$ http://localhost:8080/update?id=66cc4bd6852bd44795ca3a54&content=2
{
"id" : "66cc4bd6852bd44795ca3a54",
"title" : "igooo",
"content" : "2",
"createdBy" : {
"id" : "47ae286d-d20c-45ce-b988-0fb57dbf712c"
},
"createdDate" : "2024-08-26T13:33:10.243990600Z",
"lastModifiedBy" : {
"id" : "e08e20de-d9b0-4588-9389-99f69986c15d"
},
"lastModifiedDate" : "2024-08-26T13:35:11.323990120Z"
}
주의 : 대부분의 경우 Entity의 Id 필드는 저장 시 null값으로 설정하고 Spring Data를 통하여 저장할 때 Id 값이 저장되어 반환된다. Id 필드의 값을 임의로 설정하여 저장하는 경우 Spring Data의 EntityInformation.isNew() 메서드의 기본 전략이(PersistentEntityIsNewStrategy) Id 값이 Null 또는 Primitive 타입의 경우 0 인지를 체크하기 때문에 id값은 설정하지 않고 저장해야 Created값에도 데이터가 저장된다.
'dev > spring' 카테고리의 다른 글
[Spring Boot] Virtual Threads vs Reactive vs Kotlin Coroutines 성능 비교 (0) | 2024.09.10 |
---|---|
Spring Boot + vue, react 환경 구성 (1) | 2024.09.05 |
[Spring Batch] - AbstractPagingItemReader 조심하기 (0) | 2024.08.21 |
[Spring Batch] 5.1.2 Features (0) | 2024.08.21 |
[Spring] Flyway DB Migration (0) | 2024.08.05 |