Spring

Spring Entity 날짜 자동 저장

오잎 클로버 2022. 1. 19. 22:25
728x90

나름 유용한 내용인 것 같아 포스팅하게 되었습니다.

 

Entity를 만들 때, 최초 생성 날짜, 그리고 제일 최근 수정 날짜 저장을 하고 싶을 때가 종종 있는 데

이를 수동적으로 넣을 수 도 있지만 

비즈니스 로직을 작성할 때마다 넣는 것은 굉장히 번거롭기 때문에

Entity를 연결해주는 추상 클래스를 하나 만들어 사용할 수도 있지만

Entity가 적다면 Entity에다가 그냥 적용시킬 수도 있지만

Entity가 하나인 경우는 많이 없다보니

Entity가 2개 이상이기에 추상 클래스를 사용해서 날짜를 자동 저장을 해야하는 상황이라고 가정해보자.

 

먼저 추상 클래스를 하나 만든다.

이름은 아무렇게나 해도 좋으나 모든 엔티티에 베이스(기초)가 되는 날짜이기에

BaseTimeEntity라고 지었습니다.

 

어노테이션 MappedSuperclass과 EntityListeners를 사용합니다.

위 어노테이션들은 JPA와 관련이 있으며

간략하게 설명하자면

MappedSuperclass는 공통 매핑 정보가 필요할 때 사용하고 해당 어노테이션을 사용한 클래스는 엔티티가 아닙니다.

EntityListeners는 JPA Entity에 이벤트가 발생했을 때 콜백을 처리하고 코드를 실행하는 어노테이션으로 

value에 적용한 클래스에 있는 기능을 포함한다.

그리고 Getter 어노테이션도 사용합니다. (각 field를 get하기 위해)

 

이를 코드화 시키면 

import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.format.annotation.DateTimeFormat;

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

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

    @CreatedDate
    @DateTimeFormat(pattern = "yyyy-MM-dd/HH:mm:ss")
    private LocalDateTime createdDate;

    @LastModifiedDate
    @DateTimeFormat(pattern = "yyyy-MM-dd/HH:mm:ss")
    private LocalDateTime modifiedDate;

}

정도로 표현할 수 있습니다.

Auditing기능을 포함하기 위해 EntityListeners value에 작성하였습니다.

CreateDate어노테이션은 최초 생성날짜 자동 저장

LastModifiedDate어노테이션은 최근 수정 날짜 자동 저장

DateTimeFormat은 pattern에 따른 날짜 포맷 방식

 

 

그런다음 Entity class에 extends 해주면 적용됩니다.

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.*;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;

@Builder
@Getter
@Setter
@RequiredArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "user")
public class User extends BaseTimeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long autoId;
    
    @Column(unique = true, nullable = false, length = 100)
    private String email;
    
    @Column(nullable = false, length = 100)
    private String name;
}

그후 main 메소드가 있는 클래스에 EnableJpaAuditing 어노테이션을 추가하시면 잘 작동할 것입니다.

 

User 테이블

 

admin이라는 유저를 추가했을 때

이상입니다.