๊ด€๋ฆฌ ๋ฉ”๋‰ด

๋‚˜์˜ ๋ชจ์–‘

[Spring Data JPA] Auditing ๋ณธ๋ฌธ

WILT

[Spring Data JPA] Auditing

kexon 2022. 9. 3. 14:37

๐Ÿช„ Auditing?

Auditing์€ ‘๊ฐ์‹œ’๋ผ๋Š” ๋œป์„ ๊ฐ–๊ณ  ์žˆ๋Š”๋ฐ, Spring Data์—์„œ๋Š” Auditing์œผ๋กœ ๋ˆ„๊ฐ€ Entity๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ณ€๊ฒฝํ–ˆ๋Š”์ง€์— ๋Œ€ํ•œ ์‹œ์ ์„ ํˆฌ๋ช…ํ•˜๊ฒŒ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•œ๋‹ค. ์ƒ์„ฑ๋œ ๋ชจ๋“  Entity์— ์ƒ์„ฑ๋œ ์‹œ๊ฐ„๊ณผ ์ˆ˜์ •๋œ ์‹œ๊ฐ„์„ ์ผ์ผ์ด ์ ์–ด์ฃผ๋Š” ๊ฒƒ์€ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๊ท€์ฐฎ๊ธฐ๋„ ํ•˜์ง€๋งŒ, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์ ์ด ์ƒ๊ธด๋‹ค.

๋ชจ๋“  ๊ฐ์ฒด์— ๋‹ค ํ•„์š”ํ•จ ⇒ ์ฝ”๋“œ๋ฅผ ์ผ์ผ์ด ๋‹ค ์ž‘์„ฑํ•ด์ค˜์•ผ ๋จ ⇒ ์‹ค์ˆ˜๋กœ ๋นผ๋จน์Œ / ์ฝ”๋“œ ์ค‘๋ณต

๐Ÿช„ Using Auditing

โœจ add dependencies in build.gradle

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

๐Ÿช„ Use Auditing with code

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป BaseTime.java

  • ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ˆ˜์ •ํ•  ๋•Œ ์ €์žฅ๋˜๋Š” ์‹œ๊ฐ„์„ ๊ธฐ๋กํ•ด์ค„ BaseTime Entity๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
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.Column;
import javax.persistence.EntityListeners;
import javax.persistence.MappedSuperclass;
import java.time.LocalDateTime;

@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTime {
		
    @CreatedDate
    @Column(updatable = false)
    private LocalDateTime createdAt;

    @LastModifiedDate 
    private LocalDateTime modifiedAt;
}

โœจ @EntityListeners(AuditingEntityListener.class)

  • ํด๋ž˜์Šค๋ ˆ๋ฒจ์— ์œ„์น˜ํ•˜๋ฉฐ, ์ƒ์„ฑ์‹œ๊ฐ„, ์ˆ˜์ •์‹œ๊ฐ„์„ ์ž๋™ํ™”ํ•˜๊ฒ ๋‹ค๊ณ  ์•Œ๋ ค์ค€๋‹ค.
  • AuditingEntityListner ์•ˆ์— touchForCreate / touchForUpdate ์ด ๊ตฌํ˜„๋˜์–ด ์žˆ๋‹ค.

โœจ @MappedSuperclass

  • ๊ฐ์ฒด์—๋Š” ์ƒ์†์ด ์žˆ์ง€๋งŒ ํ…Œ์ด๋ธ”์—๋Š” ์ƒ์†์ด ์—†๋Š”๋ฐ ์–ด๋–ป๊ฒŒ ๋งคํ•‘ํ• ๊นŒ? ์ด ๋•Œ @MappedSuperclass๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.
  • ์ƒ์†๋ฐ›์€ ์ƒ์œ„ํด๋ž˜์Šค์˜ ํ•„๋“œ๋ณ€์ˆ˜๋“ค์ด ์ปฌ๋Ÿผ๊ณผ ๋งคํ•‘๋œ๋‹ค.

โœจ @CreatedDate

  • Entity๊ฐ€ ์ƒ์„ฑ๋˜๊ณ  ์ €์žฅ๋  ๋•Œ ์‹œ๊ฐ„์ด ์ž๋™์œผ๋กœ ์ €์žฅ๋œ๋‹ค.

โœจ @Column(updatable = false)

  • ์ƒ์„ฑ ์‹œ๊ฐ„์€ ์ƒ์„ฑํ•  ๋•Œ ํ•œ ๋ฒˆ๋งŒ ๊ธฐ๋ก๋˜๋Š” ์‹œ๊ฐ„์œผ๋กœ ์ˆ˜์ •๋˜๋ฉด ์•ˆ ๋˜๊ธฐ ๋•Œ๋ฌธ์— updatable์„ false๋กœ ํ•œ๋‹ค. ์‹ค์ˆ˜๋กœ ๊ฐ’์„ ๋ฐ”๊ฟ”๋„ ์ˆ˜์ •๋œ ๊ฐ’์ด ์ €์žฅ๋˜์ง€ ์•Š๋Š”๋‹ค.

โœจ @ LastModifiedDate

  • Entity ๊ฐ’์„ ์ˆ˜์ •ํ•˜๊ณ  ์ €์žฅํ•  ๋•Œ ๋ณ€๊ฒฝ๋œ ์‹œ๊ฐ„์ด ์ž๋™์œผ๋กœ ์ €์žฅ๋œ๋‹ค.

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป AuditingEntity.java

  • Entity ํด๋ž˜์Šค์— BaseTime๋ฅผ ์ƒ์†ํ•œ๋‹ค.
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import auditing.BaseTime;

import javax.persistence.*;

@Entity
@Getter
@Setter
@NoArgsConstructor
public class AuditingEntity extends BaseTime {
    @Id @GeneratedValue
    @Column(name = "auditing_id")
    private Long id;

    private String name;
    private String hobby;
}

๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป SpringBootApplication.java

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

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

โœจ @EnableJpaAuditing

  • ๋งˆ์ง€๋ง‰์œผ๋กœ Spring Data JPA์—์„œ Auditing์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด SpringBoot์— ํด๋ž˜์Šค ๋ ˆ๋ฒจ์— @EnableJpaAuditing์„ ์ ์–ด์„œ ์•Œ๋ ค์ค˜์•ผ ํ•œ๋‹ค.

โœ… Ref.

https://docs.spring.io/spring-data/jpa/docs/1.7.0.DATAJPA-580-SNAPSHOT/reference/html/auditing.html

'WILT' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[Session] ์„ ๋ฐฐ์  ์ฐธ๊ฒฌ์‹œ์   (0) 2022.07.28
Comments