데이터베이스 연동

로컬 SQLite 파일 저장 관리

디스호스트 컨테이너 내부 스토리지에 SQLite DB 파일을 배치해 서버 데이터를 보존하고, 쓰기 에러를 줄이는 디스크 저장법과 WAL 모드 활성화 옵션을 다룹니다.

서버 멤버의 포인트 정보나 가입 일자 등의 가벼운 관계형 데이터를 저장할 때 가장 편리하게 도입할 수 있는 데이터베이스는 파일 기반의 SQLite입니다. 디스호스트 기본 컨테이너 환경 내에서 데이터를 유실 걱정 없이 영구 기록하는 구성법을 안내합니다.


1. 스토리지 영구 경로 지정 (Root Path)

디스호스트는 컨테이너 재기동 시 컨테이너의 일부 임시 가상 영역(예: /tmp, /var 등)에 기록된 데이터를 초기화해 휘발시킵니다. 하지만 봇 프로젝트가 업로드되는 루트 작업 공간인 /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는 파일 하나에 모든 데이터를 봉인 보관하므로 백업 탭을 통해 백업을 생성할 때 매우 안전하고 깨끗하게 복구 데이터를 보관할 수 있습니다. 단, 백업 생성 명령을 내릴 땐 봇 프로세스가 데이터베이스에 한창 대량의 값을 쓰는 중(Writing state)이 아닌 한산한 새벽 시간대에 트리거되도록 스케줄러를 세팅하는 것이 안전합니다.