createdAt 어떻게 저장할까?


아래 코드는 sns 프로젝트의 게시글 엔티티 클래스이다.
많은 어노테이션이 붙어있는데 이번에는 엔티티 생성, 수정 시간을 기록하는
필드에 대해 알아보자.

@Setter
@Getter
@Builder
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@EntityListeners(AuditingEntityListener.class)
@Entity
public class Post {
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private long id;

	private String content;

	@ManyToOne
	@JoinColumn(name = "user_id")
	private User user;

	@CreatedDate
	@Column(updatable = false, nullable = false)
	private LocalDateTime createdAt;

	@LastModifiedDate
	private LocalDateTime updatedAt;
}






@CreatedDate & @LastModifiedDate

@CreatedDate는 엔티티 생성 시 특정 필드를 자동으로 데이터베이스에 매핑해주기 위해 사용한다.
그런데 아무런 설정 없이 @CreatedDate 어노테이션만 붙이면 다음과 같은 에러가 발생하거나 NULL이 저장된다.

not-null property references a null or transient value createddate


다음과 같은 설정이 필요하다.

왜 이런 설정이 필요한지 더 알아보자.






@EntityListeners

엔티티를 DB에 적용하기 이전에 콜백을 요청할 수 있는 어노테이션




AuditingEntityListener

위 설정들을 마치면 엔티티에 따로 createdAtupdatedAt을 set 하지 않아도 자동으로 DB에 저장된다.






@CreationTimestamp

앞서 알아본 @CreatedDate는 Spring Data에서 제공하는 어노테이션이고
@CreationTimestamp는 하이버네이트에서 제공하는 어노테이션이다.

설정 없이 사용할 수 있지만 하이버네이트에 종속되어 버리니
@CreatedDate를 사용하기로 했다.






참고