Spring 19. JPA Auditing

김창민·2024년 8월 16일

BE

목록 보기
40/50

Auditing : 감시, 감사하다

Timestamped

시간에 대해서 자동으로 값을 넣어주는 기능인 JPA Auditing을 제공한다.

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

    @CreatedDate
    @Column(updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Column
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime modifiedAt;
}
  • @MappedSuperclass 어노테이션
    • Entity클래스들이 해당 추상 클래스를 상속하면 createdAt, modifiedAt 처럼 추상 클래스에 선언한 멤버변수를 컬럼으로 인식할 수 있습니다.
    • 즉, DB에 createdAt, modifiedAt이걸 생성을 안했더라도 컬럼으로 인식이 된다.
  • @EntityListeners(AuditingEntityListener.class)
    • 이 어노테이션을 통해서 Auditing기능을 포함한다.
  • @CreatedDate
    • Entity 객체 생성 시간이다.
    • updatable =false 옵션을 통해서 갱신을 막아야지 생성 시간이 고정된다.
  • @LastModifiedDate
    • Entity 객체 수정 시간이다.
  • @Temporal
    • 날짜 타입 매핑시 사용한다.
      • DATE : ex) 2023-01-01
      • TIME : ex) 20:21:14
      • TIMESTAMP : ex) 2023-01-01 20:22:38.771000
  • Timestamped
    package com.sparta.memo.entity;
    
    import jakarta.persistence.*;
    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;
    
    @Getter
    @MappedSuperclass
    @EntityListeners(AuditingEntityListener.class)
    public abstract class Timestamped {
    
    	@CreatedDate
    	@Column(updatable = false)
    	@Temporal(TemporalType.TIMESTAMP)
    	private LocalDateTime createdAt;
    
    	@LastModifiedDate
    	@Column
    	@Temporal(TemporalType.TIMESTAMP)
    	private LocalDateTime modifiedAt;
    }

적용

  • Auditing을 사용하기 위해선 @SpringBootApplication 이 있는 class에 @EnableJpaAuditing 어노테이션을 추가해야한다.
    • JPA Auditing 기능을 사용하겠다는 정보를 전달해주기 위해 @EnableJpaAuditing 을 추가해야한다.
  • 위에서 구현한 Timestamped는 추상 클래스이므로 구현체를 만들어야 하는데, 기존에 사용하던 Entity 객체에다 상속하면 된다.
    • memo
      package com.sparta.memo.entity;
      
      import com.sparta.memo.dto.MemoRequestDto;
      import jakarta.persistence.*;
      import lombok.Getter;
      import lombok.NoArgsConstructor;
      import lombok.Setter;
      
      @Entity // JPA가 관리할 수 있는 Entity 클래스 지정
      @Getter
      @Setter
      @Table(name = "memo") // 매핑할 테이블의 이름을 지정
      @NoArgsConstructor
      public class Memo extends Timestamped{
      
          @Id
          @GeneratedValue(strategy = GenerationType.IDENTITY)
          private Long id;
          @Column(name = "username", nullable = false)
          private String username;
          @Column(name = "contents", nullable = false, length = 500)
          private String contents;
      
          public Memo(MemoRequestDto requestDto) {
              this.username = requestDto.getUsername();
              this.contents = requestDto.getContents();
          }
      
          public void update(MemoRequestDto requestDto) {
              this.username = requestDto.getUsername();
              this.contents = requestDto.getContents();
          }
      }
      • 상속이기 때문에 updateAt, modifiedAt을 사용할 수 있다.
profile
일일 회고 : https://rlackdals981010.github.io/

0개의 댓글