JPA
createdAt의 저장(Auditing)
winwin-k9
2023. 3. 30. 02:00
프로젝트를 수행하면서 사용했던 코드이다.
엔티티 생성, 수정 시간을 기록하는 필드에 대해 알아보자.
@Getter
@EntityListeners(AuditingEntityListener.class)
@MappedSuperclass
public class BaseTimeEntity {
@CreatedDate
@Column(nullable = false, updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
@Column(nullable = false)
private LocalDateTime modifiedDate;
}
@Entity
@Getter
@NoArgsConstructor
@Builder
@AllArgsConstructor
public class Member extends BaseTimeEntity{
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String password;
...
이하 생략
}
각 엔티티에 생성, 수정 시간을 기록하기 위해 Auting을 사용하려고 했다.
엔티티가 너무 많아지면 일일히 필드에 추가하기 번거로우니 BaseEntity를 만들고 여기에 생성, 수정시간을 기록하는 필드를 만들었다.
@CreatedDate & @LastModifiedDate
@CreatedDate는 엔티티 생성 시 특정 필드를 자동으로 데이터베이스에 매핑해주기 위해 사용한다.
그런데 아무런 설정 없이 @CreatedDate 어노테이션만 붙이면 다음과 같은 에러가 발생하거나 NULL이 저장된다.
not-null property references a null or transient value createddate
다음과 같은 설정이 필요하다.
- SpringApplication에 @EnableJpaAuditing 붙이기
- 콜백 요청을 원하는 엔티티에 @EntityListeners(AuditingEntityListener.class) 붙이기
@EntityListeners
엔티티를 DB에 적용하기 이전에 콜백을 요청할 수 있는 어노테이션
AuditingEntityListener
- Auditing이란 감시하다라는 뜻이다.
- 엔티티를 영속성 컨텍스트에 저장하거나 수정한 후 update하는 경우
자동으로 auditor, time을 매핑하여 DB에 넣도록 도와준다. - 스프링 부트의 엔트리 포인트인 실행 클래스에 @EnableJpaAuditing을 적용하여 JPA Auditing을 활성화 해야한다.
위 설정들을 마치면 엔티티에 따로 createdAt과 updatedAt을 set 하지 않아도 자동으로 DB에 저장된다.
728x90