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