[JPA] JPA Auditing

6720·2023년 12월 12일
0

이거 모르겠어요

목록 보기
34/38
post-custom-banner

JPA Auditing

Audit: 심사, 감사

JPA Auditing은 엔티티가 생성되고, 변경되는 그 시점을 감지하여 생성시각, 수정시각, 생성한 사람, 수정한 사람을 기록할 수 있음.

사용법

@Getter  
@MappedSuperclass  
@EntityListeners(AuditingEntityListener.class)  
public abstract class TimeEntity {  
    @CreatedDate  
    @Column(updatable = false)  
    private LocalDateTime createdDate;  
  
    @LastModifiedDate  
    private LocalDateTime updatedDate;  
}

@EnableJpaAuditing

@Inherited  
@Documented  
@Target(ElementType.TYPE)  
@Retention(RetentionPolicy.RUNTIME)  
@Import(JpaAuditingRegistrar.class)  
public @interface EnableJpaAuditing {  
  
   /**  
    * Configures the {@link AuditorAware} bean to be used to lookup the current principal.  
    *    * @return  
    */  
   String auditorAwareRef() default "";  
  
   /**  
    * Configures whether the creation and modification dates are set. Defaults to {@literal true}.  
    *    * @return  
    */  
   boolean setDates() default true;  
  
   /**  
    * Configures whether the entity shall be marked as modified on creation. Defaults to {@literal true}.  
    *    * @return  
    */  
   boolean modifyOnCreate() default true;  
  
   /**  
    * Configures a {@link DateTimeProvider} bean name that allows customizing the {@link java.time.temporal.TemporalAccessor} to be  
    * used for setting creation and modification dates.    *    * @return  
    */  
   String dateTimeProviderRef() default "";  
}

Annotation to enable auditing in JPA via annotation configuration.

어노테이션을 통해 JPA에서 감사를 활성화하는 주석임.
-> 감사 활성화

해당 어노테이션은 메인 Application에 작성해야 함.

@EntityListeners(AuditingEntityListener.class)

@Target({TYPE})   
@Retention(RUNTIME)  
public @interface EntityListeners {  
  
    /** The callback listener classes */  
    Class[] value();  
}

Specifies the callback listener classes to be used for an entity or mapped superclass. This annotation may be applied to an entity class or mapped superclass.

엔티티 또는 매핑된 슈퍼클래스에 사용될 콜백 리스너 클래스를 지정함.
이 어노테이션은 엔티티 클래스 또는 매핑된 슈퍼클래스에 적용될 수 있음.
-> 콜백 리스너 역할

@CreatedDate와 @LastModifiedDate

  • @CreatedDate: Declares a field as the one representing the date the entity containing the field was created.
    • 필드를 포함하는 엔티티가 작성된 날짜를 나타내는 필드로 선언함.
    • @Column(updatable = false)를 같이 작성하여 수정됨을 막을 수 있음.
  • @LastModifiedDate: Declares a field as the one representing the date the entity containing the field was recently modified.
    • 필드를 포함하는 엔티티가 최근에 수정된 날짜를 나타내는 필드로 선언함.

+) 그 외에도 생성자와 수정자를 감사하는 @CreatedBy와 @LastModifiedBy가 있지만 별도의 구현체를 요구하며, 이 과정에서 Spring Security의 JWT 토큰이 필요해 질 수 있다고 함.

@MappedSuperclass

Designates a class whose mapping information is applied to the entities that inherit from it. A mapped superclass has no separate table defined for it.
A class designated with the MappedSuperclass annotation can be mapped in the same way as an entity except that the mappings will apply only to its subclasses since no table exists for the mapped superclass itself. When applied to the subclasses the inherited mappings will apply in the context of the subclass tables. Mapping information may be overridden in such subclasses by using the AttributeOverride and AssociationOverride annotations or corresponding XML elements.

매핑 정보를 상속받는 엔티티에 적용하는 클래스를 지정함. 매핑된 슈퍼클래스는 그것에 대해 정의된 별도의 테이블이 없음.
매핑된 슈퍼클래스 자체에 대한 테이블이 없으므로 매핑이 그 서브클래스에만 적용된다는 점을 제외하고 매핑된 슈퍼클래스 주석으로 지정된 클래스는 엔티티와 동일한 방법으로 매핑될 수 있음. 서브클래스에 적용될 때 상속된 매핑은 서브클래스 테이블의 컨텍스트에서 적용될 것임. 이러한 서브클래스에서는 매핑 정보가 AttributeOverride 및 AssociationOverride 주석 또는 대응하는 XML 요소를 사용하여 덮어쓸 수 있음.

객체의 입장에서 공통 매핑 정보가 필요할 때 사용.
ex) TimeEntity는 여러 엔티티에서 필요로 함. -> 공통 매핑 정보
다음처럼 공통 매핑 정보가 필요할 때, 부모 클래스에서 선언하고 속성만 상속 받아서 사용하고 싶을 때 사용함.

DB에서는 임베디드 타입을 사용하는 것처럼 각자 테이블에 공통 매핑 정보가 필드로 들어감.

참고 자료

https://webcoding-start.tistory.com/53
https://hudi.blog/spring-data-jpa-auditing-create-update-date/
https://velog.io/@wonizizi99/SpringData-JPA-Auditing
https://ict-nroo.tistory.com/129

profile
뭐라도 하자
post-custom-banner

0개의 댓글