우당탕탕

[Spring] JPA Auditing을 활용한 생성일, 수정일 자동 관리하기 본문

Tech/Spring

[Spring] JPA Auditing을 활용한 생성일, 수정일 자동 관리하기

모찌모찝 2025. 4. 27. 15:23
JPA Auditing을 활용한 생성일, 수정일 자동 관리하기

 

이번 글에서는 JPA에서 엔티티의 생성일(createdDate)수정일(modifiedDate)을 자동으로 관리하는 방법인 JPA Auditing에 대해 작성해보려 합니다.

실무에서 게시글, 회원, 주문 등 거의 모든 엔티티에는 "언제 만들어졌는지", "언제 마지막으로 수정된 것인지"와 같은 정보가 거의 필수적으로 들어가게 됩니다. 매번 직접 값을 넣어주는 건 번거롭고, 실수도 생길 수 있기 때문에 보통 자동으로 생성해 주는 JPA Auditing과 같은 기능을 많이 사용하게 됩니다.

JPA Auditing

JPA Auditing이란?

JPA Auditing은 엔티티가 저장되거나 수정될 때 특정필드(ex: 생성일, 수정일, 생성자, 수정자 등)의 값을 자동으로 채워주는 기능입니다.

적용방법

1. 의존성 추가

SpringBoot를 사용한다면 별도 라이브러리 추가 없이 바로 사용이 가능합니다.

2. 설정 클래스 만들기

Auditing기능을 활성화하려면 설정 클래스에 @EnableJpaAuditing을 붙여줘야 합니다.

@Configuration
@EnableJpaAuditing
public class JpaConfig {
}

3. AuditorAware 구현체 만들기 ( 생성자, 수정자 기능을 사용할때만 필수, 그 외는 선택 )

누가(어떤 사용자)가 작성 및 수정을 했는지 알려주는 역할입니다.
보통 로그인 정보를 반환하면 됩니다.
생성일, 수정일만 사용시에는 AuditorAware가 필요하지 않습니다

@Component
public class AuditorAwareImpl implements AuditorAware<String> {
    @Override
    public Optional<String> getCurrentAuditor() {
        // 실제 서비스에서는 Spring Security 등에서 유저 정보를 꺼내와서 반환
        // 예시: return Optional.of(SecurityContextHolder.getContext().getAuthentication().getName());
        return Optional.of("system"); // 테스트용, 실제로는 현재 로그인 유저 ID 반환
    }
}

4. 공통 엔티티(BaseEntity) 만들기

모든 엔티티에서 사용할 수 있도록,
생성일, 수정일 필드를 가진 공통 엔티티를 만들어줍니다.

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

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

    @LastModifiedDate
    private LocalDateTime modifiedDate;
    
    @CreatedBy
    private String createdBy;

    @LastModifiedBy
    private String modifiedBy;
}

@MappedSuperclass : 상속받는 엔티티에 필드가 포함됨을 의미합니다.
@EntityListeners(AuditingEntityListener.class) : JPA가 변경 이벤트를 감지할 수 있게 합니다.
@CreatedDate : 엔티티 최초 저장 시 일자를 자동 적재시킵니다.
@LastModifiedDate : 엔티티 값 변경시 일자를 자동 적재 시킵니다.
@CreatedBy : 엔티티 최초 저장 시 생성자를 자동 적재시킵니다.
@LastModifiedBy : 엔티티 값 변경시 수정자를 자동 적재 시킵니다.

5. 엔티티에서 상속받기

@Entity
public class Post extends BaseEntity {
    @Id @GeneratedValue
    private Long id;
    private String title;
    private String content;
    // ... 기타 필드
}

사용하는 엔티티에서 extends BaseEntity를 통해 위에 작성한 코드를 상속받습니다.

여기까지 마무리를 하게 되면 JPA Auditing 설정이 마무리가 됩니다. 언제, 누가 데이터를 만들고 수정했는지를 자동으로 기록하게 되며, 실무에서는 거의 모든 엔티티에 적용되어 있는 기능이니 프로젝트에 꼭 한 번 적용해 보시길 바라겠습니다.

Comments