데이터베이스 테스트 격리란?
Sonamu는 각 테스트를 트랜잭션으로 감싸서 실행하고, 테스트 종료 시 자동으로 롤백합니다. 이를 통해:- 테스트 간 데이터가 섞이지 않음
- 테스트 실행 순서와 무관하게 항상 동일한 결과
- DB를 초기 상태로 되돌리는 별도 cleanup 불필요
자동 트랜잭션 관리
bootstrap() 함수
Sonamu의bootstrap() 함수가 자동으로 트랜잭션을 관리합니다:
bootstrap()의 역할
beforeEach: 각 테스트 시작 전 트랜잭션 생성afterEach: 각 테스트 종료 후 트랜잭션 롤백- 테스트 성공/실패 여부와 무관하게 항상 롤백
테스트 환경 DB 설정
sonamu.config.ts
테스트용 DB는sonamu.config.ts에서 설정합니다:
- 테스트 DB는 개발/운영 DB와 완전히 분리
pool.max: 1로 설정하여 단일 연결 사용 (트랜잭션 격리 보장)
DB 클래스의 테스트 모드
DB 클래스는 NODE_ENV=test일 때 자동으로 테스트 모드로 전환됩니다:
트랜잭션 격리 메커니즘
createTestTransaction()
beforeEach에서 호출되어 새로운 트랜잭션을 시작합니다:
- Write DB 인스턴스 가져오기
- 새 트랜잭션 시작
testTransaction속성에 저장- 이후 모든 쿼리는 이 트랜잭션을 통해 실행됨
clearTestTransaction()
afterEach에서 호출되어 트랜잭션을 롤백하고 정리합니다:
- 현재 트랜잭션 롤백 (모든 변경사항 취소)
testTransaction을null로 초기화- 다음 테스트를 위한 준비 완료
실전 예제
기본 CRUD 테스트
여러 테이블 작업
트랜잭션 내 에러 처리
복잡한 비즈니스 로직 테스트
테스트 격리 검증
격리 확인 테스트
수동 트랜잭션 제어
필요한 경우 트랜잭션을 수동으로 제어할 수 있습니다:트랜잭션 외부 작업 (주의)
일부 작업은 트랜잭션 범위 밖에서 실행되므로 주의가 필요합니다:파일 시스템 Mocking
파일 작업은 Naite Mock을 사용합니다:성능 최적화
단일 연결 풀
테스트 환경에서는pool.max: 1로 설정하여 단일 연결만 사용합니다:
- 트랜잭션 격리를 보장하려면 같은 연결을 사용해야 함
- 여러 연결을 사용하면 트랜잭션이 공유되지 않음
병렬 실행 제한
테스트는 순차적으로 실행하는 것이 안전합니다:vitest.config.ts:
