본문 바로가기
그룹스터디

JPA Auditing

by 민초닷컴 2022. 12. 30.

JPA Auditing

ORM(Object Relationship Mapping) 기술인 JPA는 Application의 Entity와 DB의 Table을 매핑하여 사용한다. DB는 해당 데이터를 누가, 언제 생성 또는 수정했는지 기록하는 것이 꽤나 중요합니다. 이 데이터들은 많은 테이블에서 사용되기 때문에 Entity에도 필드로 중복되어 들어가고, 해당 Entity가 생성 또는 수정될 때마다 개발자가 신경 써서 데이터를 입력해줘야 하는 번거로움 발생 이때 사용하는 기술이 Spring Data에서 제공하는 Auditing입니다. Audit는 감독하고 검사하다는 뜻으로, 해당 데이터를 보고 있다가 생성 또는 수정이 발생하면 자동으로 값을 넣어주는 편리한 기능입니다.

1. Auditing 활성화 하기

@EnableJpaAuditing
@SpringBootApplication
public class JTalkApplication {

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

}
  • SpringBootApplication에 @EnableJpaAuditing 어노테이션 추가

제공하는 어노테이션 항목

  • @CreatedDate
  • @LastModifiedDate
  • @CreatedBy
  • @LastModifiedBy </aside>

2. BaseEntity 생성

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;

    @CreatedBy
    @Column(updatable = false)
    private String createdBy;

    @LastModifiedBy
    private String modifiedBy;

}

@MappedSuperclass : Entity에서 Table에 대한 공통 매핑 정보가 필요할 때 부모클래스에 정의하고 상속받아 필드를 사용하여 중복을 제거 즉, 해당 클래스가 상속될 속성을 포함하고 있는 SuperClass 라는 걸 알리는 마커 어노테이션

@EntityListner : Entity가 DB로 load/persist 되기 전 후에 커스텀 로직을 선언하는 인터페이스

@AuditingEntityListener : 해당 엔티티에 선언된 @CreatedDate, @LastModifiedDate, @CreatedBy, @LastModifiedBy 들을 탐색해 엔티티 변경시 해당 값을 자동으로 업데이트

3. Entity에 적용하기

@Getter
@Entity
@NoArgsConstructor(access = PROTECTED)
public class User extends BaseEntity {

    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private Long id;

    private String name;

    public User(String name) {
        this.name = name;
    }
    
    public void changeName(String name) {
        this.name = name;
    }

}

※ @CreatedBy, @ModifiedBy의 경우

AuditorAware()를 빈으로 등록하면 @CreatedBy, @LastModifiedBy가 붙은 필드에 현재 로그인한 사용자의 정보를 주입할 수 있다.

현재 학습 중인 프로젝트의 경우 JpaConfig에서 빈 설정을 하는 것을 확인 할 수 있다.

@EnableJpaAuditing
@Configuration
public class JpaConfig {

    @Bean
    public AuditorAware<String> auditorAware() {
        return () -> Optional.of("uno"); // TODO:스프링 시큐리티로 인증 기능을 붙이게 될 때, 수정하자.
    }
}