도서 관리 시스템의 데이터 저장 방식 개선

시스템 설계 개요

이 프로젝트는 기존 파일 기반의 도서 구매 시스템을 데이터베이스 기반으로 전환하여 데이터 일관성과 확장성을 향상시키는 것을 목표로 한다. 기존의 텍스트 파일에서 고객, 책, 주문 정보를 읽고 쓰던 방식을 SQLite 데이터베이스로 대체하였다.

주요 변경 사항

  • 기존 파일 기반 입출력 → SQLite 데이터베이스 사용
  • FileUtil 클래스 제거 및 DBUtil 클래스 도입
  • 각 엔티티(고객, 책, 주문)에 대한 데이터베이스 연동 메서드 추가
  • 데이터베이스 트랜잭션 안정성 보장 및 예외 처리 강화

핵심 클래스 구현

1. DBUtil (데이터베이스 유틸리티)


class DBUtil {
private:
    static sqlite3* db;
public:
    static bool initDB(const string& dbPath);
    static void closeDB();
    static sqlite3* getDB();
};

sqlite3* DBUtil::db = nullptr;

2. Book 클래스 (책 정보 관리)


class Book {
private:
    string bookId;
    string bookName;
    double price;
public:
    Book(string id, string name, double p);

    // 데이터베이스 연동
    static bool insertIntoDB(const Book& book);
    static Book loadFromDB(const string& targetId);
    static vector<Book> loadAllFromDB();
};

3. Customer 클래스 (고객 정보 관리)


class Customer {
private:
    string customerId;
    string customerName;
    string address;
public:
    Customer(string id, string name, string addr);

    // 데이터베이스 연동
    static Customer loadFromDB(const string& targetId);
    static bool insertIntoDB(const Customer& customer);
};

4. Order 클래스 (주문 처리 및 저장)


class Order {
private:
    string orderId;
    ShoppingCart cart;
    string orderStatus;
public:
    Order(const string& id, const ShoppingCart& c);

    // 데이터베이스 저장
    bool saveToDB() const;
};

데이터베이스 스키마 설계

  1. customers: 고객 정보 저장 (고객 ID, 이름, 주소)
  2. books: 도서 정보 저장 (도서 ID, 제목, 가격)
  3. orders: 주문 기본 정보 (주문 번호, 고객 ID, 총액, 상태)
  4. order_items: 주문 상세 항목 (주문 번호, 도서 ID, 제목, 가격)

메인 실행 흐름

  1. 데이터베이스 연결 초기화 (initDB)
  2. 테스트 데이터 삽입 (고객 및 책)
  3. 데이터베이스에서 고객 및 책 정보 로드
  4. 선택된 도서들로 장바구니 구성
  5. 주문 생성 후 데이터베이스에 저장
  6. 콘솔 출력을 통해 주문 요약 확인

예외 처리 및 안정성

- try-catch 블록으로 전체 실행 흐름 감시 - sqlite3_exec 호출 시 오류 메시지 해제 필수 (sqlite3_free) - 모든 데이터베이스 작업 실패 시 예외 발생 및 종료

태그: SQLite C++ OOP database design data persistence

6월 3일 22:03에 게시됨