@LastModifiedDate 수정시간 적용시점

허진혁·2023년 1월 5일
0

댓글 수정을 통해 수정 시간을 확인해 보았는데, 응답으로 나온 시간과 DB에 나온 시간이 다르다는 것을 찾았다.

이벤트가 있을 때 시간을 적용해주는 JPA에서 좋은 기능 auditing을 들어가보았다.

@Configurable
public class AuditingEntityListener {

	private @Nullable ObjectFactory<AuditingHandler> handler;

	@PrePersist
	public void touchForCreate(Object target) {

		Assert.notNull(target, "Entity must not be null!");

		if (handler != null) {

			AuditingHandler object = handler.getObject();
			if (object != null) {
				object.markCreated(target);
			}
		}
	}

	@PreUpdate
	public void touchForUpdate(Object target) {

		Assert.notNull(target, "Entity must not be null!");

		if (handler != null) {

			AuditingHandler object = handler.getObject();
			if (object != null) {
				object.markModified(target);
			}
		}
	}
}

들어가서 보니 이유를 찾을 수 있었다.

This annotation may be applied to methods of an entity class, a mapped superclass, or a callback listener class.

create 할 때는 Persistence Context 에서 persist 하기 직전에 시간을 적용해준다. 사실상 영속성 컨텍스트가 관리하기 시작할 때의 시간인 것이다.

다만, update처럼 변경 감지가 일어날 때는 해당 엔티티를 업데이트 하기 이전의 시간이 저장된다. 이것이 오차의 이유였던 것이다.

db에서 변경한 시점을 즉각 적용하고 싶다면 db로 flush를 날려주면 된다.

public PostUpdateResponseDto update(PostUpdateRequestDto requestDto, Integer postId, String userName) {
        ...
        post.update(requestDto.getTitle(), requestDto.getBody());
        postRepository.flush();
        return PostUpdateResponseDto.from(post);
    }


profile
Don't ever say it's over if I'm breathing

0개의 댓글