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