LUMI_dev

Spring Data JPA - #3. JPA Auditing (자동으로 시간 값을 넣어주는 기능)적용하는 법(@EnableJpaAuditing) 본문

스파르타 코딩 클럽 | 자바 심화 과정/Spring Master (입문 주차)

Spring Data JPA - #3. JPA Auditing (자동으로 시간 값을 넣어주는 기능)적용하는 법(@EnableJpaAuditing)

luminous_dev 2025. 2. 4. 10:45

Timestamped

데이터의 생성(created_at), 수정(modified_at) 시간 자주 사용됨 

각각의 Entity의 생성 수정 시간을 매번 작성하는건 너무 비효율적


Spring Data JPA에서는 시간에 대해서 자동으로 값을 넣어주는 기능인 JPA Auditing 제공

 

어노테이션  
@MappedSuperclass JPA Entity 클래스들이 해당 추상 클래스를 상속할 경우
createdAt, modifiedAt 처럼
추상 클래스에 선언한 멤버변수를 컬럼으로 인식
@EntityListeners(AuditingEntityListener.class) 해당 클래스에 Auditing 기능 포함
@CreatedDate
  • Entity 객체가 생성되어 저장될 때 시간이 자동으로 저장
  • 최초 생성 시간이 저장되고 그 이후에는 수정되면 안되기 때문에 updatable = false 옵션을 추가
@LastModifiedDate
  • 조회한 Entity 객체의 값을 변경할 때 변경된 시간이 자동으로 저장
  • 처음 생성 시간이 저장된 이후 변경이 일어날 때마다 해당 변경시간으로 업데이트
@Temporal
  • 날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용
  • DB에는 Date(날짜), Time(시간), Timestamp(날짜와 시간)라는 세 가지 타입이 별도로 존재
    • DATE : ex) 2023-01-01
    • TIME : ex) 20:21:14
    • TIMESTAMP : ex) 2023-01-01 20:22:38.771000

 


실습) 메모장 프로젝트 EntityClass에 JPA auditing 적용해보기

새로운 클래스 생성 

package com.sparta.sparta_memo_project.entity;

import jakarta.persistence.*;
import lombok.Getter;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

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

    @CreatedDate
    @Column(updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime createdAt;

    @LastModifiedDate
    @Column
    @Temporal(TemporalType.TIMESTAMP)
    private LocalDateTime modifiedAt;
}

 

@MappedSuperclass (Entity클래스의 상속) 

: JPA Entity Class들이 해당 출생 클래스를 상속할 경우

createdAt, modifiedAt처럼 추상 클래스에 선언한 멤버 변수를 Column으로 인식

 

= Timestamp를 상속하는 Entity Class는 자동으로 createdAt와 modifiedAt라는 Column을 가지게 됨 

= 객체 지향에서의 '상속'의 개념을 annotation으로 표현한 것 

 

 

Q. public abstract Timestamped로 추상 클래스인 이유 

이 코드 자체를 객체로 생성할 일이 없어서

 

 

@CreatedDate,@LastModifiedDate

이것을 통해 createAt와 modifiedAt에 저장

 

@Temporal 

ctrl 누르고 클릭하면 다음과 같이 Temporal 타입이 나옴

 

 

JPA Auditing을 사용하려면

 

1. Spring Boot에게 알려줘야 함

Application으로 이동

 

Application으로 이동  > @EnableJpaAuditing 추가 

 

2. 사용하려는 Entity에 상속해주기 

 

 

더보기

memo.java

package com.sparta.sparta_memo_project.entity;

import com.sparta.sparta_memo_project.dto.MemoRequestDto;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.time.LocalDateTime;

@Entity // JPA가 관리할 수 있는 Entity 클래스 지정
@Getter
@Setter
@Table(name = "memo") // 매핑할 테이블의 이름을 지정
@NoArgsConstructor //기본 생성자 생성
public class Memo extends Timestamped {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    @Column(name = "username", nullable = false)
    private String username;
    @Column(name = "contents", nullable = false, length = 500)
    private String contents;



    public Memo(MemoRequestDto requestDto) {
        this.username = requestDto.getUsername();
        this.contents = requestDto.getContents();
    }

    public void update(MemoRequestDto requestDto) {
        this.username = requestDto.getUsername();
        this.contents = requestDto.getContents();
    }
}



Applications

package com.sparta.sparta_memo_project;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing
@SpringBootApplication
public class SpartaMemoProjectApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpartaMemoProjectApplication.class, args);
    }

}

 

3.ResponseDTO에서 반환하기 (createdAt와 modifiedAt 넣어주기)

자동 완성되면 잘 상속되었다는 것