지나공 : 지식을 나누는 공간

JPA Auditing 사용하기, BaseEntity로 생성일, 수정일 자동화 본문

Tech/JPA

JPA Auditing 사용하기, BaseEntity로 생성일, 수정일 자동화

해리리_ 2021. 2. 16. 11:35

오늘은 JPA Auditing에 대한 포스팅입니다.

 

프로젝트를 하다보면 어떤 데이터의 생성시간, 수정시간, 또는 생성한 사람, 마지막으로 수정한 사람을 저장해야 할 때가 있습니다.

 

예를 들어 공지사항이나 게시글 등을 저장하는 테이블에 게시글이 작성된 날짜와 시간, 작성한 사람, 수정시간과 수정한 사람 등이 필요해요. 회원 가입이나 주문내역을 저장할 때도 마찬가지고요. 

 

생각해보면 게시글이나 주문내역 처럼 사용자가 직접 생성해내는 데이터들은 웬만하면 데이터 생성일과 수정일을 저장하게 되는 것 같습니다. 

 

근데 이걸 모든 엔티티에 매번 컬럼으로 지정해서 코드를 작성하는 건 번거로워요. 생성 시간 수정 시간 저장을 자동화하고 BaseTimeEntity로 만들어서, 이게 필요한 엔티티들은 모두 BaseEntity를 상속받도록 하겠습니다.

 

1. BaseTimeEntity 만들기

 

BaseTimeEntity.java

 

사진 잘 안보이시면 더보기 클릭하셔서 코드 확인하세요.

 

패키지명이 다를 수 있습니다! 복붙하시면 주의하세요.

 

더보기

import lombok.Getter;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@Getter
@MappedSuperclass //BaseTimeEntity를 상속한 엔티티들은 아래 필드들을 컬럼으로 인식하게 된다.
@EntityListeners(AuditingEntityListener.class) //Auditing(자동으로 값 매핑) 기능 추가
public abstract class BaseTimeEntity {

@CreatedDate
private LocalDateTime createdDate;

/* @CreatedBy
@Column(updatable = false)
private String createdBy;*/

@LastModifiedDate
private LocalDateTime lastModifiedDate;

/* @LastModifiedBy
private String lastModifiedBy;*/
}

 

@Getter : 모든 멤버변수에 대한 get 메소드를 생성하는 롬복 어노테이션

@MappedSuperClass : BaseEntity를 상속한 엔티티들은 BaseEntity에 있는 멤버변수들을 모두 컬럼으로 인식하게 되도록 합니다.

@EntityListeners(AuditingEntityListener.class) : Auditing 기능을 사용하겠다, 자동으로 값을 매핑시키겠다는 의미예요.

 

@CreatedBy랑 @LastModifiedBy는 당장 사용하지 않아서 일단 주석으로 처리했습니다. 생성한 사람과 수정한 사람을 저장해야 할 때 사용하면 됩니다.

 

 

2. BaseEntity 상속받기

 

ZUser.java

 

회원 엔티티이고 BaseEntity를 상속받게 했습니다.

 

코드 펼치기

더보기

import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Getter
@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class ZUser extends BaseTimeEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@Column(nullable = false)
private String name;

@Column(nullable = false, unique = true, length = 100)
private String uid;

@Column
private String phoneNumber;

@Column
private String sex;

@Builder
public ZUser(Long id, String name, String uid, String phoneNumber, String sex){
this.id = id;
this.name = name;
this.uid = uid;
this.phoneNumber = phoneNumber;
this.sex = sex;
}

}

 

 

3. 최종적으로 적용하기

 

InternalApiApplication.java

코드 펼치기

더보기

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@SpringBootApplication
@EnableJpaAuditing
public class InternalApiApplication {

public static void main(String[] args) {
SpringApplication.run(InternalApiApplication.class, args);
}
}

 

데이터가 잘 들어간 걸 확인할 수 있습니다.

728x90
Comments