Spring/Spring Boot

[Spring] JPA Auditting 과 TimeStamp Class (createAt, UpdateAt 자동 기록)

민돌v 2021. 11. 22. 17:30

Spring이든 뭐든 프로젝트를 하다보면, 테이블의 생성기간과, 수정시간이 필요할 때가 있다.

오늘은 이 테이블에 생성, 수정시간을 기록할 수 있는 컬럼을 효율적으로 작성하는 법에 대해 공부해보자

 

단순하게 시간을 기록하는 컬럼을 각 테이블(Domain)에 추가해 줘도 되지만, 이렇게 하면 코드의 중복이 생긴다.

 

그렇다면, JAVA를 JAVA스럽게 사용하기위해서, 상속을 생각해보자

 

추상 클래스를 만들고 그 안에 멤버변수를 필요한 테이블에 컬럼을 받을 수 있지않을까?????

 

SPring에서는 이러한 기능을 JPA Auditing 이라고 한다!!@

 


 

JPA Auditing 이란


 Auddit  이란 = 감시하다, 감사하다    ---------  >  즉, 나는 계속해소 탐지하다로 이해를 하려한다.

 

Java에서 ORM 기술인 JPA를 사용하여 도메인을 관계형 데이터 베이스 테이블에 매핑할 때 공통적으로 도메인들이 가지고있는 필도나 컬럼들이 존재하고, 대표적으로는 생성일자, 수정일자, 식별자 같은 컬럼이 존재합니다.

JPA에서는 Audit이란, Spring Data JPA에서 시간에 대해서 자동으로 값을 넣어주는 기능이 존재합니다.

 

 Audit 의 기능

Audit 은 주로 DB 값이 변경했을 때 누가 값을 변경했고,, 언제 변경했는지 감시(Audit)하는 용도로 사용됩니다.

Spring JPA는 @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 와 같은 어노테이션을 제공합니다.

 

 

다시말해 JPA Auditing 이란,
Spring 에서 제공하는 JPA에서, DB 값이 변경되는 걸 감지하는 기능입니다.

 


 

JPA Auditing 사용하기


1. Project에 JPA Auditing 쓴다고 알려주기

먼저 Spring Project에 JPA Audit을 사용한다고 알려주어야합니다. (일종의 import)

 

@EnableJpaAuditing

  • - JPA Auditing을 활성화 하기 위한 어노테이션
@SpringBootApplication
@EnableJpaAuditing
public class Week8SpringApplication {

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

}

- 최 상단 RootClass에 @EnableJpaAuditing을 추가함으로써 Audit 기능을 사용할 수 있습니다.

 


 

2. 공통적으로 들어가는 부모클래스 만들기

여기서는 일정의 중복 데이터를 명시하는 TimeStamp.class를 만듭니다. 

추상화 클래스로써, Entity가 아닙니다.

 

@MappedSuperclass

  • - 부모 클래스임을 명시하며 상속받는 클래스에서 멤버변수가 컬럼이 되도록 합니다.
  • - 단순히 매핑정보를 상속할 목적으로만 사용됩니다.

 

@EntityListeners

  • - spring 의 data-jpa 사용시 데이터 변경시 알림을 받는 방법이다.
  • -@EntityListeners(class_name.class)  로 설정하면, 설정된 도메인의 값이 변경되었을 때를 체크한다.
  • @EntityListeners(AuditingEntityListener.class)는 깂ㅇ; 변경되었을 때 자동으로 기록합니다.
@Setter
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class Timestamped {
    @CreatedDate
    private LocalDateTime createAt;

    @LastModifiedDate
    private LocalDateTime modifiedAt;

}

 

@MappedSuperclass JPA Entity 클래스들이 해당 추상 클래스를 상속할 경우 createDate, modifiedDate를 컬럼으로 인식
@EntityListeners(AuditingEntityListener.class 해당 클래스에 Auditing 기능을 포함
@CreatedDate Entity가 생성되어 저장될 때 시간이 자동 저장
@LastModifiedDate 조회한 Entity의 값을 변경할 때 시간이 자동 저장

 

 

 

요롷게 중복으로 들어가는 값을 추상클래스로 만들어서 자식 클래스에 상속만 받으면

@MappedSuperClass로 인해 자동으로 컬럼이 된다!! 끝@

@Entity
@NoArgsConstructor
@Getter
@Setter
public class Article extends Timestamped {

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

    @Column
    private String title;

    @Column
    private String content;

    public Article(ArticleRequestDto articleRequestDto){
        this.title = articleRequestDto.getTitle();
        this.content=articleRequestDto.getContent();
    }

}

 

 

 

 

참조

https://velog.io/@conatuseus/2019-12-06-2212-%EC%9E%91%EC%84%B1%EB%90%A8-1sk3u75zo9

https://umanking.github.io/2019/04/12/jpa-audit/

https://webcoding-start.tistory.com/53

https://erim1005.tistory.com/entry/%EB%8D%B0%EC%9D%B4%ED%84%B0-%EB%B3%80%EA%B2%BD-%EC%95%8C%EB%A6%BC-EntityListeners - EntityLeasner