콘텐츠로 이동
Bluetape4k 문서1.11

세션과 트랜잭션 수명주기

최신 안정판 Bluetape4k 1.11.0 릴리스 기준

Factory, session, transaction의 소유자

섹션 제목: “Factory, session, transaction의 소유자”

factory는 애플리케이션 수명과 함께 유지하고 종료 시 닫습니다. 반면 withSessionSuspendingwithTransactionSuspending이 연 session과 transaction은 Hibernate Reactive가 block 완료에 맞춰 정리합니다. block 밖으로 session을 반환하거나 보관하지 않습니다.

val result = sessionFactory.withTransactionSuspending { session, transaction ->
check(!transaction.isMarkedForRollback)
session.persist(entity).awaitSuspending()
entity.id
}

정상 완료 시 commit하고 실패 시 rollback하는 의미는 Hibernate Reactive의 withTransaction 계약입니다. extension은 별도의 transaction manager나 retry를 추가하지 않습니다.

일반 Session과 StatelessSession 모두 다음 조합을 제공합니다.

  • session만 여는 block
  • tenant ID를 전달하는 session block
  • transaction을 여는 block
  • session과 transaction 객체를 함께 받는 block
  • tenant ID와 transaction 객체를 함께 받는 block

tenant ID는 upstream overload에 그대로 전달됩니다. tenant 해석, connection 선택, schema 분리는 애플리케이션의 Hibernate Reactive multi-tenancy 설정이 책임집니다.

각 wrapper는 Hibernate Reactive callback 안에서 async(currentVertxDispatcher())로 suspend block을 실행합니다. 이는 thread를 자유롭게 바꿔도 된다는 의미가 아니라 Vert.x context를 지키기 위한 bridge입니다.

sessionFactory.withSessionSuspending { session ->
val book = session.findAs<Book>(id).awaitSuspending()
// blockingJdbcCall() // 호출하지 않습니다.
book
}

blocking library가 꼭 필요하면 reactive transaction 밖의 별도 dispatcher와 명확한 데이터 경계로 분리합니다. 같은 transaction 안에서 JDBC와 Reactive session이 각자 connection을 얻도록 섞지 않습니다.

MutinyExtrasTestStageExtrasTest는 session block의 IllegalStateException과 transaction block의 RuntimeException이 호출자에게 전달되는지 확인합니다. rollback 결과를 별도의 DB assertion으로 검증하지는 않으므로, 문서에서는 extension 고유 보장이 아니라 upstream transaction semantics로 설명합니다.