jujuwon
시크릿주주
jujuwon
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • 🔠 프로그래밍언어 (35)
      • ☕️ Java (19)
      • 🐠 Python (15)
      • 🍠 Kotlin (1)
    • 🔙 Backend (16)
      • 🌿 Springboot (12)
      • 🐳 Docker (1)
      • ☁️ AWS (3)
    • 💼 CS (12)
      • 📶 Network (12)
    • 🕹 알고리즘 (14)
      • 📑 스터디 (2)
      • 💁🏻‍♂️ 백준 (9)
      • 👨🏼‍🔬 프로그래머스 (3)
    • 📚 Book (8)
      • 🔎 오브젝트 (4)
      • 🧪 TDD (2)
      • 📜 논문 (2)
    • 🔐 보안 (7)
      • 👾 Pwnable (7)
    • 📝 회고 (4)
    • 🧩 etc. (10)
      • ⚠️ issue (2)
      • 💡 꿀팁 (7)
      • ✏️ 끄적 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

인기 글

최근 글

hELLO · Designed By 정상우.
jujuwon

시크릿주주

JPA :: Auditing 엔티티 공통 정보 추가하기
🔙 Backend/🌿 Springboot

JPA :: Auditing 엔티티 공통 정보 추가하기

2022. 8. 5. 08:52
반응형

Auditing


  • JPA 에서 도메인을 RDB 테이블에 매핑할 때, 도메인들이 공통으로 가지고 있는 필드들 존재

생성일자, 수정일자, 생성자, 수정자 등

  • JPA 에서 Audit 기능 제공
  • Spring Data JPA 에서 시간 값을 자동으로 넣어줌

 

Auditing 예시 코드


build.gradle 에 의존성 추가

dependency {
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
}

스프링 부트에서 gradle 로 의존성을 관리한다면

spring-boot-starter-data-jpa 만 추가해주면 된다.

BaseTimeEntity.java

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

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

    @LastModifiedDate
    private LocalDateTime modifiedAt;
}

각 어노테이션의 역할은 아래와 같다 ⬇️

@MappedSuperclass

  • 객체에서 공통 매핑 정보가 필요할 때 사용
  • 공통 매핑 정보가 필요할 때, 부모 클래스에 선언하고
  • @MappedSuperclass 를 사용하면 속성만 상속받아서 사용할 수 있다.

EntityListeners(AuditingEntityListener.class)

  • 해당 클래스에 Auditing 기능을 포함

@CreateDate

  • Entity 가 생성되어 저장될 때 시간이 자동 저장

@LastModifiedDate

  • 조회한 Entity 의 값을 변경할 때 시간이 자동 저장

 

JPA Auditing 활성화


  • 스프링부트 어플리케이션 클래스에서 JpaAuditing 기능을 활성화해줘야 한다.
@EnableJpaAuditing // 이거 추가 !
@SpringBootApplication
public class ApiApplication {

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

}

 

예시 코드


  • 모든 엔티티에 생성시간과 수정시간을 공통으로 추가하고 싶은 상황
  • 아래와 같이 BaseEntity 를 정의해서 사용할 수 있다.
@Entity
@Getter
public class Member extends BaseTimeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String password;

    // private LocalDateTime createdAt;
    // private LocalDateTime modifiedAt;
}

BaseTimeEntity 를 상속받으면 주석 처리된 부분이 포함된 것과 마찬가지 효과.

추가로 생성 시간과 수정 시간이 자동으로 적용된다 !

728x90
반응형
저작자표시 (새창열림)
    '🔙 Backend/🌿 Springboot' 카테고리의 다른 글
    • Spring Boot :: Spring Data 패키지 구조
    • Spring Boot :: Spring Data JPA
    • JUnit :: Test 실패 - No tests found for given includes
    • Spring Boot :: JPA란?
    jujuwon
    jujuwon

    티스토리툴바