[pydantic-ai] DBOS 테스트용 인메모리 SQLite 되돌리기: 파일 기반 DB 복원
PR 링크: pydantic/pydantic-ai#3921 상태: Merged | 변경: +14 / -7
들어가며
PR #3800에서 DBOS 테스트의 SQLite를 인메모리(sqlite:///:memory:?cache=shared)로 전환했지만, DBOS 내부 동작과의 호환성 문제가 발견되어 파일 기반 SQLite로 되돌립니다. 이 PR은 "때로는 최적화를 되돌려야 한다"는 실용적 판단의 좋은 사례입니다.
핵심 코드 분석
Before (인메모리 SQLite - PR #3800):
from sqlalchemy import create_engine
from sqlalchemy.pool import StaticPool
in_memory_engine = create_engine(
'sqlite:///:memory:?cache=shared', connect_args={'check_same_thread': False}, poolclass=StaticPool
)
DBOS_CONFIG: DBOSConfig = {
'name': 'pydantic_dbos_tests',
'run_admin_server': False,
'enable_otlp': True,
'system_database_engine': in_memory_engine,
}
After (파일 기반 SQLite + 자동 정리):
DBOS_SQLITE_FILE = 'dbostest.sqlite'
DBOS_CONFIG: DBOSConfig = {
'name': 'pydantic_dbos_tests',
'system_database_url': f'sqlite:///{DBOS_SQLITE_FILE}',
'run_admin_server': False,
'enable_otlp': True,
}
@pytest.fixture(autouse=True, scope='module')
def cleanup_test_sqlite_file() -> Iterator[None]:
if os.path.exists(DBOS_SQLITE_FILE):
os.remove(DBOS_SQLITE_FILE)
try:
yield
finally:
if os.path.exists(DBOS_SQLITE_FILE):
os.remove(DBOS_SQLITE_FILE)
system_database_engine 대신 system_database_url을 사용하고, autouse=True, scope='module' fixture로 테스트 전후에 SQLite 파일을 자동 정리합니다. sqlalchemy와 StaticPool import도 제거되어 의존성이 줄었습니다.
왜 이게 좋은가
인메모리 SQLite는 빠르지만, 멀티스레드 접근, 커넥션 공유, 트랜잭션 격리 측면에서 파일 기반과 다르게 동작할 수 있습니다. DBOS처럼 내부적으로 복잡한 데이터베이스 상태 관리를 하는 시스템에서는 이런 차이가 간헐적 테스트 실패로 나타날 수 있습니다. 파일 기반으로 되돌리되 자동 정리 fixture를 추가하여 테스트 격리를 보장한 것은 균형 잡힌 접근입니다.
정리
| 항목 | 내용 |
|---|---|
| 되돌린 이유 | 인메모리 SQLite와 DBOS 내부 동작 호환성 문제 |
| 해결 | 파일 기반 SQLite + module-scope 자동 정리 fixture |
| 교훈 | 테스트 인프라 최적화는 테스트 대상의 특성을 고려해야 함 |
참고 자료
- PR #3800 (되돌린 원본)
- SQLite In-Memory Databases
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
PR Analysis 의 다른글
- 이전글 [PyTorch] FlexAttention에 저정밀도 K/V 입력 지원 추가
- 현재글 : [pydantic-ai] DBOS 테스트용 인메모리 SQLite 되돌리기: 파일 기반 DB 복원
- 다음글 [Loki] 새 쿼리 엔진 메모리 할당 최적화: 객체 수 32% 감소
댓글