스프링 데이터 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;

엔티티의 변경 시점에 언제, 누가 변경했는지에 대한 정보를 기록하는 기능.

아쉽지만 이 기능은 스프링 부트가 자동 설정 해주지 않습니다.

  1. 메인 애플리케이션 위에 @EnableJpaAuditing 추가
  2. 엔티티 클래스 위에 @EntityListeners(AuditingEntityListener.class) 추가 (날짜까지는 그냥 사용 가능)
  3. AuditorAware 구현체 만들기
  4. @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);
    }
}

=




© 2019. by jaeuk