ABOUT ME

-

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

     

     

    Spring Boot는 Java 기반 애플리케이션을 쉽게 개발하고 배포할 수 있도록 도와주는 오픈소스 프레임워크예요.

    최소한의 설정으로 실행 가능한 독립적인 애플리케이션을 빠르게 만들 수 있도록 도와줍니다 🙌

     

     

     

     

     

    📌 SpringBoot JPA Auditing 생성/수정시간 자동화하기

    엔티티를 설계할 때 거의 모든 테이블에 포함되는 정보가 바로 생성 시간과 수정 시간입니다.
    보통 insertupdate 쿼리를 날리기 직전에 해당 시간을 직접 코드로 입력하게 되는데요.
    이렇게 반복적인 로직이 곳곳에 흩어져 있다면 코드도 지저분해지고 유지보수도 어렵습니다.

     

    이 문제를 해결하기 위해 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
Designed by Tistory.