간단한 로컬 데이터베이스 프로그램을 구현한다.
프로그램 종료 후 다시 실행해도 파일 기반 영속성으로 데이터를 조회할 수 있어야 한다.
- 목표: 파일에 저장되는 단일 프로세스 로컬 DB
- 특징
- 테이블 정의 및 스키마 관리
- 파일 기반 저장
- B+Tree 인덱스로 범위/포인트 조회 가속
- 트랜잭션(ACID 중 최소 3가지 만족을 목표)
- 간단한 옵티마이저(인덱스 선택/풀스캔 결정 등)
- 버퍼 캐시
- 데이터 CRUD
- INSERT, SELECT, UPDATE, DELETE 지원
- 조건절(=, <, <=, >, >=, BETWEEN, IN) 지원
- 기본키 제약사항 검증
- 파일 입출력(영속성)
- 페이지 단위 파일 포맷 설계(4KB/8KB)
- 레코드 구조 관리
- 프로그램 재시작 후에도 데이터 유지 가능
- 테이블과 스키마
- CREATE TABLE 최소 문법 지원(컬럼명, 타입, PK 지정)
- B+Tree 자료구조
- PK 또는 인덱스 키 기준 B+Tree 구현
- 포인트 조회, 범위 스캔 지원
- 리밸런싱 및 높이 유지
- 인덱스
- CREATE INDEX 지원
- 옵티마이저/실행기에서 인덱스 스캔 방법 선택 가능
- INSERT/UPDATE/DELETE 시 트리 업데이트
- 트랜잭션
- BEGIN/COMMIT/ROLLBACK 지원
- 최소한의 격리 보장(SERIALIZABLE)
- 간단한 옵티마이저
- 플랜 선택 기능
- 풀 스캔 VS 인덱스 스캔 선택
- 캐싱 전략
- 버퍼 캐시(페이지 캐시) 탑재
- 교체 알고리즘(LRU/LFU 중 택 1)
> CREATE TABLE users (id INT PRIMARY KEY, name TEXT, age INT);
OK
> INSERT INTO users VALUES (1, "Alice", 29);
OK (1 row)
> SELECT id, name FROM users WHERE id = 1;
id | name
---+------
1 | Alice
(1 row)
> BEGIN;
OK
> UPDATE users SET age = 30 WHERE id = 1;
OK (1 row)
> ROLLBACK;
OK
> SELECT * FROM users WHERE id BETWEEN 1 AND 10;
> EXIT
Bye!- 표준 입력/출력을 사용해 CLI 인터페이스 제공한다.
- 예외 상황 시 에러 메시지를 출력하고 종료된다.([ERROR] …)
- 함수 길이, 클래스 책임을 작게 유지한다.
- 도메인 로직 테스트는 필수적으로 한다.
-
단위 테스트
B+Tree: 삽입/삭제/검색/범위 스캔/스플릿/머지
파일/페이지: 페이지 읽기/쓰기
트랜잭션: 롤백/커밋 후 상태 검증, 크래시 시 복구
옵티마이저: 조건에 따른 플랜 선택 검증
캐시: 히트율 변화, 교체 정책 동작
-
통합 시나리오
테이블 생성 → 대량 INSERT → 인덱스 생성 → 조회(포인트/범위)
BEGIN → 업데이트 → 크래시 시뮬레이션 → 재시작 → 복구 결과 확인
캐시 온/오프 or 사이즈 변화에 따른 성능 차이 측정(간단 지표)