데이터베이스 연동

로컬 SQLite 파일 저장 관리

디스호스트 컨테이너 스토리지에 SQLite DB 파일을 저장하고 WAL 모드로 동시성 에러를 줄이는 방법을 안내합니다.

서버 멤버의 포인트나 출석 기록 등 가벼운 데이터를 다룰 때 가장 간편하게 도입할 수 있는 데이터베이스는 파일 기반의 SQLite입니다. 디스호스트 기본 컨테이너 환경에서 데이터를 안전하게 보존하는 방법을 안내합니다.


1. 영구 저장 경로 지정 (Root Path)

디스호스트는 컨테이너를 재시작할 때 /tmp 등 시스템 임시 디렉토리의 파일을 초기화합니다. 반면 프로젝트 코드가 위치하는 루트 작업 공간인 /home/container (또는 프로젝트 상대 경로) 내부는 영구 스토리지 볼륨이므로 데이터가 안전하게 유지됩니다.

  • 주의: 데이터베이스 파일을 시스템 임시 폴더나 외부 절대 경로에 생성하면, 컨테이너 재시작 시 파일이 사라질 수 있습니다.
  • 권장: 반드시 프로젝트 디렉토리 내부의 상대 경로로 DB 파일을 생성하고 접근하세요.

Node.js (better-sqlite3) 예제

const Database = require('better-sqlite3');
const path = require('path');

// 프로젝트 폴더 바로 밑에 data.db 파일을 생성하고 보존합니다.
const dbPath = path.join(__dirname, 'data.db');
const db = new Database(dbPath, { verbose: console.log });

Python (sqlite3) 예제

import sqlite3
import os

# 현재 실행 파일 위치를 기준으로 절대 경로를 계산합니다.
base_dir = os.path.dirname(os.path.abspath(__file__))
db_path = os.path.join(base_dir, "data.db")

conn = sqlite3.connect(db_path)

2. WAL (Write-Ahead Logging) 모드 활성화

SQLite는 동시 쓰기 작업이 몰릴 때 데이터베이스 잠금 에러(SQLITE_BUSY: database is locked)가 발생할 수 있습니다. 이를 방지하기 위해 WAL 모드를 활성화하는 것을 권장합니다.

  • WAL 모드의 장점: 읽기 작업과 쓰기 작업이 서로를 블로킹하지 않고 병렬로 처리되어 성능과 안정성이 크게 향상됩니다.

WAL 모드 설정 방법

// better-sqlite3 기준
db.pragma('journal_mode = WAL');
# python sqlite3 기준
cursor = conn.cursor()
cursor.execute("PRAGMA journal_mode=WAL;")

3. 백업 시 주의사항

SQLite는 하나의 파일에 모든 데이터가 저장되므로 대시보드의 백업 탭에서 손쉽게 스냅샷을 생성할 수 있습니다. 단, 대량의 데이터 쓰기가 진행 중일 때 백업이 실행되면 파일 상태가 불안정해질 수 있으므로, 이용자가 적은 새벽 시간대에 스케줄러로 백업을 실행하도록 설정하는 것이 안전합니다.