[Auditing] 엔티티에 등록일, 수정일, 등록자, 수정자 자동 적용하기 (1024)
오류 발생 경위
상품 등록 코드를 입력했다. 기댓값과 실제 Hibernate가 실행한 문장이 달랐다.
기댓값은 reg_time, update_time, created_by, modified_by, item_detail, item_name, item_sell_status, price, stock_number, item_id 였는데 다르다!
해결 방법
Item 엔티티를 만들 때에는 등록시간, 수정시간, 등록자, 수정자를 자동으로 엔티티에 추가해주는 Auditing을 사용하지 않았기 때문이었다.
Item과 ItemDto의 regTime과 updateTime 변수를 삭제하고, Controller에서도 해당 내용의 코드 itemDto.setRegTime(LocalDateTime.now()); 를 삭제했다.
그 후 Item 엔티티도 ItemImg처럼 BaseEntity를 상속하도록 public class Item extends BaseEntity {...} 로 코드를 수정한다.
BaseEntity의 코드는 다음과 같다. 혹시 구현하지 않았을 경우 파일을 추가한다.
package com.tartbase.entity;
import lombok.Getter;
import org.springframework.data.annotation.CreatedBy;
import org.springframework.data.annotation.LastModifiedBy;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import javax.persistence.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
@EntityListeners(value = {AuditingEntityListener.class})
@MappedSuperclass
@Getter
public abstract class BaseEntity extends BaseTimeEntity{
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedBy
private String modifiedBy;
}
아래는 BaseEntity를 상속한 ItemImg 엔티티의 상품 insert문이다. 각각 생성일, 수정일, 등록자, 수정자에 해당하는 reg_time, update_time, created_by, modified_by 모두 기댓값대로 정상 출력된 것을 볼 수 있다.
엔티티 항목이 변경되었으므로 수정 후 첫 실행시 application.properties의 ddl-auto 항목을 아래와 같이 create로 수정 후 실행한다.
(validate로 실행시 새로 추가된 create_by 항목을 찾을 수 없다는 오류가 발생한다)
spring.jpa.hibernate.ddl-auto=create
결과
회원가입 - 상품 등록을 실행 후 Hibernate가 수행한 insert문을 확인하면 다음과 같다. 기댓값대로 출력되었다.
application.properties의 ddl-auto 항목을 수정하지 않으면 실행시마다 초기화되므로, 다시 validate로 변경해둔다.
spring.jpa.hibernate.ddl-auto=validate