research

SQLite In-Memory DB (`:memory:`)

SQLite In-Memory DB (:memory:)

SQLite의 :memory:는 파일 대신 RAM에만 존재하는 DB다.

conn = sqlite3.connect(":memory:")  # 파일 경로 대신 이 문자열

동작 방식은 일반 SQLite랑 완전히 동일하다. 테이블 만들고, INSERT하고, SELECT하고 — 전부 똑같이 작동한다. 차이는 딱 하나, 프로세스가 끝나거나 연결이 닫히면 데이터가 사라진다.


테스트에서 유용한 이유

# 테스트마다 새 연결 = 새 DB = 완전히 깨끗한 상태
def test_create_order():
    db = SQLiteDB(":memory:")  # 이 테스트만의 DB
    db.create_order(...)
    # 테스트 끝나면 데이터 자동 소멸

def test_cancel_order():
    db = SQLiteDB(":memory:")  # 또 다른 깨끗한 DB
    # 앞 테스트 데이터가 전혀 없음

실제 파일 DB를 쓰면 테스트마다 데이터를 직접 지워줘야 하는데, :memory:는 그 문제가 없다. 각 테스트가 완전히 독립된 DB를 가지게 된다.

속도도 훨씬 빠르다 — 디스크 I/O가 없으니까.


DI와 함께 쓰면 더 유용

di-tradeoffs|DI 구조에서 DB 경로를 주입받으면, 테스트에서 :memory:로 교체하는 게 자연스러워진다:

class SQLiteDB:
    def __init__(self, db_path: str):
        self.conn = self._init_db(db_path)

# 실제 사용
db = SQLiteDB("/home/server1/Taa/SQLiteDB/mugyeon.db")

# 테스트
test_db = SQLiteDB(":memory:")