107 lines
5.2 KiB
Markdown
107 lines
5.2 KiB
Markdown
JPA Auditing에 대해 설명하자면, 이는 Java Persistence API(JPA)를 사용해 데이터베이스 엔티티의 생성 및 수정과 같은 이벤트를 자동으로 추적하고 기록하는 기능입니다. 주로 애플리케이션에서 데이터의 변경 이력을 관리하거나, 누가 언제 데이터를 생성하거나 수정했는지와 같은 메타데이터를 유지할 때 유용합니다. Spring Data JPA에서는 이 기능을 간편하게 구현할 수 있도록 지원합니다.
|
|
|
|
### JPA Auditing의 핵심 개념
|
|
JPA Auditing은 엔티티의 생명주기 이벤트(예: 생성, 수정)를 감지해 특정 필드에 값을 자동으로 채워주는 메커니즘을 제공합니다. 이를 통해 개발자가 수동으로 매번 값을 설정하지 않아도 되므로 코드가 간결해지고 실수를 줄일 수 있습니다. 대표적으로 사용되는 어노테이션은 다음과 같습니다:
|
|
|
|
- `@CreatedDate`: 엔티티가 처음 생성된 날짜와 시간을 기록합니다.
|
|
- `@LastModifiedDate`: 엔티티가 마지막으로 수정된 날짜와 시간을 기록합니다。
|
|
- `@CreatedBy`: 엔티티를 생성한 사용자를 기록합니다.
|
|
- `@LastModifiedBy`: 엔티티를 마지막으로 수정한 사용자를 기록합니다.
|
|
|
|
이 어노테이션들은 Spring Data JPA에서 제공되며, Auditing 기능을 활성화해야 동작합니다.
|
|
|
|
### 설정 방법
|
|
JPA Auditing을 사용하려면 몇 가지 설정이 필요합니다. Spring Boot 환경을 기준으로 설명하겠습니다.
|
|
|
|
1. **Auditing 활성화**
|
|
Spring Boot 애플리케이션에서 `@EnableJpaAuditing` 어노테이션을 설정 클래스(예: `@Configuration`이 붙은 클래스)나 메인 애플리케이션 클래스에 추가합니다.
|
|
```java
|
|
import org.springframework.context.annotation.Configuration;
|
|
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
|
|
|
|
@Configuration
|
|
@EnableJpaAuditing
|
|
public class JpaConfig {
|
|
}
|
|
```
|
|
|
|
2. **Auditable 엔티티 정의**
|
|
엔티티 클래스에 Auditing 관련 필드와 어노테이션을 추가합니다. 보통 공통 속성을 추상 클래스로 만들어 재사용합니다.
|
|
```java
|
|
import jakarta.persistence.EntityListeners;
|
|
import jakarta.persistence.MappedSuperclass;
|
|
import org.springframework.data.annotation.CreatedDate;
|
|
import org.springframework.data.annotation.LastModifiedDate;
|
|
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
|
|
|
|
import java.time.LocalDateTime;
|
|
|
|
@MappedSuperclass
|
|
@EntityListeners(AuditingEntityListener.class)
|
|
public abstract class BaseEntity {
|
|
|
|
@CreatedDate
|
|
private LocalDateTime createdDate;
|
|
|
|
@LastModifiedDate
|
|
private LocalDateTime lastModifiedDate;
|
|
|
|
// Getter, Setter
|
|
}
|
|
```
|
|
- `@MappedSuperclass`: 이 클래스를 상속받는 엔티티에 필드가 포함되도록 합니다.
|
|
- `@EntityListeners(AuditingEntityListener.class)`: Auditing 기능을 수행하는 리스너를 지정합니다.
|
|
|
|
3. **실제 엔티티에서 상속**
|
|
```java
|
|
import jakarta.persistence.Entity;
|
|
import jakarta.persistence.Id;
|
|
|
|
@Entity
|
|
public class User extends BaseEntity {
|
|
|
|
@Id
|
|
private Long id;
|
|
private String name;
|
|
|
|
// Getter, Setter
|
|
}
|
|
```
|
|
|
|
4. **생성자/수정자 정보 추가 (선택)**
|
|
`@CreatedBy`, `@LastModifiedBy`를 사용하려면 현재 사용자 정보를 제공하는 `AuditorAware` 인터페이스를 구현해야 합니다.
|
|
```java
|
|
import org.springframework.data.domain.AuditorAware;
|
|
import java.util.Optional;
|
|
|
|
public class AuditorAwareImpl implements AuditorAware<String> {
|
|
@Override
|
|
public Optional<String> getCurrentAuditor() {
|
|
// 현재 로그인한 사용자 정보를 반환 (예: Spring Security 사용 시)
|
|
return Optional.of("admin");
|
|
}
|
|
}
|
|
```
|
|
그리고 이 빈을 등록합니다:
|
|
```java
|
|
@Bean
|
|
public AuditorAware<String> auditorProvider() {
|
|
return new AuditorAwareImpl();
|
|
}
|
|
```
|
|
|
|
### 동작 원리
|
|
- 엔티티가 저장(`persist`)되거나 수정(`merge`)될 때, `AuditingEntityListener`가 동작합니다.
|
|
- `@CreatedDate`와 `@CreatedBy`는 엔티티가 처음 저장될 때만 값이 설정되고, 이후에는 변경되지 않습니다.
|
|
- `@LastModifiedDate`와 `@LastModifiedBy`는 엔티티가 수정될 때마다 갱신됩니다.
|
|
|
|
### 장점
|
|
- **코드 간소화**: 반복적인 날짜/사용자 설정 코드를 제거합니다.
|
|
- **일관성 유지**: 모든 엔티티에 동일한 방식으로 이력을 관리할 수 있습니다.
|
|
- **유지보수 용이**: 공통 로직을 한 곳에서 관리하므로 변경이 쉬워집니다.
|
|
|
|
### 주의점
|
|
- **시간대 설정**: `@CreatedDate`, `@LastModifiedDate`에 사용할 시간 타입(예: `LocalDateTime`)과 애플리케이션의 시간대 설정을 일치시켜야 합니다.
|
|
- **AuditorAware 구현**: 사용자 정보를 동적으로 가져오려면 보안 컨텍스트(예: Spring Security)와 연동하는 것이 일반적입니다.
|
|
|
|
JPA Auditing은 특히 대규모 프로젝트에서 데이터 변경 추적을 체계적으로 관리할 때 빛을 발합니다. Spring Data JPA의 강력한 기능 중 하나로, 적절히 활용하면 개발 생산성을 크게 높일 수 있습니다! |