티스토리 뷰

 

Auditing이란?

Audit은 사전적 의미로 감사하다, 심사하다 등의 의미를 가지고 있습니다. DB에 레코드가 I/O되는 것을 추적 하기 위해 created_at, updated_at, deleted_at, updated_by, created_by, deleted_by 등의 컬럼을 테이블마다 만들게 됩니다.

 

테이블마다 만든다는 것은 JPA관점에서는 Entity클래스 마다 만든다는 것입니다. Auditing 역할을 하는 Field가 중복되는 문제가 있습니다.

 

Spring Data JPA에서는 Auditing이라는 기능을 제공합니다. Auditing하는 컬럼만 묶어놓은 클래스를 extends함으로써 엔티티마다 중복되는 것을 상속으로 처리할 수 있게 해줍니다.

 

 

EnableJpaAuditing 어노테이션을 붙여서 Audit기능을 쓰겠다고 선언 합니다.

@Configuration
@EnableJpaAuditing
public class JpaAuditingConfig {
}

 

BaseEntity를 만듭니다. 이 Entity를 extends하면 Audit이 적용 됩니다.

@Getter
@Setter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
@ToString
public class BaseEntity {

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

    // 조회한 Entity 값을 변경할 때 시간이 자동 저장됩니다.
    @LastModifiedDate
    private LocalDateTime modifiedDate;
}

 

아래와 같이 해당 Entity에 extends해주면 됩니다.

@ToString, @EqualsAndHashCode 어노테이션을 꼭 붙여주셔야 합니다.

@Builder
@Entity
@AllArgsConstructor
@NoArgsConstructor
@Getter
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class Visit extends BaseEntity {

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

   @ManyToOne
   @JoinColumn(name = "hospital_id")
   private Hospital hospital;

   @ManyToOne
   @JoinColumn(name = "user_id")
   private User user;

   private String disease;

   private float amount;

   public VisitResponse toResponse() {
       return VisitResponse.builder()
               .hospitalName(this.hospital.getHospitalName())
               .userName(this.user.getUserName())
               .disease(this.disease)
               .amount(this.amount)
               .build();
   }
}
728x90
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함