본문 바로가기
Spring/Spring-detail

JPA Auditing 적용

by YoonJong 2022. 9. 13.
728x90

Auditing 이란, 감시하다 라는 뜻을 가지고 있다.

 

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

엔티티 클래스에는 공통적으로 들어가 있는 필드는 생성일자와 변경일자 같은 것이 있다.

 

반복적으로 넣어주는 일을 줄이기 위해서 Auditing 기능을 사용한다.


@EnableJpaAuditing 추가

@SpringBootApplication
@EnableJpaAuditing
public class AdvancedJpaApplication {

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

 

 

BaseEntity 만들기

- 코드의 중복을 없애기 위해서는 각 엔티티에 중복으로 들어가게 되는 칼럼을 하나의 클래스로 빼서 작업한다.

@Getter
@Setter
@ToString
@MappedSuperclass // JPA의 엔티티 클래스가 상속받을 경우 자식 클래스에게 매핑 정보를 전달
// 엔티티를 데이터베이스에 적용하기 전후로 콜백 요청 가능 , 엔티티의 auditing 정보를 주입
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {

    @CreatedDate // 데이터 생성날짜를 자동으로 주입
    @Column(updatable = false)
    private LocalDateTime cratedAt;

    @LastModifiedDate // 데이터 수정날짜를 자동으로 주입
    private LocalDateTime updatedAt;
}

 

 

Product.class 적용

- 부모클래스로 상속을 받는다.

 

아래 코드처럼 날짜/시간 관련된 객체는 보이지 않으며, 따로 생성한 BaseEntity 클래스만 상속받았다.

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@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;

}

 

테스트 진행 - 결과확인

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

    productRepository.save(product);

    System.out.println(product.getName());
    System.out.println(product.getCratedAt());
}

728x90

댓글