Spring Data JPA에서의 Auditing

호돌·2022년 2월 8일
0

BackEnd

목록 보기
25/25

Auditing


서비스를 운영할 때 사용자의 기본적인 로그를 DB에 남겨야 할 때가 있다.
예를들면, 마지막 로그인 시간이라던지 엔티티 생성 시간, 변경된 시간과 변경한 사람의 이름등이 있을 것이다.

🤔Auditing는 언제 쓸까?


예를 들어 아래와 같은 엔티티가 존재한다고 해보자.

public class User {
  private Long id;
  private String name;
  private String address;
}

public class OrderItem {
  private Long id;
  private User userId;
  private Item itemId;
}

public class Item {
  private Long id;
  private String name;
  private String description;
}

여기에 각각의 생성 시간과 사람을 추가해보자

public class User {
  private Long id;
  private String name;
  private String address;
  private LocalDateTime createdAt;
  private String createdBy;
}

public class OrderItem {
  private Long id;
  private User userId;
  private Item itemId;
  private LocalDateTime createdAt;
  private String createdBy;
}

public class Item {
  private Long id;
  private String name;
  private String description;
  private LocalDateTime createdAt;
  private String createdBy;
}

이럴 경우 모든 엔티티가 LocalDateTime createdAt, String createdBy 에 대한 연산을 수행해야 한다.

만약, 여기서 모든 엔티티가 동일한 연산을 수행해야 한다면 연산처리를 하는 기본 엔티티를 만들고 모든 데이터 요청시에 엔티티가 업데이트 되게하면 되지 않을까?

이때 생성일/수정일/생성자 등을 자동화할 때 사용하는게 바로 JPA Auditing 이다.

EnableJpaAuditing 사용하기


Sprint Data JPA 에서 JPA를 사용하기 위해서는 SpringBoot 설정 클래스에 @EnableJpaAuditing을 적어줘야한다.

보통 Springboot를 실행시키는 클래스 상단에 많이 사용하고있다.

@EnableJpaAuditing
@SpringBootApplication
public class DatajpaApplication {
    public static void main(String[] args) {
        SpringApplication.run(DatajpaApplication.class, args);
    }

}

그리고 아래와 같은 Auditing을 할 필드를 갖는 엔티티를 생성할 수 있다.

@EntityListeners(AuditingEntityListener.class) // 1
@MappedSuperClass // 2
@Getter
public BaseEntity {
  @CreatedDate // 3
  private LocalDateTime createdDate;
}

이렇게 작성하면 해당 엔티티 클래스가 JPA 이벤트가 발생한다면 Auditing을 수행하여 값을 업데이트 한다.

1. @EntitiyListeners(AuditingEntityListener.class)


@EntitiyListners는 엔티티를 DB에 적용하기 전, 이후에 커스텀 콜백을 요청할 수 있는 어노테이션이다.

@EntitiyListeners의 인자로 커스텀 콜백을 요청할 클래스를 지정해주면 되는데, Auditing을 수행할 때는 JPA에서 제공하는 AuditingEntityListener.class를 인자로 넘기면 된다.

그럼 위에서 보는바와 같이 @PrePersist 어노테이션으로 JPA의 Auditing 기능을 Spring Data JPA가 사용하게 되는 것이다.

2. @MappedSuperClass


@MappedSuperClass은 엔티티의 공통 매핑 정보가 필요할 때 사용한다.

즉, 부모 클래스(엔티티)에 필드를 선언하고 단순히 속성만 받아서 사용하고 싶을 때 사용하는 방법이다.

우리는 BaseEntitiy를 생성하고 Auditing 기능이 필요한 엔티티 클래스에서 사용할 것이기 때문에 @MappedSuperClass 어노테이션을 사용하는 것이다.

3. @CreateData


@CreateDate 어노테이션은 Spring Data JPA의 고유 기능은 아니고 Spring Data에 있는 어노테이션으로 Spring Data에서 추상화 해놓은 것이다.

Declares a field as the one representing the date the entity containing the field was created.
번역) 필드를 포함하는 엔티티가 작성된 날짜를 나타내는 필드라고 선언한다.

javadoc에 나온 내용을 보면 우리가 해당 필드를 선언하면 엔티티가 작성된 날짜, created된 날짜를 사용할 수 있게 된다는 것이다.

비슷한 어노테이션

  • CreatedDate
    • 해당 엔티티가 생성될 때, 생성하는 시각을 자동으로 삽입해준다.
  • CreatedBy
    • 해당 엔티티가 생성될 때, 생성하는 사람이 누구인지 자동으로 삽입해준다. 생성하는 주체를 지정하기 위해서 AuditorAware<T> 를 지정해야 한다. 이는 Spring Security 와 함께 다뤄야 하는 내용이므로 추후 업로드 예정
  • LastModifiedDate
    • 해당 엔티티가 수정될 때, 수정하는 시각을 자동으로 삽입해준다.
  • LastModifiedBy
    • 해당 엔티티가 수정될 때, 수정하는 주체가 누구인지 자동으로 삽입해준다. 생성하는 주체를 지정하기 위해서 AuditorAware<T> 를 지정해야 한다.

📝참고


https://wonit.tistory.com/484?category=853673

profile
저도 모르는데요?, 내가 몰라서 적는 글

0개의 댓글