콘텐츠로 이동

2025 01 02

2025-01-02

Slick 2.x -> 3.x Transaction

  • Slick2.x 세션 기반 쿼리
    1. 세션 기반 구조
      • withTransaction / withDynTransaction
      • Database 객체에서 세션을 열고, 그 세션 범위 내에서 .list, .first 등 동기 메서드로 쿼리 실행
      • 트랜잭션의 세션 중심 동작
        • 블록 내부의 모든 쿼리를 하나의 트랜잭션으로 처리
        • 블록 성공 시 commit, 예외 발생 시 rollback
      • 직접 세션을 열고 닫으며 DB 자원을 관리하는 구조!
      • 쿼리 호출 시, 현재 세션이 유효한지/트랜잭션 범위 안인지 실행 & 체크
    2. withTransaction / withDynTransaction 차이
      • withTransaction : 이미 열린 고정 세션에서 트랜잭션 시작
      • withDynTransaction : 동적으로 세션 열고, 필요하면 내부적으로 세션 새로 생성. 여러 DAO나 비동기 흐름에서 세션 가져올 때 사용
    3. 예시
      db.database.withDynSession {
          withDynTransaction {
              ApiAllowIps.filter(_.status === Active).list
          }
      }
      
  • Session?
    • DB와의 연결(커넥션)을 관리하고 쿼리를 실행할 수 있는 핸들
    • DB 커넥션 + 트랜잭션 범위를 묶어 표현하는 Slick 내부 개념
    • 세션)
      • withSession: 명시적으로 세션을 열고, 블록이 끝나면 세션 닫아줌
      • withDynSession: 동적 세션 사용해, 중접 호출 시에도 세션 공유하거나 새로 열도록
    • 트랜잭션)
      • withTransaction/withDynTransaction: 해당 블록에서 발생하는 모든 쿼리를 하나의 트랜잭션으로 묶음
      • 예외시 롤백, 정상시 커밋
    • Slick 3.x 부터는 Session 직접 다루지 않고 DBIOAction + db.run(...)
      • 세션/트랜잭션 Slick 내부적으로 자동 처리
      • 어떤 액션을 실행하지만 선언적으로 작성 (.result, .transactionally)
  • Slick 3.x DBIO Action, transactionally 개선
    1. DBIO Action 기반 비동기
      • 세션 직접 X, DBIO Action 비동기 연산으로 다룸
      • db.run(someAction) => Future 반환
      • 어떤 트랜잭션 범위로 묶을지 DBIO 수준에서 지정 가능
    2. 트랜잭션: .transactionally
      • DBIO 여러개 합성하여 작업 단위를 만들고, 트랜잭션으로 묶을 수 있음
      • 비동기/넌블로킹 방식
      • Slick이 세션/트랜잭션 관리 자동 처리
    3. withDynTransaction -> .transactionally 대체
      • DBIO 체인으로 명확히 트랜잭션 범위 표현