LUMI_dev
Spring Data JPA - #3. JPA Auditing (자동으로 시간 값을 넣어주는 기능)적용하는 법(@EnableJpaAuditing) 본문
Spring Data JPA - #3. JPA Auditing (자동으로 시간 값을 넣어주는 기능)적용하는 법(@EnableJpaAuditing)
luminous_dev 2025. 2. 4. 10:45Timestamped
데이터의 생성(created_at), 수정(modified_at) 시간 자주 사용됨
각각의 Entity의 생성 수정 시간을 매번 작성하는건 너무 비효율적
Spring Data JPA에서는 시간에 대해서 자동으로 값을 넣어주는 기능인 JPA Auditing 제공
어노테이션 | |
@MappedSuperclass | JPA Entity 클래스들이 해당 추상 클래스를 상속할 경우 createdAt, modifiedAt 처럼 추상 클래스에 선언한 멤버변수를 컬럼으로 인식 |
@EntityListeners(AuditingEntityListener.class) | 해당 클래스에 Auditing 기능 포함 |
@CreatedDate |
|
@LastModifiedDate |
|
@Temporal |
|
실습) 메모장 프로젝트 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
JPA Auditing을 사용하려면
1. Spring Boot에게 알려줘야 함
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 넣어주기)
자동 완성되면 잘 상속되었다는 것
'스파르타 코딩 클럽 | 자바 심화 과정 > Spring Master (입문 주차)' 카테고리의 다른 글
Spring Data JPA - #4 Query Methods란? (1) | 2025.02.04 |
---|---|
Spring Data JPA - #2 Spring Data JPA 사용방법_JDBC 없애기(findAll, findById,update,delete) (0) | 2025.02.04 |
JDBC란? (0) | 2025.02.04 |
Spring Data JPA - #1 Spring Data JPA란? (1) | 2025.02.04 |
SpringBoot JPA_#1-3. 영속성 컨텍스트와 트랜잭션의 생명 주기_ (0) | 2025.02.04 |