λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
JPA

JPA Auditing κΈ°λŠ₯을 톡해 Entity 곡톡 컬럼 μžλ™ν™”ν•΄λ³΄κΈ°

by μ•„λ¦¬κ°€λ˜πŸ™‚ 2023. 3. 10.

ORM 기술인 JPAλ₯Ό μ‚¬μš©ν•˜μ—¬ 도메인을 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ ν…Œμ΄λΈ”μ— λ§€ν•‘ν•  λ•Œ κ³΅ν†΅μ μœΌλ‘œ 도메인듀이 κ°€μ§€κ³  μžˆλŠ” ν•„λ“œλ‚˜ μ»¬λŸΌλ“€μ€ 늘 μ‘΄μž¬ν•©λ‹ˆλ‹€.
λŒ€ν‘œμ μœΌλ‘œ μƒμ„±μž, μˆ˜μ •μž, μƒμ„±μΌμž, μˆ˜μ •μΌμž, μ‹λ³„μž 같은 ν•„λ“œ 및 컬럼이 μžˆμŠ΅λ‹ˆλ‹€.

λ„λ©”μΈλ§ˆλ‹€ κ³΅ν†΅μœΌλ‘œ μ‘΄μž¬ν•œλ‹€λŠ” μ˜λ―ΈλŠ” κ²°κ΅­ μ½”λ“œκ°€ μ€‘λ³΅λœλ‹€λŠ” 말과 일λ§₯μƒν†΅ν•œλ°, μƒμ„±μž, μˆ˜μ •μž, μƒμ„±μΌμž, μˆ˜μ •μΌμž 같은 μ»¬λŸΌμ€ DB κ΄€μ μ—μ„œ 맀우 μ€‘μš”ν•œ λ°μ΄ν„°μž…λ‹ˆλ‹€.

κ·Έλž˜μ„œ JPAμ—μ„œλŠ” Auditμ΄λΌλŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€.
Audit은 κ°μ‹œν•˜λ‹€λΌλŠ” 뜻으둜 Spring Data JPAμ—μ„œ μ‹œκ°„μ— λŒ€ν•΄μ„œ μžλ™μœΌλ‘œ 값을 λ„£μ–΄μ£ΌλŠ” κΈ°λŠ₯μž…λ‹ˆλ‹€.
도메인을 μ˜μ†μ„± μ»¨ν…μŠ€νŠΈμ— INSERT ν•˜κ±°λ‚˜ UPDATE ν•˜λŠ” 경우 맀번 μ‹œκ°„ 데이터λ₯Ό μž…λ ₯ν•˜μ—¬ μ €μž₯ν•΄μ•Ό ν•˜λŠ”λ°, audit을 μ΄μš©ν•˜λ©΄ μžλ™μœΌλ‘œ μ‹œκ°„μ„ λ§€ν•‘ν•˜μ—¬ ν…Œμ΄λΈ”μ— λ°˜μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

 

1. build.grade에 μ˜μ‘΄μ„± μΆ”κ°€
dependencies {
  compile('org.springframework.boot:spring-boot-starter-web')
  compile('org.projectlombok:lombok')
  compile('org.springframework.boot:spring-boot-starter-data-jpa')
 }

기본적으둜 μŠ€ν”„λ§ λΆ€νŠΈμ—μ„œ gradle둜 μ˜μ‘΄μ„±μ„ κ΄€λ¦¬ν•˜κ²Œ 될 경우 spring-boot-starter-data-jpa만 좔가해도 Audit을 ν•˜λŠ”λ°λŠ” λ¬Έμ œκ°€ μ—†μŠ΅λ‹ˆλ‹€.

 2. BaseEntity 생성
@Setter
@Getter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseEntity {

  private String useYn = "Y";
  
  @CreationTimestamp
  @Column(updatable = false)
  private LocalDateTime rgstDt;
  
  @UpdateTimestamp
  private LocalDateTime mdfyDt;

  public BaseEntity() {
   ...
  }
  

@CreatedDate : Entityκ°€ μƒμ„±λ˜μ–΄ μ €μž₯될 λ•Œ μ‹œκ°„μ΄ μžλ™ μ €μž₯
@LastModifiedDate : μ‘°νšŒν•œ Entity의 값을 λ³€κ²½ν•  λ•Œ μ‹œκ°„μ΄ μžλ™ μ €μž₯

3. JPA Auditing ν™œμ„±ν™”
@EnableJpaAuditing 
@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

μŠ€ν”„λ§ λΆ€νŠΈμ˜ Entry 포인트인 μ‹€ν–‰ ν΄λž˜μŠ€μ— @EnableJpaAuditing μ–΄λ…Έν…Œμ΄μ…˜μ„ μ μš©ν•˜μ—¬ JPA Auditing을 ν™œμ„±ν™” ν•©λ‹ˆλ‹€.

4. 곡톡 BaseEntity 상속
@Getter
@NoArgsConstructor
@Entity
public class Board extends BaseEntity{

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

    @Column(length = 500, nullable = false)
    private String title;

    @Column(columnDefinition = "TEXT", nullable = false)
    private String content;
    
    @Column
    private String rgstId;

    @Column
    private String mdfyId;

}

이런 μ‹μœΌλ‘œ μƒμ†λ§Œ ν•΄μ£Όκ³  Board ν…Œμ΄λΈ”μ— λŒ€ν•œ Insert, Update μ‹œ μžλ™μœΌλ‘œ
RGST_DT, MDFY_DT 컬럼의 값을 μ±„μ›Œμ£ΌλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œλŠ” μ’€ 더 λ‚˜μ•„κ°€μ„œ RGST_ID(μƒμ„±μž)와 MDFY_ID(μˆ˜μ •μž) JPA Auditing을 ν™œμš©ν•˜μ—¬ μžλ™ν™” μ μš©ν•˜λŠ” 방법도 μ•Œμ•„λ³΄κ² μŠ΅λ‹ˆλ‹€.

'JPA' μΉ΄ν…Œκ³ λ¦¬μ˜ λ‹€λ₯Έ κΈ€

JPA @Embedded, @Embeddable μ‚¬μš©ν•˜κΈ°  (1) 2023.03.10

λŒ“κΈ€