JPA Auditing 정리

이창윤·2022년 7월 18일
0

JPA Auditing이란?

JAVA의 ORM기술인 JPA를 사용해서 도메인을 관계형 데이터베이스 테이블에 매핑할 수 있다.

ORM (Object Relational Mapping) : 객체와 관계형 DB의 테이블을 연결한다는 뜻이며 둘이 개념적으로 일치하지 않는 부분을 해결하기 위함

JPA (Java Persistence API) : JAVA ORM 기술에 대한 API 표준 명세, ORM을 사용하기 위한 인터페이스의 모음
JPA의 구현체인 Hibernate를 주로 사용

Auditing은 Audit(감시하다)의 뜻 그대로 Entity를 보고있다가 DB에 저장하거나 업데이트를 하는 경우 생성일자, 생성자, 수정일자, 수정자 등 중요한 메타데이터를 자동으로 데이터베이스에 반영해주는 기능이다.

Auditing 활성화

1. Base Entity 생성

AuditingFields.java

@EntityListners(AuditingEntityListner.class)
@MappedSuperclass
public abstract class AuditingFields {
	
    @CreatedDate
    private LocalDateTime createdAt; // 생성일시

    @CreatedBy 
    private String createdBy; // 생성자

    @LastModifiedDate 
    private LocalDateTime modifiedAt; // 수정일시

    @LastModifiedBy
    private String modifiedBy; // 수정자
}
  • @EntityListners(AuditingEntityListner.class): Entity를 DB에 적용하기 이전과 이후에 커스텀 콜백을 요청할 수 있게 한다.(해당 클래스에 Auditing 기능을 포함시킨다)
  • @MappedSuperclass: Entity에서 공통된 필드를 사용할 때 Base Entity에 정의한 다음 상속받는 형식으로 중복을 줄이기 위해 사용한다.
  • @CreatedDate: Entity 생성 시간 자동 저장
  • @CreatedBy: Entity 생성자 자동 저장
  • @LastModifiedDate: Entity 값 수정한 시간 자동 저장
  • @LastModifiedBy: Entity 수정자 자동 저장

2. Entity 매핑 및 Base Entity 상속

Article.java

@Entity
public class Article extends AuditingFields{
    private Long id;
    
    private String title; // 제목
    private String content; // 본문
    private String hashtag; // 해시태그 
	
    private Article(String title, String content, String hashtag) {
        this.title = title;
        this.content = content;
        this.hashtag = hashtag;
    }

    public static Article of(String title, String content, String hashtag) {
        return new Article(title, content, hashtag);
    }
    ...
}
  • @Entity annotation을 클래스 위에 추가해서 JPA가 해당 클래스를 테이블과 매핑할 수 있게 만들어준다.
  • Base Entity를 상속받도록 extends 선언을 추가한다.

3. @EnableJpaAuditing 선언

SpringBootApplication.java

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

위 코드처럼 메인 메소드가 존재하는 클래스에 선언을 해도 상관없지만 테스트 코드에 영향을 줘서 테스트가 실패할 수 있고 웬만하면 메인 메소드를 건들지 않는 것이 좋다고해서,, 클래스를 따로 분리하는게 좋다.

JpaConfig.java

@EnableJpaAuditing
@Configuration
public class JpaConfig {
	
    @Bean
    public AuditorAware<String> auditorAware() {
        return () -> Optional.of(SecurityContextHolder.getContext().getAuthentication().getName());
        //Spring Security의 Authentication을 가져와서 사용자명 반환
    }
}

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


출처 및 참고

JPA Auditing 기능을 사용해서 생성, 수정 일자 자동화하기
[JPA ] Auditing 기능 살펴보기
JPA Auditing
Spring Data Jpa로 DB에 생성일, 수정일 자동화 하기

0개의 댓글