JPA

@CreatedBy, @ModifiedBy 사용하기

쿠카이든 2022. 6. 21. 18:01
728x90
BaseEntity 생성하기

Auditing이 필요한 Entity에서 상속받을 BaseEntity를 생성합니다.

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {

    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime modifiedDate;

    @CreatedBy
    @Column(updatable = false)
    private String createdBy;

    @LastModifiedBy
    private String modifiedBy;

}

@MappedSuperclass (javax.persistence)

Entity에서 Table에 대한 공통 매핑 정보가 필요할 때 부모 클래스에 정의하고 상속받아 해당 필드를 사용하여 중복을 제거

 

@EntityListeners  (javax.persistence)

Entity를 DB에 적용하기 이전, 이후에 커스텀 콜백을 요청할 수 있는 어노테이션

 

Class AuditingEntityListener (org.springframework.data.jpa)

Entity 영속성 및 업데이트에 대한 Auditing 정보를 캡처하는 JPA Entity Listener

 

@CreatedDate (org.springframework.data)

데이터 생성 날짜 자동 저장 어노테이션

 

@LastModifiedDate (org.springframework.data)

데이터 수정 날짜 자동 저장 어노테이션

 

@CreatedBy (org.springframework.data)

데이터 생성자 자동 저장 어노테이션

 

@LastModifiedBy (org.springframework.data)

데이터 수정자 자동 저장 어노테이션

 

Entity에 적용하기

id와 name을 가지고 있는 간단한 User Entity에 BaseEntity를 상속받습니다.

@Getter
@Entity
@NoArgsConstructor(access = PROTECTED)
public class User extends BaseEntity {

    @Id
    @GeneratedValue
    @Column(name = "user_id")
    private Long id;

    private String name;

    public User(String name) {
        this.name = name;
    }
    
    public void changeName(String name) {
        this.name = name;
    }

}

 

@CreatedBy, @ModifiedBy 사용하기

org.springframework.data.domain.AuditorAware를 스프링 빈으로 등록해야 합니다.

public interface AuditorAware<T> {

	/**
	 * Returns the current auditor of the application.
	 *
	 * @return the current auditor.
	 */
	Optional<T> getCurrentAuditor();
}

AuditorAware<T> 인터페이스는 Optional<T>를 반환하는 method가 하나 있기 때문에 아래 코드처럼 람다로 AuditorAware<T>를 구현한 객체를 반환할 수 있습니다.

@Bean
public AuditorAware<String> auditorProvider() {
  // 람다를 이용
  return () -> Optional.of(UUID.randomUUID().toString());

  // 익명 클래스를 이용
  return new AuditorAware<String>() {
    @Override
      public Optional<String> getCurrentAuditor() {
      	return Optional.of(UUID.randomUUID().toString());
    }
  };
}

 

JUnit으로 테스트해보기

코드는 위와 동일합니다.

 

UUID의 값이 created_by와 modified_by 컬럼에 자동으로 insert 되었습니다.

 

random값으로 지정했기 때문에 userA가 userB로 바뀌면서 modified_by의 값도 변경되었습니다. 

 

참고 : https://web-km.tistory.com/42

728x90