-
SpringBoot JPA Auditing 생성/수정시간 자동화하기DEV/SpringBoot 2025. 5. 28. 12:04

Spring Boot는 Java 기반 애플리케이션을 쉽게 개발하고 배포할 수 있도록 도와주는 오픈소스 프레임워크예요.
최소한의 설정으로 실행 가능한 독립적인 애플리케이션을 빠르게 만들 수 있도록 도와줍니다 🙌
📌 SpringBoot JPA Auditing 생성/수정시간 자동화하기
엔티티를 설계할 때 거의 모든 테이블에 포함되는 정보가 바로 생성 시간과 수정 시간입니다.
보통insert나update쿼리를 날리기 직전에 해당 시간을 직접 코드로 입력하게 되는데요.
이렇게 반복적인 로직이 곳곳에 흩어져 있다면 코드도 지저분해지고 유지보수도 어렵습니다.이 문제를 해결하기 위해 Spring Data JPA Auditing 기능을 사용합니다.
해당 기능을 통해@CreatedDate,@LastModifiedDate를 선언해주기만 하면
Spring JPA가 자동으로 시간 값을 주입합니다.
🧩 BaseTimeEntity.java
PATH: /src/main/com.kior.blog.springboot/domain/BaseTimeEntity
package com.kior.blog.springboot.domain; import lombok.Getter; import org.springframework.data.annotation.CreatedDate; import org.springframework.data.annotation.LastModifiedDate; import org.springframework.data.jpa.domain.support.AuditingEntityListener; import javax.persistence.EntityListeners; import javax.persistence.MappedSuperclass; import java.time.LocalDateTime; @Getter @MappedSuperclass @EntityListeners(AuditingEntityListener.class) public class BaseTimeEntity { @CreatedDate private LocalDateTime createdDate; @LastModifiedDate private LocalDateTime modifiedDate; }
위 코드는 모든 엔티티에 상속하여 사용할 수 있는
BaseTimeEntity입니다.@MappedSuperclass를 선언하여 JPA Entity 클래스들이 해당 필드를 상속받게 하고,@EntityListeners로 JPA Auditing 기능이 작동하도록 설정합니다.
🧩 Posts Entity.java
PATH: /src/main/com.kior.blog.springboot/domain/posts/Posts
@Entity public class Posts extends BaseTimeEntity { ... }
Posts클래스에BaseTimeEntity를 상속만 하면 끝입니다.
이제 별도의 시간 설정 없이 자동으로 날짜가 저장됩니다.
🧩 Application 클래스 설정
PATH: /src/main/com.kior.blog.springboot/Application
@SpringBootApplication @EnableJpaAuditing public class Application { ... }
@EnableJpaAuditing어노테이션을 추가하여 Auditing 기능을 활성화합니다.
🧩 테스트 코드 작성
PATH: /src/main/com.kior.blog.springboot.domains.posts.PostsRepositoryTest
@Test public void BaseTimeEntity_enable() { LocalDateTime now = LocalDateTime.of(2019,6,4,0,0,0); postsRepository.save(Posts.builder() .title("title") .content("content") .author("author") .build()); List<Posts> postsList = postsRepository.findAll(); Posts posts = postsList.get(0); System.out.println(">>>>>>>>>> createDate=" + posts.getCreatedDate() + ", modifiedDate=" + posts.getModifiedDate()); assertThat(posts.getCreatedDate()).isAfter(now); assertThat(posts.getModifiedDate()).isAfter(now); }
✅ 테스트 실행 결과 콘솔 출력:
>>>>>>>>>> createDate=2025-05-28T09:55:35.947, modifiedDate=2025-05-28T09:55:35.947
정상적으로 날짜가 자동 입력된 것을 확인할 수 있습니다.
⚠️ 주의사항
- Spring Boot 1.x 또는 Hibernate 5.2.10 미만에서는 Auditing 기능이 정상 작동하지 않을 수 있음
- 이 경우
@PrePersist,@PreUpdate등을 수동으로 설정하거나, Hibernate 설정을 별도로 추가해야 함 java.util.Date는 시간대 이슈나 불변성 문제로 인해 Java 8 이상에서는 반드시LocalDateTime을 사용하는 것이 좋음
SpringBoot JPA Auditing – SQL 직접 삽입 시 주의해야합니다.
@CreatedDate와@LastModifiedDate를 사용하면 JPA가 엔티티를 저장할 때 자동으로 생성/수정 시간을 주입해줍니다.
하지만 직접 SQL로 INSERT할 경우, 이 기능이 작동하지 않습니다. 이를 실제 예제로 확인해보겠습니다.
📌 테스트 케이스: SQL 삽입 비교
-- 자동 시간 주입이 되지 않는 예 INSERT INTO posts (author, content, title) VALUES ('KIOR', 'Tistory', 'SpringBoot'); -- 시간 필드를 명시한 예 INSERT INTO posts (author, content, title, created_date, modified_date) VALUES ('KIOR', 'Tistory', 'SpringBoot', NOW(), NOW());위 두 쿼리를 실행한 결과, 다음과 같이 시간 필드의 값이 달라졌습니다.
ID CREATED_DATE MODIFIED_DATE AUTHOR CONTENT TITLE 1 null null KIOR Tistory SpringBoot 2 2025-05-28 11:05:33.201 2025-05-28 11:05:33.201 KIOR Tistory SpringBoot 
🧠 왜 null이 들어갔을까?
- JPA Auditing 기능은 Spring Data JPA가 관리하는 Entity 객체에만 동작합니다.
- 따라서 SQL로 직접 insert 하는 경우,
@CreatedDate,@LastModifiedDate는 반응하지 않습니다.
Auditing 기능은 아래처럼
save()또는persist()로 엔티티를 저장할 때 자동 작동합니다:postsRepository.save(Posts.builder() .title("SpringBoot") .content("Tistory") .author("KIOR") .build());결론
반복적인 생성일, 수정일 관리를 JPA Auditing 기능으로 자동화하면 코드가 깔끔해지고 유지보수가 훨씬 쉬워집니다.
기본 기능으로 제공되는 만큼 적극 활용하시길 추천드립니다.
'DEV > SpringBoot' 카테고리의 다른 글
SpringBoot API(등록/수정/조회) 만들기 (0) 2025.05.12 SpringBoot Use JPA (0) 2025.04.29 SpringBoot Use Lombok (0) 2025.03.26 SpringBoot Hello Controller (0) 2025.03.11 SpringBoot used Git for Intellij (0) 2025.03.07