[Spring] JPA Auditing 적용하기

Miin·2023년 11월 20일
0

Spring

목록 보기
12/17

JPA에서 'Audit'이란 '감시하다'라는 뜻

각 데이터마다 '누가', '언제' 데이터를 생성했고 변경했는지 감시한다는 의미


대표적으로 많이 사용되는 필드
  • 생성 주체
  • 생성 일자
  • 변경 주체
  • 변경 일자

이러한 필드들은 매번 엔티티 생성 또는 변경 때마다 값을 주입해야 하는 번거로움. 이를 해소하기 위해 Spring Data JPA에서 이러한 값을 자동으로 넣어주는 기능 제공.

JPA Auditing 기능 활성화

1. main() 메서드가 있는 클래스에 @EnableJpaAuditing 어노테이션 추가

@SpringBootApplication
@EnableJpaAuditing
public class JpaApplication {

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

}
또는

2. Configuration 클래스 생성

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfiguration {
    
}
  • Configuration 클래스 생성하여 애플리케이션 클래스의 기능과 분리해서 활성화

BaseEntity 만들기

코드의 중복을 없애기 위해 각 엔티티에 공통으로 들어가게 되는 컬럼(필드)을 하나의 클래스로 빼는 작업 수행

@Getter
@Setter
@ToString
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {
    
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt; // 생성 일자
    
    @LastModifiedDate
    private LocalDateTime updatedAt; // 변경 일자
    
}
  • @MappedSuperClass : JPA의 엔티티 클래스가 상속받을 경우 자식 클래스에게 매핑 정보 전달
  • @EntityListeners : 엔티티를 데이터베이스에 적용하기 전후로 콜백을 요청할 수 있게 하는 어노테이션
  • AuditingEntityListener : 엔티티의 Auditing 정보를 주입하는 JPA 엔티티 리스너 클래스
  • @CreatedDate : 데이터 생성 날짜를 자동으로 주입하는 어노테이션
  • @LastModifiedDate : 데이터 수정 날짜를 자동으로 주입하는 어노테이션

위와 같이 BaseEntity를 생성하고 Product 엔티티 클래스에서 공통 컬럼을 제거해서 다음과 같이 코드 수정
@Entity
@Builder
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Table(name = "product")
public class Product extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long number;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private Integer price;

    @Column(nullable = false)
    private Integer stock;

}

@ToString, @EqualAndHashCode 어노테이션에 적용한 callSuper 속성은 부모 클래스의 필드를 포함하는 역할 수행

이렇게 설정하면 매번 LocalDateTime.now() 메서드를 사용해 시간을 주입하지 않아도 자동으로 값이 생성됨


테스트 코드

	@Test
    public void auditingTest() {
        Product product = new Product();
        product.setName("펜");
        product.setPrice(1000);
        product.setStock(100);

        Product savedProduct = productRepository.save(product);

        System.out.println("productName : " + savedProduct.getName());
        System.out.println("createdAt : " + savedProduct.getCreatedAt());
    }
// 출력 결과
productName : 펜
createdAt : 2023-11-20T16:13:13.546600200

Product 엔티티에 생성일자를 입력하지 않았지만 데이터베이스에는 생성일자가 저장되며, 엔티티의 필드를 출력해보면 해당 시간이 출력됨.


JPA Auditing 기능에는 @CreatedBy, @ModifiedBy 어노테이션도 존재.
누가 엔티티를 생성했고 수정했는지 자동으로 값을 주입하는 기능.
이 기능을 사용하려면 AuditorAware를 스프링 빈으로 등록해야 함.




출처 - (책) 스프링 부트 핵심 가이드 / 장정우, 위키북스

profile
컴퓨터공학전공 학부생 Back-end Developer

0개의 댓글