먼저, 메타데이터 컬럼을 포함하는 BaseEntity 클래스에 Spring Data JPA의 감사(auditing) 기능을 적용하기 위해 필요한 애노테이션을 추가합니다.
@CreatedDate: 레코드가 생성된 날짜와 시간을 자동으로 설정합니다.
@CreatedBy: 레코드를 생성한 사용자를 자동으로 설정합니다.
@LastModifiedDate: 레코드가 마지막으로 수정된 날짜와 시간을 자동으로 설정합니다.
@LastModifiedBy: 레코드를 마지막으로 수정한 사용자를 자동으로 설정합니다.
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdAt;
@CreatedBy
@Column(updatable = false)
private String createdBy;
@LastModifiedDate
private LocalDateTime updatedAt;
@LastModifiedBy
private String updatedBy;
// Getters and setters...
}
Spring Data JPA가 createdBy와 updatedBy 필드를 자동으로 채울 수 있도록 AuditAware 인터페이스를 구현하는 클래스를 작성합니다. 이 클래스는 현재 작업 중인 사용자를 반환하는 역할을 합니다.
@Component("auditAwareImpl")
public class AuditAwareImpl implements AuditorAware<String> {
@Override
public Optional<String> getCurrentAuditor() {
// 현재는 하드코딩된 값을 반환하지만, 나중에 Spring Security와 연동해 실제 사용자 정보를 반환하도록 수정 가능
return Optional.of("ACCOUNTS_MS");
}
}
Spring Data JPA의 감사 기능을 활성화하기 위해, 메인 애플리케이션 클래스에 @EnableJpaAuditing 애노테이션을 추가합니다.
@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "auditAwareImpl")
public class AccountsMicroserviceApplication {
public static void main(String[] args) {
SpringApplication.run(AccountsMicroserviceApplication.class, args);
}
}
AccountServiceImpl 클래스에서 수동으로 createdAt, createdBy, updatedAt, updatedBy를 설정하던 코드를 제거합니다. 이제 Spring Data JPA가 이 작업을 자동으로 처리합니다.
// 수동 메타데이터 업데이트 코드 제거
// account.setCreatedAt(LocalDateTime.now());
// account.setCreatedBy("User");
// 고객 업데이트 부분에서도 유사한 코드 제거
코드를 빌드하고, Postman 등의 도구를 사용해 API를 테스트합니다. 레코드를 생성 및 업데이트할 때 createdBy, createdAt, updatedBy, updatedAt 필드가 자동으로 채워지는지 확인합니다.
// 예시: 새로운 계정 생성 후 데이터베이스에서 createdBy와 createdAt이 자동으로 설정되었는지 확인
SELECT createdBy, createdAt FROM accounts;
// 계정 업데이트 후 updatedBy와 updatedAt이 자동으로 업데이트되었는지 확인
SELECT updatedBy, updatedAt FROM accounts;