SpringBoot의 환경에서는 EntityManagerFactory와 EntityManager를 자동으로 생성해준다.
application.yml같은 설정파일에 DB정보를 전달 해 주면 이를 토대로 자동으로 생성
Spring의 트랜잭션
- Spring 프레임워크에서는 DB의 트랜잭션 개념을 애플리케이션에 적용할 수 있도록 트랜잭션 관리자를 제공
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
...
@Transactional
@Override
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Entity must not be null");
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
...
}
- 예시코드 처럼 @Transactional 애너테이션을 클래스나 메서드에 추가하면 쉽게 트랜잭션 개념을 적용
- 클래스에 선언한 @Transactional은 해당 클래스 내부의 모든 메서드에 트랜잭션 기능을 부여
- JPA를 사용하여 DB에 데이터를 저장, 수정, 삭제 하려면 트랜잭션 적용이 반드시 필요
- 다만 조회 작업은 필수가 아니다.
영속성 컨텍스트와 트랜잭션의 생명주기
- 스프링 컨테이너 환경에서는 영속성 컨텍스트와 트랜잭션의 생명주기가 일치
- 쉽게 설명하자면 트랜잭션이 유지되는 동안은 영속성 컨텍스트도 계속 유지가 되기 때문에 영속성 컨텍스트의 기능을 사용가능하다.
트랜잭션 전파
- @Transactional에서 트랜잭션 전파 옵션을 지정할 수 있다.
default 값은 REQUIRED - REQUIRED 옵션은 부모 메서드에 트랜잭션이 존재하면 자식 메서드의 트랜잭션은 부모의 트랜잭션에 합류
@Test
@Transactional
@Rollback(value = false)
@DisplayName("트랜잭션 전파 테스트")
void test3(){
memoRepository.createMemo(em);
System.out.println("테스트 test3 메서드 종료);
}
@Transactional
public Memo createMemo(EntityManager em) {
Memo memo = em.find(Memo.class, 1);
memo.setUsername("Robbie");
memo.setContents("@Transactional 전파 테스트 중!");
System.out.println("createMemo 메서드 종료");
return memo;
}
- test3를 실행하면
- 보이는것과 같이 자식 메서드인 createMemo가 종료될 때 update가 실행되는 것이 아니라 부모 메서드의 트랜잭션에 합류하면서 부모메서드가 다 종료가 된 후 트랜잭션이 커밋될 때 update가 실행됨을 알 수 있다.
- 부모 메서드의 트랜잭셔널을 주석처리 하고 다시 시도를 해보면
- 이처럼 합류할 부모 트랜잭션이 없는 자식 메서드 createMemo가 종료 되자마자 update가 실행된다.
'SPRING' 카테고리의 다른 글
지연 로딩 - (spring - 9) (0) | 2023.12.26 |
---|---|
Spring Data JPA - (spring - 8) (0) | 2023.12.23 |
영속성 컨텍스트 - (spring - 6) (0) | 2023.12.23 |
spring의 3가지 핵심 특징(IoC/Di, PSA, AOP)와 3가지 계층구조 - ( spring - 5) (0) | 2023.12.23 |
Spring MVC - (spring - 4) (0) | 2023.12.22 |