프로젝트를 위해 등록일과 수정일 데이터를 넣어주기 위해 BaseTime 클래스를 생성했다.
각 요소들의 특징을 자세히 알아보았다!
코드는 다음과 같이 작성했다😊
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {
@Column(updatable = false, nullable = false)
@CreatedDate
private LocalDateTime createdAt; // 등록일
@Column
@LastModifiedDate
private LocalDateTime modifiedAt; // 수정일
}
사용한 어노테이션의 역할:
- @Column
- updatable = false: 한번 저장된 값은 수정할 수 없음
- nullable = false: NULL 값을 허용하지 않음
- createdAt에는 이 두 속성을 명시해주었다. (생성 시간은 수정되면 안되고, 반드시 있어야 함)
- modifiedAt은 기본 @Column만으로 충분! (수정 가능하고 NULL 허용)
- @MappedSuperclass
- BaseTimeEntity 클래스를 상속받는 엔티티들이 createdAt, modifiedAt 필드를 컬럼으로 가지게 된다.
- @EntityListeners(AuditingEntityListener.class)
- JPA Auditing 기능을 사용하여 시간을 자동으로 관리하는 기능을 한다.
- @CreatedDate, @LastModifiedDate
- 엔티티가 생성/수정될 때 자동으로 시간이 설정된다.
JPA Auditing을 사용하기 위해서는 *메인 애플리케이션 클래스*에 @EnableJpaAuditing 어노테이션을 추가해야 한다!!
@EnableJpaAuditing
@SpringBootApplication
public class RestaurantReservationApplication {
public static void main(String[] args) {
SpringApplication.run(RestaurantReservationApplication.class, args);
}
}
abstract 클래스이기 때문에 다른 엔티티 클래스들에서 BaseTimeEntity를 상속받으면 생성/수정 시간을 자동으로 관리할 수 있게 된다😊😊
@EnableJpaAuditing 이건 왜 사용해야 하는가?
@EnableJpaAuditing은 JPA Auditing 기능을 활성화하기 위해 필요한 어노테이션이다.
JPA Auditing이란:
- 엔티티가 생성되거나 수정될 때 자동으로 시간을 기록해주는 기능이다.
- @CreatedDate / @LastModifiedDate / @CreatedBy / @LastModifiedBy 같은 어노테이션들이 실제로 동작하게 만드는 것이다.
예를 들어 @EnableJpaAuditing이 없다면 수동으로 시간을 설정해야 한다.
User user = new User();
user.setName("John");
user.setCreatedAt(LocalDateTime.now());
userRepository.save(user);
// @EnableJpaAuditing이 있는 경우
User user = new User();
user.setName("John");
userRepository.save(user);// createdAt, modifiedAt이 자동으로 설정!
- @EnableJpaAuditing이 설정되면 Spring이 엔티티의 변화를 감지하는 AuditingEntityListener를 활성화한다.
- @EntityListeners(AuditingEntityListener.class)가 지정된 엔티티들에 대해
- @CreatedDate, @LastModifiedDate 등이 붙은 필드들을 자동으로 관리하게 된다.
AuditingEntityListener란?
JPA에서 제공하는 엔티티 리스너로, 엔티티의 생성일자, 수정일자, 생성자, 수정자 등의 Audit(감사) 정보를 자동으로 관리해주는 클래스이다.
@EnableJpaAuditing 기능이 없다면?!
- 모든 엔티티를 생성하거나 수정할 때마다 수동으로 시간을 설정해야 한다.
- 실수로 시간 설정을 빼먹을 수 있기도 하고, 엔티티마다 중복 코드가 생기게 된다.
따라서! @EnableJpaAuditing은 엔티티의 생성/수정 시간을 자동으로 관리하여 개발의 편의성을 높여주고 실수를 방지하는 기능을 한다.
@EntityListeners는 왜 사용해야 하는가?
@EntityListeners는 엔티티의 생명주기(life cycle)에 대한 이벤트를 감지하고 처리하기 위해 사용하는 어노테이션이다.
간단한 예시를 보면
// 1. @EntityListeners 없이 수동으로 처리하는 경우
@Entity
public class User extends BaseTimeEntity {
private String name;
// 저장할 때마다 수동으로 호출해야 함
public void prePersist() {
this.createdAt = LocalDateTime.now();
this.modifiedAt = LocalDateTime.now();
}
// 업데이트할 때마다 수동으로 호출해야 함
public void preUpdate() {
this.modifiedAt = LocalDateTime.now();
}
}
// 2. @EntityListeners를 사용하는 경우
@EntityListeners(AuditingEntityListener.class)
@Entity
public class User extends BaseTimeEntity {
private String name;
// 자동으로 시간이 설정됨!
}
- 엔티티의 변화를 감지:
- 생성될 때 (@PrePersist)
- 수정될 때 (@PreUpdate)
- 삭제될 때 (@PreRemove)
- 조회된 후 (@PostLoad) 등의 이벤트를 감지한다.
- AuditingEntityListener의 경우:
- @CreatedDate가 붙은 필드에 자동으로 생성 시간 설정한다.
- @LastModifiedDate가 붙은 필드에 자동으로 수정 시간 설정한다.
정리해보면
- @EntityListeners는 엔티티의 변화를 감지하는 리스너를 지정한다.
- AuditingEntityListener는 생성/수정 시간을 자동으로 관리해주는 JPA 제공 리스너이다.
- 이를 통해 반복적인 코드 작성을 피하고, 일관된 방식으로 엔티티의 생명주기를 관리할 수 있다!! 😄😄