mongodb @Createdate사용

greenTea·2024년 4월 29일
0

MongoDB를 사용하는 Spring Boot 애플리케이션에서 직접 ID를 설정하는 경우, @CreatedDate 어노테이션이 예상대로 작동하지 않는 문제에 부딪힐 수 있습니다.

문제의 원인

Spring Data MongoDB는 isNew() 메서드를 통해 객체가 새로운 것인지 아닌지를 판단합니다. 기본적으로, 객체의 ID 필드가 null인 경우에만 새로운 객체로 간주됩니다. 이는 @CreatedDate 같은 어노테이션이 새로 생성된 객체에만 적용되도록 합니다.

문제 설명 이미지 1

문제 방법 이미지 2
위 이미지에서 보듯이 여러 과정을 거치면서 id 필드 type과 값 존재 여부를 판단하여서 새로운 객체인지를 판단합니다. 이 결과값을 토대로 @CreateDate 작동 여부를 판단하게 됩니다.

해결 방법

이 문제를 해결하는 방법은 Persistable 인터페이스를 구현하여, isNew() 메서드를 커스텀 로직으로 오버라이드하는 것입니다. 이렇게 하면 객체가 실제로 새로운 것인지 아닌지를 직접 설정할 수 있게 됩니다. 예를 들어, createDate 필드가 null인 경우에만 객체를 새로운 것으로 판별하게 할 수 있으며 언제나 새로운 객체로 판별되게 할 수도 있습니다,.

Persistable 인터페이스는 getId()isNew() 두 메서드를 제공합니다. getId() 메서드는 객체의 ID를 반환하며, isNew() 메서드는 객체가 새로운 것인지 여부를 반환합니다.

아래 코드는 Persistable 인터페이스를 구현한 예시입니다. createDate 필드의 존재 여부에 따라 객체가 새로운 것인지를 판별합니다. createDatenull이면, 객체는 새로운 것으로 간주되며, 이 경우에 @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]

profile
greenTea입니다.

0개의 댓글

관련 채용 정보