Base Entity

띠로리·2024년 8월 8일

엔티티와 관련된 작업을 하다 보면, 데이터의 등록 시간과 수정 시간과 같이 자동으로 추가되고 변경되어야 하는 칼럼들이 있다. 이를 매번 프로그램 안에서 처리하는 일은 번거롭기 때문에 자동으로 처리할 수 있도록 어노테이션을 이용해서 설정한다.

프로젝트 내에 entity 패키지 속 BaseEntity 클래스를 추상 클래스로 작성하자.

package org.zerock.guestbook.entity;

import jakarta.persistence.Column;
import jakarta.persistence.EntityListeners;
import jakarta.persistence.MappedSuperclass;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

@MappedSuperclass // 이 어노테이션이 적용된 클래스는 테이블로 생성되지 않는다.
// 실제 테이블은 BaseEntity 클래스를 상속한 엔티티의 클래스로 DB 테이블이 생성된다.
@EntityListeners(value = { AuditingEntityListener.class})
@Getter
abstract class BaseEntity {
    @CreatedDate
    @Column(name = "regdate", updatable = false)
    private LocalDateTime regDate;

    @LastModifiedDate
    @Column(name = "moddate")
    private LocalDateTime modDate;
}

BaseEntity 클래스는 @MappedSuperClass라는 특별한 어노테이션이 적용되는데, 해당 어노테이션이 적용된 클래스는 테이블로 생성되지 않는다. 실제 테이블은 BaseEntity 클래스를 상속한 엔티티의 클래스로 데이터베이스 테이블이 생성된다.

JPA 객체 범위

JPA는 JPA만의 고유한 메모리 공간(이하 context)을 이용해서 엔티티 객체들을 관리한다. 기존의 MyBatis 방식과 비교하면 다음과 같다.

  • MyBatis를 이용하는 경우 : SQL을 위해 전달되는 객체는 모두 SQL 처리가 끝난 후에는 어떻게 되든 상관 없는 객체이다.
  • JPA에서 사용하는 엔티티 객체 : 영속 콘텍스트라는 곳에서 관리되며, 이 객체들이 변경되면 결과적으로 데이터베이스에 이를 반영한다.

위의 그림에서 ①, ②, ③의 경우 동일한 객체이건 전혀 다른 객체이건 상관없지만, JPA 방식에서는 해당 엔티티 객체는 유지되고 필요할 때 꺼내서 재사용하는 방식이 된다. 이러한 엔티티 객체에는 어떤 변화가 일어나는 것을 감지하는 리스터가 있다.

  • AuditingEntityListener : JPA 내부에서 엔티티 객체가 생성/변경되는 것을 감지하는 역할
  • @CreatedDate : JPA에서 엔티티의 생성시간 처리
  • @LastModifiedDate : 최종 수정 시간을 자동으로 처리하는 용도

JPA를 이용하면서 AuditingEntityListener를 활성화시키기 위해서는 프로젝트에 @EnableJpaAuditing 설정을 추가해야 한다.

profile
차곡 차곡 기록 쌓기

0개의 댓글