Java/Spring Boot

[Spring Boot] BaseEntity 만들기

깨준 2024. 10. 22. 14:04

1. 순수 JPA를 이용한 BaseEntity 구현

@Setter
@Getter
@MappedSuperclass
public class BaseEntity{
	@Column(updatable = false)
	private LocalDateTime createdAt;
	private LocalDateTime updatedAt;

	@PrePersist
	public void prePersist(){
		LocalDateTime now = LocalDateTime.now();
		createdAt = now;
		updatedAt = now;
	}
	@PreUpdate
  public void preUpdate() {
    updatedAt = LocalDateTime.now();
  }
}

MappedSuperclass

BaseEntity는 각종 Entity에 상속을 해주어야 한다. 하지만, 클래스 명만 Entity이지 이는 JPA Entity클래스가 아니다. JPA Entity클래스는 JPA Entity클래스끼리만 상속을 받을 수 있는데 JPA Entity클래스에서 일반 클래스를 상속받기 위해서는 해당 어노테이션을 작성해 주어야 한다.

Column(updatable = false)

컬럼이 엔티티가 수정될 때 업데이트되지 않도록 지정

⇒ 생성 시점에만 값이 설정되고 이후에는 변경 X

PrePersist

엔티티가 데이터베이스에 저장되기 전에 호출되는 메서드에 적용

⇒ createdAt, updatedAt을 현재 시각으로 수정

PreUpdate

변경 감지를 통해 update쿼리가 실행

⇒ updatedAt의 시간을 현재시각으로 수정

2. Spring Data JPA를 이용한 BaseEntity

@EntityListeners(AuditingEntityListener.class)
@Getter
@MappedSuperclass
public class BaseEntity {

    @CreatedDate
    @Column(name = "created_at", updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Column(name = "updated_at")
    private LocalDateTime updatedAt;
}

EntityListeners

JPA에서 PrePersit, PreUpdate등 엔티티의 생명주기 이벤트를 처리하기 위한 리스너 클래스를 지정할 때 사용

엔티티의 생명주기 이벤트(예: 생성, 수정, 삭제 등)와 관련된 메서드를 호출하는 데 사용

CreatedDate

PrePersist와 비슷한 기능으로, Entity가 생성되어 저장될 때 시간이 자동으로 저장

LastModifiedDate

PreUpdate와 비슷한 기능으로, 조회한 Entity의 값을 변경할 때 시간이 자동으로 저장


참고: 

https://velog.io/@vpdls1511/Spring%EC%97%90%EC%84%9C-BaseEntity%EC%9E%91%EC%84%B1%ED%95%98%EA%B8%B0