이 글의 코드 및 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
Prologue
-
개발을 하다 보면
다음과 같은 Column들이 필요하다.
-
언제 생성되었는가?
-
언제 수정되었는가?
-
누가 생성하였는가?
-
누가 수정하였는가?
-
위와 같은 Needs를 Spring에서는 추상화시켜놓았다.
-
이 글에서는 2가지 방식으로 해당 기능 사용법을 알아본다.
-
순수 JPA를 사용하는 방식
-
Spring Data JPA를 사용하는 방식
순수 JPA 방식
@MappedSuperclass
public class JpaBaseEntity {
@Column(updatable = false)
private LocalDateTime createdData;
private LocalDateTime updatedDated;
@PrePersist
public void prePersist() {
LocalDateTime now = LocalDateTime.now();
createdData = now;
updatedDated = now;
}
@PreUpdate
public void preUpdate() {
updatedDated = LocalDateTime.now();
}
}
- 따로 설명이 필요 없을 정도로 깔끔한 코드이다.
Spring Data JPA 방식
- 이 글에서 다루는 기능을 사용하려면 @EnableJpaAuditing을 선언해줘야 한다.
GoodgidApplication
@EnableJpaAuditing // [1]
@SpringBootApplication
public class GoodgidApplication {
public static void main(String[] args) {
SpringApplication.run(GoodgidApplication.class, args);
}
}
@CreatedDate, @LastModifiedDate
- 그리고 Entity를 다음과 같이 생성해준다.
BaseEntity
@Setter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class) // [1]
public class BaseEntity {
@CreatedDate
@Column(updatable = false)
private LocalDateTime createdDate;
@LastModifiedDate
private LocalDateTime lastModifedDate;
}
-
[1] : EntityListeners 선언을 해줘야 한다.
그러면 createdDate와 lastModifedDate 값은 Spring Data JPA가 알아서 세팅해준다.
Example
- 실제로 DB에 데이터를 insert 해주면 다음과 같은 결과를 볼 수 있다.
Account
@Entity
@Getter
@Setter
public class Account extends BaseEntity {
@Id
@Column(name = "acct_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
@CreatedBy, @LastModifiedBy
-
이번에는 Time이 아닌 Who에 대해 초점을 맞춰보자.
-
다음과 같이 Entity를 생성한다.
BaseTimeEntity
@Setter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public class BaseTimeEntity extends BaseEntity {
@CreatedBy
@Column(updatable = false)
private String createdBy; // [1]
@LastModifiedBy
private String lastModifiedBy; // [2]
}
-
[1], [2]
LocalDateTime 타입은 자동으로 세팅되지만
String 타입의 값 세팅은 Bean 등록이 필요하다.
AuditorAware
@Bean
public AuditorAware<String> auditorProvider() {
return () -> Optional.of(UUID.randomUUID().toString());
}
-
위처럼 Bean을 등록하면
createdBy, lastModifiedBy 에 Random 한 값을 세팅해준다.
-
만약 실무라면 사용자의 ID와 같은 의미 있는 값으로 세팅해주면 된다.
Example
- 실제로 DB에 데이터를 insert 해주면 다음과 같은 결과를 볼 수 있다.
Account
@Entity
@Getter
@Setter
public class Account extends BaseTimeEntity {
@Id
@Column(name = "acct_id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
- 그리고 DB에 insert를 하면 다음과 같은 DB 결괏값을 볼 수 있다.
Summary
-
Spring Data JPA에서 개발자가 필요한 Needs를 잘 추상화시켜놓았다.
유용한 기능을 잘 활용하여 개발 효율성을 높여보자.