Home [JPA] Auditing 기능
Post
Cancel

[JPA] Auditing 기능

Spring Data Jpa - Auditing 기능

  • 엔티티가 저장 또는 수정될 때 자동으로 등록일, 수정일, 등록자, 수정자를 입력
  • 엔티티의 생성과 수정을 감시하고 있는 것
  • 공통 멤버 변수들을 추상 클래스로 만들고, 해당 추상 클래스를 상속받는 형태로 엔티티 리팩토링

구현

  • 현재 로그인한 사용자의 정보를 등록자와 수정자로 지정하기 위해서 AuditorAware 인터페이스를 구현한 클래스 생성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    public class AuditorAwareImpl implements AuditorAware<String> {
        @Override
        public Optional<String> getCurrentAuditor() {
            Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
            String userId = "";
            if(authentication != null){
                userId = authentication.getName();
            }
            return Optional.of(userId);
        }
    }
    
  • Auditing 기능을 사용하기 위한 Config 파일 생성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    @Configuration
    @EnableJpaAuditing
    public class AuditConfig {
      
        @Bean
        public AuditorAware<String> auditorProvider(){
            return new AuditorAwareImpl();
        }
    }
    
    • @EnableJpaAuditing : JPA의 Auditing 기능 활성화
    • auditorProvider() : 등록자와 수정자를 처리해주는 AuditorAware을 빈으로 등록
  • 등록자, 수정자를 넣지 않는 테이블이 있을 경우 BaseTimeEntity만 상속 받을 수 있도록 클래스 생성

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    @EntityListeners(value = {AuditingEntityListener.class})
    @MappedSuperclass
    @Getter @Setter
    public abstract class BaseTimeEntity {
      
        @CreatedDate
        @Column(updatable = false)
        private LocalDateTime regTime;
      
        @LastModifiedDate
        private LocalDateTime updateTime;
      
    }
    
    • @EntityListeners(value = {AuditingEntityListener.class}) : Auditing을 적용하기 위해 @EntityListeners 어노테이션 추가
    • @MappedSuperclass : 공통 매핑 정보가 필요할 때 사용하는 어노테이션, 부모 클래스를 상속 받는 자식 클래스에 매핑 정보만 제공
    • @CreatedDate : 엔티티가 생성되어 저장될 때 시간을 자동으로 저장
    • @LastModefiedDate : 엔티티의 값을 변경할 때 시간을 자동으로 저장
  • 등록일, 수정일, 등록자, 수정자를 모두 갖는 엔티티가 상속받을 엔티티

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    @EntityListeners(value = {AuditingEntityListener.class})
    @MappedSuperclass
    @Getter
    public abstract class BaseEntity extends BaseTimeEntity{
      
        @CreatedBy
        @Column(updatable = false)
        private String createdBy;
      
        @LastModifiedBy
        private String modifiedBy;
      
    }
    
  • BaseEntity 클래스 상속

    1
    
    public class Member extends BaseEntity{ ...
    

출처📎

백견불여일타 스프링 부터 쇼핑몰 프로젝트 with JPA

This post is licensed under CC BY 4.0 by the author.