스프링 데이터 JPA-23.트랜잭션, Auditing
스프링 데이터 JPA: 트랜잭션
스프링 데이터 JPA가 제공하는 Repository의 모든 메소드에는 기본적으로 @Transaction이 적용되어 있습니다.
스프링 @Transactional
- 클래스, 인터페이스, 메소드에 사용할 수 있으며, 메소드에 가장 가까운 애노테이션이 우선 순위가 높다.
- https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/transaction/annotation/Transactional.html (반드시 읽어볼 것)
JPA 구현체로 Hibernate를 사용할 때 트랜잭션을 readOnly를 사용하면 좋은 점
- Flush 모드를 NEVER로 설정하여, Dirty checking을 하지 않도록 한다.
@Transactional(readOnly = true) // 달아주는 것은 좋은 습관
<T> List<T> findByPost_Id(Long id, Class<T> type);
스프링 데이터 JPA: Auditing
스프링 데이터 JPA의 Auditing @CreatedDate private Date created;
@LastModifiedDate
private Date updated;
@CreatedBy
@ManyToOne
private Account createdBy;
@LastModifiedBy
@ManyToOne
private Account updatedBy;
엔티티의 변경 시점에 언제, 누가 변경했는지에 대한 정보를 기록하는 기능.
아쉽지만 이 기능은 스프링 부트가 자동 설정 해주지 않습니다.
- 메인 애플리케이션 위에 @EnableJpaAuditing 추가
- 엔티티 클래스 위에 @EntityListeners(AuditingEntityListener.class) 추가 (날짜까지는 그냥 사용 가능)
- AuditorAware 구현체 만들기
- @EnableJpaAuditing에 AuditorAware 빈 이름 설정하기.
JPA의 라이프 사이클 이벤트
- https://docs.jboss.org/hibernate/orm/4.0/hem/en-US/html/listeners.html
- @PrePersist
- @PreUpdate
- …
@Entity @Getter @Setter
@EntityListeners(AuditingEntityListener.class)
public class Comment {
...
@CreatedDate
private Date created;
@LastModifiedDate
private Date updated;
@CreatedBy
@ManyToOne
private Account createdBy;
@LastModifiedBy
@ManyToOne
private Account updatedBy;
/*
// 이렇게도 사용이 가능.
@PrePersist // 엔티티가 저장이 되기 전 호출
public void PrePersist(){
System.out.println("========== PrePersist =========");
this.created = new Date(); // 여기서 날짜를 세팅해준다던가..
//this.createdBy = // 유저 꺼내서 등..
}
*/
}
// accountAuditAware 빈 이름.
@Service
public class AccountAuditAware implements AuditorAware<Account> {
@Override
public Optional<Account> getCurrentAuditor() {
System.out.println("looking for current user");
// 유저 꺼내서 사용 (스프링 시큐리티)
return Optional.empty();
}
}
@SpringBootApplication
@EnableJpaAuditing(auditorAwareRef = "accountAuditAware") // auditng 기능 사용, 엔티티에도 써줘야함.
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
=