[JPA] Auditing

gyeol·2024년 8월 12일

JPA

목록 보기
10/13
post-thumbnail

Auditing

엔티티에 공통으로 들어가는 멤버 변수들을 추상클래스로 만들고 해당 클래스를 상속받아 엔티티에 공통적인 기능을 수행하도록 하며 누가 언제 생성/마지막 수정을 했는지 자동으로 기록되게 할 수 있다.

자동 기록되는 정보

  • 생성 시점 (Created Date)
  • 수정 시점 (Last Modified Date)
  • 생성자 (Created By)
  • 수정자 (Last Modified By)

필요성

  • 여러 엔티티에 공통된 멤버 변수 존재 시 하나의 추상클래스로 통합해 구현 가능
  • 등록 시점, 수정 시점, 생성자, 수정자 등의 엔티티 상태 변경에 대한 정보 기록 가능
  • 기록을 바탕으로 버그, 업데이트 변경 대상 조회 등 여러 상황에서 사용 가능

설정 방법

  1. 메인 애플리케이션 위에 @EnableJpaAuditing 애노테이션 추가
@Configuration
@EnableJpaAuditing
public class JpaConfig {
}
  1. 엔티티 클래스 위에 @EntityListeners(AuditingEntityListener.class) 애노테이션 추가
@Entity
@EntityListeners(AuditingEntityListener.class)
@Getter @Setter
public class yourEntity{
	@CreatedDate //해당 엔티티 처음 생성시 날짜 자동 기록
    private LocalDateTime createdAt;

    @CreatedBy //해당 엔티티가 처음 생성시 생성자의 정보 자동 기록
    @ManyToOne
    private User createdBy;

    @LastModifiedDate //해당 엔티티가 마지막으로 수정될 때 날짜 자동 기록
    private LocalDateTime modifiedAt;

    @LastModifiedBy //해당 엔티티가 마지막으로 수정될 대 수정자 정보 자동 기록
    @ManyToOne
    private User modifiedBy;
}
  1. AuditorAware 구현체 만들기
    생성 시간과 업데이트 시간은 구현체 없이 해당 애노테이션을 지정하는 것 만으로 끝나지만 생성자와 수정자는 별도의 구현체가 필요하다. 이 과정에서 Spring Security 설정이 필수이다.
@Component
public class AuditorAwareImpl implements AuditorAware<String> {

    @Override
    public Optional<String> getCurrentAuditor() {
        // 여기서 현재 인증된 사용자를 반환
        // 예: Spring Security를 사용하는 경우 SecurityContextHolder로부터 인증 정보 추출
        return Optional.of("system"); // 예시로 시스템 계정 사용
    }
}

AuditorAwareImpl 클래스는 현재 인증된 사용자 정보를 반환하는 역할을 한다. SecurityContextHolder 등을 사용해 실제 인증 정보를 추출할 수 있다.

예시

@Service
public class YourEntityService {

    @Autowired
    private YourEntityRepository yourEntityRepository;

    public YourEntity createEntity(YourEntity yourEntity) {
        return yourEntityRepository.save(yourEntity);
    }

    public YourEntity updateEntity(YourEntity yourEntity) {
        return yourEntityRepository.save(yourEntity);
    }
}

위의 예시코드 같이 엔티티를 저장하거나 업데이트하면 createdDate, lastModifeidDate, createBy, lastModifiedBy 필드가 자동으로 채워진다.

주의 사항

  • @EnableJpaAuditing은 하나의 Spring Configuration 클래스에만 적용되야함
  • AuditorAware의 구현체는 @Component로 등록되어야 함
  • 엔티티 필드에 @Column(updatable = false) 로 지정하면 해당 필드는 엔티티의 업데이트 시 수정되지 않음
profile
공부 기록 공간 '◡'

0개의 댓글