
✅ JPA Auditing 이란?
(사전적 의미) Audit : 감시하다
Spring Data JPA 에서 제공하는 Audit 기능은 DB에서 값이 변경되었을때, '누가/언제' 변경했는지 감사하는 기능.
→ 누가/언제 데이터를 변경했는지 엔티티의 변화를 추적.
✅ Audit 기능을 적용할 수 있는 필드 (애너테이션)
- 생성 시간 필드 (@CreatedDate : 데이터 생성 날짜 자동 저장)
- 수정 시간 필드 (@LastModifiedDate : 데이터 수정 날짜 자동 저장)
- 생성자 ID 필드 (@CreatedBy : 데이터 생성자 자동 저장)
- 수정자 ID 필드 (@LastModifiedBy : 데이터 수정자 자동 저장)
@CreatedDate // 엔티티 생성/ DB 저장 될 때, 생성 시간 자동 저장
private LocalDateTime createdAt;
@LastModifiedDate // 엔티티의 값이 변경될 때, 수정 시간 자동 저장
private LocalDateTime updatedAt;
@CreatedBy // 엔티티를 생성한 유저의 ID 자동 저장.
private Long createdId;
@LastModifiedBy // 엔티티를 수정한 유저의 ID 자동 저장.
priavte Long modifiedId;
✅ Audit 기능 적용 방법
(모든 Entity에 날짜를 적용하는 등) 중복 코드를 제거하기위해 Auditing을 사용 (AOP 처럼 구현)
1. JP A Audit 활성화 ( @EnableJpaAuditing )
@EnableJpaAuditing
: configuration 애너테이션을 통해 JPA 에서 auditing 을 가능하게 하는 애너테이션.
데이터의 변화가 추적된 값들을 필드에 적용하기 위해 사용.
@EnableJpaAuditing // created_at, updated_at 자동 업데이트
@SpringBootApplication
public class SpringBootDeveloperApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootDeveloperApplication.class, args);
}
}
2. Auditable 클래스 생성
모든 엔티티에 Audit 필드를 적용하기 위한 클래스.
[ Auditable 클래스에 적용해야하는 애너테이션 ]
@Getter
@MappedSuperclass : 해당 클래스를 부모 클래스로 정의 (상속받는 Entity에 공통으로 필드 제공).
@EntityListeners : Entity를 DB에 적용 전/후에 커스텀콜백 요청.
* 커스텀콜백 : 특정 이벤트가 발생한 시점에 알림을 수신하는 메서드.
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class Auditable {
@CreatedDate // 엔티티 생성/ DB 저장 될 때, 생성 시간 자동 저장
private LocalDateTime createdAt;
@LastModifiedDate // 엔티티의 값이 변경될 때, 수정 시간 자동 저장
private LocalDateTime updatedAt;
@CreatedBy // 엔티티를 생성한 유저의 ID 자동 저장.
private Long createdId;
@LastModifiedBy // 엔티티를 수정한 유저의 ID 자동 저장.
priavte Long modifiedId;
}
3. Entity 에 적용
@MappedSuperclass가 적용된 클래스를 상속받는 모든 엔티티에
생성시간, 수정시간, 생성자, 수정자 컬럼 자동 생성 및 값 저장.
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Answer extends Auditable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "id", updatable = false)
private Long id;
@Column(name = "title", nullable = false)
private String title;
@Column(name = "content", nullable = false)
private String content;
}
참고자료 :
https://taegyunwoo.github.io/jpa/JPA_AutoCreatedModifiedTime