JPA Auditing 사용법

마라탕천재 ㅣ 2024. 8. 22. 12:26

1. JPA Auditing이란?

JPA Auditing은 엔티티의 생성, 수정, 삭제 등의 이벤트를 자동으로 추적하고 기록하는 기능이다. 주로 데이터의 생성 시간, 수정 시간, 생성자, 수정자 등의 정보를 자동으로 관리하는 데 사용된다.

 

 

2. JPA Auditing의 특징

  1. 자동 시간 기록: 엔티티가 생성되거나 수정될 때 자동으로 시간을 기록한다.
  2. 사용자 정보 추적: 현재 로그인한 사용자 정보를 자동으로 엔티티에 기록할 수 있다.
  3. 편리한 구현: 어노테이션을 사용하여 쉽게 구현할 수 있다.
  4. 일관성 유지: 모든 엔티티에 대해 일관된 방식으로 감사 정보를 관리할 수 있다.

 

 

3. JPA Auditing 구현 방법

1. 구현할 칼럼 클래스 생성

@Getter
@MappedSuperclass
// JPA 어노테이션으로, 이 클래스를 상속받는 엔티티 클래스들에게 이 클래스의 필드를 칼럼으로 추가함.
// 이 클래스 자체는 테이블로 매핑되지 않는다.
@EntityListeners(AuditingEntityListener.class)
// JPA 엔티티에 이벤트 리스너를 추가 AuditingEntityListener는 생성일, 수정일 등을 자동으로 관리함.

public abstract class Timestamped {

    @CreatedDate
    // 엔티티가 생성되어 저장될 때 시간이 자동으로 저장됨.
    @Column(updatable = false)
    // 이 필드는 데이터베이스 칼럼으로 매핑되며, 한 번 저장된 후에는 갱신되지 않음.
    @Temporal(TemporalType.TIMESTAMP)
    // 날짜 타입을 매핑할 때 사용함. TIMESTAMP는 날짜와 시간을 모두 포함함.
    private LocalDateTime createdAt;


    @LastModifiedDate
    // 엔티티가 수정될 때 시간이 자동으로 저장됨.
    @Column
    // 이 필드를 데이터베이스 칼럼으로 매핑함.
    @Temporal(TemporalType.TIMESTAMP)
    // 날짜 타입을 매핑할 때 사용함. TIMESTAMP는 날짜와 시간을 모두 포함함.
    private LocalDateTime modifiedAt;
}

 

2. 엔터티(테이블)에 상속

@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();
    }
}

 

3. 메인 애플리케이션 클래스에 @EnableJpaAuditing 추가

@EnableJpaAuditing // 추가
@SpringBootApplication
public class MemoApplication {

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

}