MongoDB를 사용하는 Spring Boot 애플리케이션에서 직접 ID를 설정하는 경우, @CreatedDate
어노테이션이 예상대로 작동하지 않는 문제에 부딪힐 수 있습니다.
Spring Data MongoDB는 isNew()
메서드를 통해 객체가 새로운 것인지 아닌지를 판단합니다. 기본적으로, 객체의 ID 필드가 null
인 경우에만 새로운 객체로 간주됩니다. 이는 @CreatedDate
같은 어노테이션이 새로 생성된 객체에만 적용되도록 합니다.
위 이미지에서 보듯이 여러 과정을 거치면서 id 필드 type과 값 존재 여부를 판단하여서 새로운 객체인지를 판단합니다. 이 결과값을 토대로 @CreateDate
작동 여부를 판단하게 됩니다.
이 문제를 해결하는 방법은 Persistable
인터페이스를 구현하여, isNew()
메서드를 커스텀 로직으로 오버라이드하는 것입니다. 이렇게 하면 객체가 실제로 새로운 것인지 아닌지를 직접 설정할 수 있게 됩니다. 예를 들어, createDate
필드가 null
인 경우에만 객체를 새로운 것으로 판별하게 할 수 있으며 언제나 새로운 객체로 판별되게 할 수도 있습니다,.
Persistable
인터페이스는 getId()
와 isNew()
두 메서드를 제공합니다. getId()
메서드는 객체의 ID를 반환하며, isNew()
메서드는 객체가 새로운 것인지 여부를 반환합니다.
아래 코드는 Persistable
인터페이스를 구현한 예시입니다. createDate
필드의 존재 여부에 따라 객체가 새로운 것인지를 판별합니다. createDate
가 null
이면, 객체는 새로운 것으로 간주되며, 이 경우에 @CreatedDate
어노테이션이 적용됩니다.
@Document
public class MyDocument implements Persistable<String> {
@Id
private String id;
@CreatedDate
private LocalDateTime createDate;
@LastModifiedDate
private LocalDateTime updateDate;
@Override
public String getId() {
return this.id;
}
@Override
public boolean isNew() {
// createDate가 null이면 새로운 객체로 판별
return createDate == null;
}
}
jpa와 비슷하게 작동 하는 것을 알 수 있습니다...
참고자료: Github - Annotation @CreatedDate isn't working, when ID is assigned manually [DATAMONGO-946]