JeongJin's Blog

08. Spring Data JPA 활용 (4) 본문

Book Study/스프링 부트 핵심 가이드

08. Spring Data JPA 활용 (4)

정진킴 2023. 11. 8. 16:29

8.7 [ 한걸음 더 ] JPA Auditing 적용

  • JPA에서 'Audit'이란 '감시하다' 라는 뜻으로, 각 데이터마다 '누가', '언제' 데이터를 생성했고 변경했는지 감시한다는 의미로 사용
  • 공통적으로 들어가는 '생성 일자', '변경 일자' 경우 대표적으로 많이 사용되는 필드
    • 생성 주체
    • 생성 일자
    • 변경 주체
    • 변경 일자
  • Spring Data JPA 에서는 이러한 값을 자동으로 넣어주는 기능을 제공한다.

8.7.1 JPA Auditing 기능 활성화

  • main() 메서드가 있는 클래스에 @EnableJpaAuditing 어노테이션을 추가하면 된다.
@SpringBootApplication
@EnableJpaAuditing
public class AdvancedJpaApplication {
	public static void main(String[] args) {
    	SpringApplication.run(JpaApplication.class, args);
    }
}
  • bean에 등록하는 방법
    • config package 생성 후 클래스 생성하여 bean을 생성한다.
    • controller test 시 에러를 방지하기 위해서는 main 메서드에 선언하는것보다 bean으로 등록하여 처리하면 @WebMvcTest 시 에러 발생을 해결.
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfiguration() {
}

8.7.2 BaseEntity 만들기

  • 코드의 중복을 없애기 위해서는 각 엔티티에 공통으로 들어가게 되는 컬럼(필드)을 하나의 클래스로 빼는 작업을 수행하는데 BaseEntity 클래스를 생성한다.
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@MappedSuperclass
@Builder(builderMethodName = "doesNotUseThisBuilder")
@EntityListeners(AuditingEntitiyListener.class)
public class BaseEntity {
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt;
    
    @LastModifiedDate
    private LocalDateTime updatedAt;
}
  • @MappedSuperclass: JPA의 엔티티 클래스가 상속받을 경우 자식 클래스에 매핑 정보를 전달한다.
  • @EntityListeners: 엔티티를 데이터베이스에 적용하기 전후로 콜백을 요청할 수 있게 한다.
    • AuditingEntityListener: 엔티티의 Auditing 정보를 주입하는 JPA 엔티티 리스너 클래스
  • @CreateDate: 데이터 생성 날짜를 자동으로 주입한다.
  • @LastModifiedDate: 데이터 수정 날짜를 자동으로 주입한다.
  • @Builder: Builder 패턴을 적용
    • builderMethodName: 다른 이름으로 네이밍을 할 수 있도록 제공하는 속성
...
public class Product extends BaseEntity {
}
  • 해당 클래스에서 BaseEntity를 상속받아서 사용한다.
  • 매번 LocalDateTime.now() 메서드를 사용해 시간을 주입하지 않아도 자동으로 값이 생성된다.

Tips

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