스파르타 코딩 클럽 | 자바 심화 과정/Spring Master (입문 주차)

SpringBoot JPA_#1-3. 영속성 컨텍스트와 트랜잭션의 생명 주기_

luminous_dev 2025. 2. 4. 02:51

 

스프링 컨테이너 환경에서는 영속성 컨텍스트와 트랜잭션 생명주기가 일치

= 트랜잭션이 유지되는 동안은 영속성 컨텍스트도 계속 유지됨

 

앞선 트랜잭션 테스트 : 메모 생성 실패 실습은 트랜잭션이 적용되지 않아,

영속성 컨텍스트가 유지되지 못해 오류 발생

 

Q. Spring은 어떻게 서비스부터 Repository까지 Transaction 유지? 

→ Spring이 제공하는 트랜잭션 전파 기능

 


트랜잭션 전파 기능

 

test3 = 부모 메서드, .createMemo = 자식 메서드

 

 

test 3

@Test
@Transactional
@Rollback(value = false)
@DisplayName("트랜잭션 전파 테스트")
void test3() {
    //EntityManager을 자식 메소드에 보내줌 (em) 
    memoRepository.createMemo(em);
    System.out.println("테스트 test3 메서드 종료");
}

 

 

repositories의 createMemo() 메서드

@Transactional
public Memo createMemo(EntityManager em) {
    
    Memo memo = em.find(Memo.class, 1);
    
    //데이터 바꾸기 + 트랜잭션을 걸어놨으니 dirtycheck 변경 감지 발생 > updateQuery 실행
    memo.setUsername("Robbie");
    memo.setContents("@Transactional 전파 테스트 중!");

    System.out.println("createMemo 메서드 종료");
    return memo;
}

 

메서드가 종료되었음에도 불구하고 쿼리가 사라지지 않고 부모 메서드로 전달됨

= 자식 메서드의 트랜잭션이 부모 메서드의 트랜잭션에 합쳐진 것   


원인) 트랜잭션의 propagation(전파) 옵션 

  • @Transactional에서 트랜잭션 전파 옵션 지정할 수 있음 

  • 트랜잭션 전파의 기본 옵션은 REQUIRED (이게 default)
  • ctrl한 다음 눌러보면 아래와 같은 창이 뜸 + Propagation 검색 

 

REQUIRED 옵션 
부모 메서드에 트랜잭션이 존재하면 자식 메서드의 트랜잭션이 부모의 트랜잭션에 합류

 

 

부모 메서드가 있으면, 부모 메서드가 종료된 후 트랜잭션이 커밋될 때 update 실행 

 

 

부모 메서드가 없으면 자식 메서드가 끝날 때 트랜잭션의 커밋이 이루어짐

(부모 메서드의 @Transactional @Rollback(value=false)을 지우고 테스트)