개발 공부/[Spring]

[Spring] BaseTimeEntity와 사용되는 어노테이션의 기능

죽밥죽밥화이팅 2024. 11. 20. 23:57

 

프로젝트를 위해 등록일과 수정일 데이터를 넣어주기 위해 BaseTime 클래스를 생성했다.

각 요소들의 특징을 자세히 알아보았다! 

 

코드는 다음과 같이 작성했다😊 

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @Column(updatable = false, nullable = false)
    @CreatedDate
    private LocalDateTime createdAt; // 등록일

    @Column
    @LastModifiedDate
    private LocalDateTime modifiedAt; // 수정일
}

 

 

사용한 어노테이션의 역할:

  1. @Column
    • updatable = false: 한번 저장된 값은 수정할 수 없음
    • nullable = false: NULL 값을 허용하지 않음
    • createdAt에는 이 두 속성을 명시해주었다. (생성 시간은 수정되면 안되고, 반드시 있어야 함)
    • modifiedAt은 기본 @Column만으로 충분! (수정 가능하고 NULL 허용)
  2. @MappedSuperclass
    • BaseTimeEntity 클래스를 상속받는 엔티티들이 createdAt, modifiedAt 필드를 컬럼으로 가지게 된다.
  3. @EntityListeners(AuditingEntityListener.class)
    • JPA Auditing 기능을 사용하여 시간을 자동으로 관리하는 기능을 한다.
  4. @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이란:

  1. 엔티티가 생성되거나 수정될 때 자동으로 시간을 기록해주는 기능이다.
  2. @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이 자동으로 설정!

 

 

  1. @EnableJpaAuditing이 설정되면 Spring이 엔티티의 변화를 감지하는 AuditingEntityListener를 활성화한다.
  2. @EntityListeners(AuditingEntityListener.class)가 지정된 엔티티들에 대해
  3. @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;
// 자동으로 시간이 설정됨!
}

 

  1. 엔티티의 변화를 감지:
    • 생성될 때 (@PrePersist)
    • 수정될 때 (@PreUpdate)
    • 삭제될 때 (@PreRemove)
    • 조회된 후 (@PostLoad) 등의 이벤트를 감지한다.
  2. AuditingEntityListener의 경우:
    • @CreatedDate가 붙은 필드에 자동으로 생성 시간 설정한다.
    • @LastModifiedDate가 붙은 필드에 자동으로 수정 시간 설정한다.

정리해보면

  1. @EntityListeners는 엔티티의 변화를 감지하는 리스너를 지정한다.
  2. AuditingEntityListener는 생성/수정 시간을 자동으로 관리해주는 JPA 제공 리스너이다.
  3. 이를 통해 반복적인 코드 작성을 피하고, 일관된 방식으로 엔티티의 생명주기를 관리할 수 있다!! 😄😄