Spring Data Jpa에서 제공하는 JpaRepository
의 구현체인 SimpleJpaReposity
의 @Transactional
을 어떻게 사용하는지 살펴보고, 실제 우리 서비스에서 어떻게 적용하면 좋을지에 대해서 생각해보자.
1. JpaRepository의 구현체인 SimpleJpaRepository를 열어보면
JpaRepository의 구현체인 SimpleJpaRepositry를 살펴보면, 클래스 레벨에 @Transactional(readOnly= ture)
라고 붙어 있다. 모든 메서드는 기본은 readOnly=ture
로 하고, 변경사항이 있는 메서드들은 추가로 @Transactional
을 붙였다.
@Repository
// 클래스 레벨은 기본 읽기 옵션으로 설정하고
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
// 데이터의 변경사항이 있는 메서드 레벨에는 직접 @Transactional 어노테이션을 붙였다.
// default가 readOnly = false 이기 때문에
@Transactional
public void delete(T entity) {
Assert.notNull(entity, "The entity must not be null!");
em.remove(em.contains(entity) ? entity : em.merge(entity));
}
2. readOnly=true
가 의미하는 것은?
즉, 데이터의 변경이 일어나지 않는 조회하는 메서드인 경우에 @Transactional(readOnly=true)
이렇게 설정한다. 이렇게 설정하면 좋은 점은 Flush모드(데이터 싱크)의 NEVER(필요없음)로 설정하고, Dirty Checking을 하지 않기 때문에 성능이 좋아진다.
@Transactional의 readOnly 속성은 현재 Session의 flush모드를 FlushType.MANUAL 로 해서 dirty checking하는 것은 disable 시킨다.
참고
📚 Related Posts
- JPA - 값 타입(6)
- JPA - 프록시와 연관관계(5)
- JPA - 다양한 연관관계 매핑(4)
- JPA - 연관관계 매핑(기초)(3)
- JPA - 엔티티 매핑(2)
- JPA - 영속성 관리(1)
- [JPA] 연관관계 매핑 (연관관계 편의 메서드)
- [JPA] 엔티티 설계시 주의사항들
- [JPA] Auditing 사용하기
- [JPA]@Transactional를 통한 Optimization
- [JPA] 엔티티 일부 데이터만 조회하는 Projection
- [JPA] save메서드로 살펴보는 persist와 merge 개념
- [JPA] 쿼리메서드(Lookup 전략)
- [JPA] QueryDSL 설정방법
- [JPA] null 처리
- [JPA] 연관관계 매핑 기초(다대일, 연관관계 주인)
- SpringBoot, JPA, H2를 이용한 간단한API 작성
- [JPA] proxy, fetch 전략
- [JPA] 도메인 클래스 컨버터란?
- [JPA] Custom Repository 만들기
- [JPA] Casecade 옵션