Key-Value 작업

DBX는 SQL 외에도 고성능 Key-Value 스토어로 사용할 수 있습니다.

기본 CRUD

삽입 (Insert)

import { Database } from 'dbx-py';

const db = Database.openInMemory();

// 기본 삽입
db.insert('users', Buffer.from('user:1'), Buffer.from('Alice'));

// JSON 데이터
const user = { id: 1, name: 'Alice', email: 'alice@example.com' };
db.insert('users', Buffer.from('user:1'), Buffer.from(JSON.stringify(user)));

// 바이너리 데이터
db.insert('files', Buffer.from('file:1'), Buffer.from([0x89, 0x50, 0x4E, 0x47]));

조회 (Get)

// 단일 조회
const value = db.get('users', Buffer.from('user:1'));
if (value) {
    console.log(value.toString());  // Alice
}

// JSON 파싱
const userBuffer = db.get('users', Buffer.from('user:1'));
if (userBuffer) {
    const user = JSON.parse(userBuffer.toString());
    console.log(user.name);  // Alice
}

삭제 (Delete)

db.delete('users', Buffer.from('user:1'));

// 존재 확인 후 삭제
if (db.get('users', Buffer.from('user:1'))) {
    db.delete('users', Buffer.from('user:1'));
    console.log('Deleted');
}

개수 확인 (Count)

const count = db.count('users');
console.log(`Total users: ${count}`);

배치 작업

// 대량 삽입
for (let i = 0; i < 10000; i++) {
    const key = Buffer.from(`user:${i}`);
    const value = Buffer.from(`User ${i}`);
    db.insert('users', key, value);
}

// 플러시
db.flush();

실전 예제

세션 저장소

import { Database } from 'dbx-py';

interface SessionData {
    userId: number;
    username: string;
    role: string;
}

class SessionStore {
    private db: Database;

    constructor(dbPath: string) {
        this.db = Database.open(dbPath);
    }

    createSession(sessionId: string, data: SessionData, ttlSeconds: number = 3600): void {
        const session = {
            data,
            createdAt: Date.now(),
            expiresAt: Date.now() + (ttlSeconds * 1000)
        };
        
        this.db.insert(
            'sessions',
            Buffer.from(sessionId),
            Buffer.from(JSON.stringify(session))
        );
    }

    getSession(sessionId: string): SessionData | null {
        const buffer = this.db.get('sessions', Buffer.from(sessionId));
        if (!buffer) return null;

        const session = JSON.parse(buffer.toString());

        // 만료 확인
        if (Date.now() > session.expiresAt) {
            this.db.delete('sessions', Buffer.from(sessionId));
            return null;
        }

        return session.data;
    }

    deleteSession(sessionId: string): void {
        this.db.delete('sessions', Buffer.from(sessionId));
    }

    close(): void {
        this.db.close();
    }
}

// 사용 예제
const store = new SessionStore('sessions.db');

store.createSession('sess_abc123', {
    userId: 42,
    username: 'alice',
    role: 'admin'
}, 3600);

const session = store.getSession('sess_abc123');
if (session) {
    console.log(`User: ${session.username}`);
}

store.deleteSession('sess_abc123');
store.close();

캐시 시스템

class Cache<T> {
    private db: Database;
    private defaultTtl: number;

    constructor(dbPath: string, defaultTtlSeconds: number = 300) {
        this.db = Database.open(dbPath);
        this.defaultTtl = defaultTtlSeconds * 1000;
    }

    set(key: string, value: T, ttlSeconds?: number): void {
        const ttl = ttlSeconds ? ttlSeconds * 1000 : this.defaultTtl;
        const cacheData = {
            value,
            expiresAt: Date.now() + ttl
        };

        this.db.insert(
            'cache',
            Buffer.from(key),
            Buffer.from(JSON.stringify(cacheData))
        );
    }

    get(key: string): T | null {
        const buffer = this.db.get('cache', Buffer.from(key));
        if (!buffer) return null;

        const cacheData = JSON.parse(buffer.toString());

        // 만료 확인
        if (Date.now() > cacheData.expiresAt) {
            this.db.delete('cache', Buffer.from(key));
            return null;
        }

        return cacheData.value;
    }

    delete(key: string): void {
        this.db.delete('cache', Buffer.from(key));
    }

    close(): void {
        this.db.close();
    }
}

// 사용 예제
interface User {
    name: string;
    email: string;
}

const cache = new Cache<User>('cache.db', 300);

cache.set('user:1', { name: 'Alice', email: 'alice@example.com' });

const user = cache.get('user:1');
if (user) {
    console.log(`Cached user: ${user.name}`);
} else {
    console.log('Cache miss');
}

cache.close();

성능 최적화

1. 배치 작업 + 플러시

// ❌ 느림
for (let i = 0; i < 10000; i++) {
    db.insert('data', Buffer.from(`key:${i}`), Buffer.from(`value:${i}`));
    db.flush();  // 매번 플러시
}

// ✅ 빠름
for (let i = 0; i < 10000; i++) {
    db.insert('data', Buffer.from(`key:${i}`), Buffer.from(`value:${i}`));
}
db.flush();  // 한 번만 플러시

2. Buffer 재사용

// ❌ 느림 (매번 Buffer 생성)
for (let i = 0; i < 10000; i++) {
    const key = Buffer.from(`key:${i}`);
    db.insert('data', key, Buffer.from('value'));
}

// ✅ 빠름 (Buffer 재사용)
const keyBuffer = Buffer.allocUnsafe(20);
for (let i = 0; i < 10000; i++) {
    keyBuffer.write(`key:${i}`);
    db.insert('data', keyBuffer, Buffer.from('value'));
}

다음 단계


Copyright © 2026 ByteLogicCore. MIT OR Apache-2.0 License.

This site uses Just the Docs, a documentation theme for Jekyll.