Skip to content

Latest commit

ย 

History

History
978 lines (757 loc) ยท 31.9 KB

File metadata and controls

978 lines (757 loc) ยท 31.9 KB
doc_id DBS-API-001
doc_title Database System API Reference
doc_version 1.0.0
doc_date 2026-04-04
doc_status Released
project database_system
category API

Database System API Reference

SSOT: This document is the single source of truth for Database System API Reference.

Language: English | ํ•œ๊ตญ์–ด

๋ฉ€ํ‹ฐ ๋ฐฑ์—”๋“œ ์ง€์›, ์—ฐ๊ฒฐ ํ’€๋ง, ์ฟผ๋ฆฌ ๋นŒ๋”๋ฅผ ๊ฐ–์ถ˜ Database System C++20 ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์™„์ „ํ•œ API ๋ ˆํผ๋Ÿฐ์Šค์ž…๋‹ˆ๋‹ค.

๋ชฉ์ฐจ

ํ•ต์‹ฌ ํด๋ž˜์Šค

database_base

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ตฌํ˜„์˜ ์ถ”์ƒ ๊ธฐ๋ณธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

class database_base
{
public:
    virtual ~database_base() = default;

    // Database identification
    virtual database_types database_type() = 0;

    // Connection management
    virtual bool connect(const std::string& connection_string) = 0;
    virtual bool disconnect() = 0;

    // Query operations
    virtual bool create_query(const std::string& query_string) = 0;
    virtual unsigned int insert_query(const std::string& query_string) = 0;
    virtual unsigned int update_query(const std::string& query_string) = 0;
    virtual unsigned int delete_query(const std::string& query_string) = 0;
    virtual database_result select_query(const std::string& query_string) = 0;
};

database_manager

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ฐ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๋Š” ์‹ฑ๊ธ€ํ†ค ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

class database_manager
{
public:
    // Singleton access
    static database_manager& handle();

    // Database configuration
    bool set_mode(const database_types& database_type);
    database_types database_type();

    // Connection management
    bool connect(const std::string& connection_string);
    bool disconnect();

    // Query operations
    bool create_query(const std::string& query_string);
    unsigned int insert_query(const std::string& query_string);
    unsigned int update_query(const std::string& query_string);
    unsigned int delete_query(const std::string& query_string);
    database_result select_query(const std::string& query_string);

    // Phase 3: Advanced Features
    bool create_connection_pool(database_types db_type, const connection_pool_config& config);
    std::shared_ptr<connection_pool_base> get_connection_pool(database_types db_type);
    std::map<database_types, connection_stats> get_pool_stats() const;
    query_builder create_query_builder();
    query_builder create_query_builder(database_types db_type);

    // Phase 4: Enterprise Features
    bool execute_query(const std::string& query_string);
    std::shared_ptr<orm::entity_manager> get_entity_manager();
    std::shared_ptr<monitoring::performance_monitor> get_performance_monitor();
    std::shared_ptr<security::access_control> get_access_control();
    std::shared_ptr<async::async_database> get_async_database();
};

Database Manager

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฒ•

#include <database/database_manager.h>
using namespace database;

// Get singleton instance
database_manager& db = database_manager::handle();

// Set database type
db.set_mode(database_types::postgres);

// Connect
std::string conn_str = "host=localhost port=5432 dbname=test user=admin password=secret";
if (!db.connect(conn_str)) {
    // Handle connection error
}

// Execute queries
db.create_query("CREATE TABLE users (id SERIAL PRIMARY KEY, name VARCHAR(100))");
unsigned int rows = db.insert_query("INSERT INTO users (name) VALUES ('John')");
database_result result = db.select_query("SELECT * FROM users");

์ง€์› ๋ฉ”์„œ๋“œ

๋ฉ”์„œ๋“œ ์„ค๋ช… ๋ฐ˜ํ™˜๊ฐ’
set_mode(database_types) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฑ์—”๋“œ ํƒ€์ž… ์„ค์ • bool ์„ฑ๊ณต ์—ฌ๋ถ€
database_type() ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํƒ€์ž… ๋ฐ˜ํ™˜ database_types
connect(connection_string) ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ bool ์„ฑ๊ณต ์—ฌ๋ถ€
disconnect() ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ํ•ด์ œ bool ์„ฑ๊ณต ์—ฌ๋ถ€
create_query(query) DDL ์ฟผ๋ฆฌ ์‹คํ–‰ bool ์„ฑ๊ณต ์—ฌ๋ถ€
insert_query(query) INSERT ์ฟผ๋ฆฌ ์‹คํ–‰ unsigned int ์˜ํ–ฅ๋ฐ›์€ ํ–‰ ์ˆ˜
update_query(query) UPDATE ์ฟผ๋ฆฌ ์‹คํ–‰ unsigned int ์˜ํ–ฅ๋ฐ›์€ ํ–‰ ์ˆ˜
delete_query(query) DELETE ์ฟผ๋ฆฌ ์‹คํ–‰ unsigned int ์˜ํ–ฅ๋ฐ›์€ ํ–‰ ์ˆ˜
select_query(query) SELECT ์ฟผ๋ฆฌ ์‹คํ–‰ database_result

์—ฐ๊ฒฐ ํ’€๋ง

connection_pool_config

์—ฐ๊ฒฐ ํ’€์˜ ๊ตฌ์„ฑ ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค.

struct connection_pool_config
{
    size_t min_connections = 2;                              // Minimum connections to maintain
    size_t max_connections = 20;                             // Maximum connections allowed
    std::chrono::milliseconds acquire_timeout{5000};         // Timeout for acquiring connections
    std::chrono::milliseconds idle_timeout{30000};           // Timeout for idle connections
    std::chrono::milliseconds health_check_interval{60000};   // Health check interval
    bool enable_health_checks = true;                        // Enable periodic health checks
    std::string connection_string;                           // Database connection string
};

connection_stats

์—ฐ๊ฒฐ ํ’€ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์œ„ํ•œ ํ†ต๊ณ„ ๊ตฌ์กฐ์ฒด์ž…๋‹ˆ๋‹ค.

struct connection_stats
{
    size_t total_connections = 0;                             // Total connections created
    size_t active_connections = 0;                            // Currently active connections
    size_t available_connections = 0;                         // Available connections in pool
    size_t failed_acquisitions = 0;                           // Number of failed acquisitions
    size_t successful_acquisitions = 0;                       // Number of successful acquisitions
    std::chrono::steady_clock::time_point last_health_check;  // Last health check time
};

connection_pool_base

์—ฐ๊ฒฐ ํ’€์˜ ์ถ”์ƒ ๊ธฐ๋ณธ ํด๋ž˜์Šค์ž…๋‹ˆ๋‹ค.

class connection_pool_base
{
public:
    virtual ~connection_pool_base() = default;

    virtual std::shared_ptr<connection_wrapper> acquire_connection() = 0;
    virtual void release_connection(std::shared_ptr<connection_wrapper> connection) = 0;
    virtual size_t active_connections() const = 0;
    virtual size_t available_connections() const = 0;
    virtual connection_stats get_stats() const = 0;
    virtual void shutdown() = 0;
};

์‚ฌ์šฉ ์˜ˆ์ œ

#include <database/database_manager.h>
#include <database/connection_pool.h>

// Configure connection pool
connection_pool_config config;
config.min_connections = 5;
config.max_connections = 20;
config.acquire_timeout = std::chrono::seconds(5);
config.connection_string = "host=localhost port=5432 dbname=test user=admin password=secret";

// Create pool
database_manager& db = database_manager::handle();
if (!db.create_connection_pool(database_types::postgres, config)) {
    // Handle error
}

// Use pool
auto pool = db.get_connection_pool(database_types::postgres);
auto connection = pool->acquire_connection();

if (connection) {
    // Use connection
    auto result = connection->select_query("SELECT * FROM users");

    // Connection automatically returned to pool when destroyed
}

// Monitor statistics
auto stats = db.get_pool_stats();
for (const auto& [db_type, stat] : stats) {
    std::cout << "Active: " << stat.active_connections
              << " Available: " << stat.available_connections << std::endl;
}

์ฟผ๋ฆฌ ๋นŒ๋”

query_builder

๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํƒ€์ž…์— ์ ์‘ํ•˜๋Š” ๋ฒ”์šฉ ์ฟผ๋ฆฌ ๋นŒ๋”์ž…๋‹ˆ๋‹ค.

class query_builder
{
public:
    explicit query_builder(database_types db_type = database_types::none);

    // Database type selection
    query_builder& for_database(database_types db_type);

    // SQL-style interface (PostgreSQL, SQLite)
    query_builder& select(const std::vector<std::string>& columns);
    query_builder& from(const std::string& table);
    query_builder& where(const std::string& field, const std::string& op, const database_value& value);
    query_builder& join(const std::string& table, const std::string& condition);
    query_builder& order_by(const std::string& column, sort_order order = sort_order::asc);
    query_builder& limit(size_t count);

    // NoSQL-style interface
    query_builder& collection(const std::string& name); // MongoDB
    query_builder& key(const std::string& key);         // Redis

    // Universal operations
    query_builder& insert(const std::map<std::string, database_value>& data);
    query_builder& update(const std::map<std::string, database_value>& data);
    query_builder& remove(); // DELETE/DROP

    // Build and execute
    std::string build() const;
    database_result execute(database_base* db) const;

    // Reset builder
    void reset();
};

sql_query_builder

SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์œ„ํ•œ ํŠนํ™”๋œ ์ฟผ๋ฆฌ ๋นŒ๋”์ž…๋‹ˆ๋‹ค.

class sql_query_builder
{
public:
    // SELECT operations
    sql_query_builder& select(const std::vector<std::string>& columns);
    sql_query_builder& select(const std::string& column);
    sql_query_builder& select_raw(const std::string& raw_select);
    sql_query_builder& from(const std::string& table);

    // WHERE conditions
    sql_query_builder& where(const std::string& field, const std::string& op, const database_value& value);
    sql_query_builder& where(const query_condition& condition);
    sql_query_builder& where_raw(const std::string& raw_where);
    sql_query_builder& or_where(const std::string& field, const std::string& op, const database_value& value);

    // JOIN operations
    sql_query_builder& join(const std::string& table, const std::string& condition, join_type type = join_type::inner);
    sql_query_builder& left_join(const std::string& table, const std::string& condition);
    sql_query_builder& right_join(const std::string& table, const std::string& condition);

    // GROUP BY and HAVING
    sql_query_builder& group_by(const std::vector<std::string>& columns);
    sql_query_builder& group_by(const std::string& column);
    sql_query_builder& having(const std::string& condition);

    // ORDER BY
    sql_query_builder& order_by(const std::string& column, sort_order order = sort_order::asc);
    sql_query_builder& order_by_raw(const std::string& raw_order);

    // LIMIT and OFFSET
    sql_query_builder& limit(size_t count);
    sql_query_builder& offset(size_t count);

    // INSERT operations
    sql_query_builder& insert_into(const std::string& table);
    sql_query_builder& values(const std::map<std::string, database_value>& data);
    sql_query_builder& values(const std::vector<std::map<std::string, database_value>>& rows);

    // UPDATE operations
    sql_query_builder& update(const std::string& table);
    sql_query_builder& set(const std::string& field, const database_value& value);
    sql_query_builder& set(const std::map<std::string, database_value>& data);

    // DELETE operations
    sql_query_builder& delete_from(const std::string& table);

    // Build final query
    std::string build() const;
    std::string build_for_database(database_types db_type) const;

    // Reset builder
    void reset();
};

mongodb_query_builder

MongoDB๋ฅผ ์œ„ํ•œ ํŠนํ™”๋œ ์ฟผ๋ฆฌ ๋นŒ๋”์ž…๋‹ˆ๋‹ค.

class mongodb_query_builder
{
public:
    // Collection operations
    mongodb_query_builder& collection(const std::string& name);

    // Find operations
    mongodb_query_builder& find(const std::map<std::string, database_value>& filter = {});
    mongodb_query_builder& find_one(const std::map<std::string, database_value>& filter = {});

    // Projection
    mongodb_query_builder& project(const std::vector<std::string>& fields);
    mongodb_query_builder& exclude(const std::vector<std::string>& fields);

    // Sorting
    mongodb_query_builder& sort(const std::map<std::string, int>& sort_spec);
    mongodb_query_builder& sort(const std::string& field, int direction = 1);

    // Limit and Skip
    mongodb_query_builder& limit(size_t count);
    mongodb_query_builder& skip(size_t count);

    // Insert operations
    mongodb_query_builder& insert_one(const std::map<std::string, database_value>& document);
    mongodb_query_builder& insert_many(const std::vector<std::map<std::string, database_value>>& documents);

    // Update operations
    mongodb_query_builder& update_one(const std::map<std::string, database_value>& filter,
                                     const std::map<std::string, database_value>& update);
    mongodb_query_builder& update_many(const std::map<std::string, database_value>& filter,
                                      const std::map<std::string, database_value>& update);

    // Delete operations
    mongodb_query_builder& delete_one(const std::map<std::string, database_value>& filter);
    mongodb_query_builder& delete_many(const std::map<std::string, database_value>& filter);

    // Aggregation pipeline
    mongodb_query_builder& match(const std::map<std::string, database_value>& conditions);
    mongodb_query_builder& group(const std::map<std::string, database_value>& group_spec);
    mongodb_query_builder& unwind(const std::string& field);

    // Build final query
    std::string build() const;
    std::string build_json() const;

    // Reset builder
    void reset();
};

redis_query_builder

Redis๋ฅผ ์œ„ํ•œ ํŠนํ™”๋œ ์ฟผ๋ฆฌ ๋นŒ๋”์ž…๋‹ˆ๋‹ค.

class redis_query_builder
{
public:
    // String operations
    redis_query_builder& set(const std::string& key, const std::string& value);
    redis_query_builder& get(const std::string& key);
    redis_query_builder& del(const std::string& key);
    redis_query_builder& exists(const std::string& key);

    // Hash operations
    redis_query_builder& hset(const std::string& key, const std::string& field, const std::string& value);
    redis_query_builder& hget(const std::string& key, const std::string& field);
    redis_query_builder& hdel(const std::string& key, const std::string& field);
    redis_query_builder& hgetall(const std::string& key);

    // List operations
    redis_query_builder& lpush(const std::string& key, const std::string& value);
    redis_query_builder& rpush(const std::string& key, const std::string& value);
    redis_query_builder& lpop(const std::string& key);
    redis_query_builder& rpop(const std::string& key);
    redis_query_builder& lrange(const std::string& key, int start, int stop);

    // Set operations
    redis_query_builder& sadd(const std::string& key, const std::string& member);
    redis_query_builder& srem(const std::string& key, const std::string& member);
    redis_query_builder& sismember(const std::string& key, const std::string& member);
    redis_query_builder& smembers(const std::string& key);

    // Expiration
    redis_query_builder& expire(const std::string& key, int seconds);
    redis_query_builder& ttl(const std::string& key);

    // Build command
    std::string build() const;
    std::vector<std::string> build_args() const;

    // Reset builder
    void reset();
};

์ฟผ๋ฆฌ ๋นŒ๋” ์˜ˆ์ œ

// SQL Query Builder
auto sql_query = db.create_query_builder(database_types::postgres)
    .select({"name", "email", "created_at"})
    .from("users")
    .where("age", ">", database_value{int64_t(18)})
    .where("status", "=", database_value{std::string("active")})
    .order_by("created_at", sort_order::desc)
    .limit(10);

std::string query = sql_query.build();
// Output: SELECT "name", "email", "created_at" FROM "users" WHERE age > 18 AND status = 'active' ORDER BY created_at DESC LIMIT 10

// MongoDB Query Builder
auto mongo_query = db.create_query_builder(database_types::mongodb)
    .collection("users")
    .find({{"status", database_value{std::string("active")}}})
    .sort("created_at", -1)
    .limit(10);

std::string mongo_cmd = mongo_query.build();
// Output: db.users.find({ "status": "active" }).sort({"created_at": -1}).limit(10)

// Redis Query Builder
auto redis_query = db.create_query_builder(database_types::redis)
    .hget("user:123", "email");

std::string redis_cmd = redis_query.build();
// Output: HGET user:123 email

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํƒ€์ž…

database_types

์ง€์›๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํƒ€์ž…์˜ ์—ด๊ฑฐํ˜•์ž…๋‹ˆ๋‹ค.

enum class database_types : uint8_t
{
    none = 0,           // No database backend
    postgres = 1,       // PostgreSQL backend
    sqlite = 3,         // SQLite backend
    oracle = 4,         // Oracle backend (future)
    mongodb = 5,        // MongoDB backend
    redis = 6           // Redis backend
};

database_value

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฐ’์„ ์œ„ํ•œ variant ํƒ€์ž…์ž…๋‹ˆ๋‹ค.

using database_value = std::variant<std::string, int64_t, double, bool, std::monostate>;

database_result

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ฒฐ๊ณผ๋ฅผ ์œ„ํ•œ ํƒ€์ž… ์ •์˜์ž…๋‹ˆ๋‹ค.

using database_row = std::map<std::string, database_value>;
using database_result = std::vector<database_row>;

database_value ์‚ฌ์šฉํ•˜๊ธฐ

// Creating values
database_value str_val{std::string("hello")};
database_value int_val{int64_t(42)};
database_value double_val{3.14};
database_value bool_val{true};
database_value null_val{std::monostate{}};

// Visiting values
std::visit([](const auto& value) {
    using T = std::decay_t<decltype(value)>;
    if constexpr (std::is_same_v<T, std::string>) {
        std::cout << "String: " << value << std::endl;
    } else if constexpr (std::is_same_v<T, int64_t>) {
        std::cout << "Integer: " << value << std::endl;
    } else if constexpr (std::is_same_v<T, double>) {
        std::cout << "Double: " << value << std::endl;
    } else if constexpr (std::is_same_v<T, bool>) {
        std::cout << "Boolean: " << (value ? "true" : "false") << std::endl;
    } else if constexpr (std::is_same_v<T, std::monostate>) {
        std::cout << "NULL" << std::endl;
    }
}, str_val);

C++20 Concepts

database_system์€ ์ปดํŒŒ์ผ ํƒ€์ž„ ํƒ€์ž… ๊ฒ€์ฆ์„ ์œ„ํ•œ C++20 concepts๋ฅผ ์ œ๊ณตํ•˜์—ฌ, ๋” ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€, ์ž์ฒด ๋ฌธ์„œํ™” ์ฝ”๋“œ, ๋” ๋‚˜์€ IDE ์ง€์›์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ์š”

ํ—ค๋”: #include <database/core/concepts.h> ๋„ค์ž„์ŠคํŽ˜์ด์Šค: database::concepts

Concepts ์‚ฌ์šฉ์˜ ์ด์ 

  • ๋” ๋ช…ํ™•ํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: ํ…œํ”Œ๋ฆฟ ์˜ค๋ฅ˜๊ฐ€ ์ˆ˜๋ฐฑ ์ค„์˜ SFINAE ์‹คํŒจ ๋Œ€์‹  concept ์œ„๋ฐ˜์œผ๋กœ ํ‘œ์‹œ๋จ
  • ์ž์ฒด ๋ฌธ์„œํ™” ์ฝ”๋“œ: Concepts๊ฐ€ ํƒ€์ž… ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ช…์‹œ์ ์œผ๋กœ ํ‘œํ˜„
  • ๋” ๋‚˜์€ IDE ์ง€์›: ๋” ์ •ํ™•ํ•œ ์ž๋™ ์™„์„ฑ ๋ฐ ํƒ€์ž… ํžŒํŠธ
  • ์ฝ”๋“œ ๋‹จ์ˆœํ™”: std::enable_if ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ œ๊ฑฐ

ํ˜ธ์ถœ ๊ฐ€๋Šฅ Concepts

Concept ์„ค๋ช… ์‹œ๊ทธ๋‹ˆ์ฒ˜
Invocable<F, Args...> ์ฃผ์–ด์ง„ ์ธ์ž๋กœ ํ˜ธ์ถœ ๊ฐ€๋Šฅ F(Args...)
VoidCallable<F, Args...> void๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜ธ์ถœ ๊ฐ€๋Šฅ void F(Args...)
ReturnsResult<F, R, Args...> R ํƒ€์ž…์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜ธ์ถœ ๊ฐ€๋Šฅ R F(Args...)
Predicate<F, Args...> bool์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜ธ์ถœ ๊ฐ€๋Šฅ bool F(Args...)
NoexceptCallable<F, Args...> noexcept๋กœ ํ‘œ์‹œ๋œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ noexcept F(Args...)
DelayedCallable<F> ์ง€์—ฐ ์‹คํ–‰์„ ์œ„ํ•œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ void F() + ์ด๋™ ์ƒ์„ฑ ๊ฐ€๋Šฅ
AsyncCallable<F, R> ๋น„๋™๊ธฐ ์‹คํ–‰์„ ์œ„ํ•œ ํ˜ธ์ถœ ๊ฐ€๋Šฅ R F()

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „์šฉ Concepts

Concept ์„ค๋ช… ์‹œ๊ทธ๋‹ˆ์ฒ˜
QueryCallback<F, ResultType> ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ void F(ResultType)
ErrorHandler<F> ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ void F(const std::exception&)
ConnectionFactory<F> ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ์ƒ์„ฑ std::unique_ptr<database_base> F()
BackendFactory<F> ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ฐฑ์—”๋“œ ์ƒ์„ฑ std::unique_ptr<database_backend> F()

์ŠคํŠธ๋ฆผ Concepts

Concept ์„ค๋ช… ์‹œ๊ทธ๋‹ˆ์ฒ˜
StreamEventHandler<F, EventType> ์ŠคํŠธ๋ฆผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ void F(const EventType&)
StreamEventFilter<F, EventType> ์ŠคํŠธ๋ฆผ ์ด๋ฒคํŠธ ํ•„ํ„ฐ๋ง bool F(const EventType&)

ํŠธ๋žœ์žญ์…˜ Concepts

Concept ์„ค๋ช… ์šฉ๋„
TransactionAction<F> ํŠธ๋žœ์žญ์…˜ ์•ก์…˜ Saga ํŒจํ„ด ์ •๋ฐฉํ–ฅ ์•ก์…˜
CompensationAction<F> ๋ณด์ƒ (๋กค๋ฐฑ) ์•ก์…˜ Saga ํŒจํ„ด ๋กค๋ฐฑ ์•ก์…˜

ํƒœ์Šคํฌ ์‹คํ–‰ Concepts

Concept ์„ค๋ช… ์šฉ๋„
SubmittableTask<F, Args...> ๋น„๋™๊ธฐ executor ์ œ์ถœ์šฉ ํ˜ธ์ถœ ๊ฐ€๋Šฅ async_executor.submit()
VoidTask<F, Args...> Fire-and-forget ํ˜ธ์ถœ ๊ฐ€๋Šฅ ๋ฐฑ๊ทธ๋ผ์šด๋“œ ํƒœ์Šคํฌ

ํ’€ Concepts

Concept ์„ค๋ช… ์š”๊ตฌ์‚ฌํ•ญ
PooledResource<T> ํ’€์—์„œ ๊ด€๋ฆฌ๋˜๋Š” ๋ฆฌ์†Œ์Šค ํด๋ž˜์Šค ํƒ€์ž…, ๊ธฐ๋ณธ ์ƒ์„ฑ ๊ฐ€๋Šฅ
ConnectionWrapper<T> ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ๊ฒฐ ๋ž˜ํผ get()์ด database_base* ๋ฐ˜ํ™˜, is_valid()๊ฐ€ bool ๋ฐ˜ํ™˜

์‚ฌ์šฉ ์˜ˆ์ œ

ํƒ€์ž… ์•ˆ์ „ ๋น„๋™๊ธฐ ํƒœ์Šคํฌ ์ œ์ถœ

#include <database/core/concepts.h>
using namespace database::concepts;

// ํƒ€์ž… ์•ˆ์ „ ํƒœ์Šคํฌ ์ œ์ถœ์„ ์œ„ํ•œ concept ์ œ์•ฝ ํ•จ์ˆ˜
template<SubmittableTask<int> F>
auto submit_computation(async_executor& executor, F&& func) {
    return executor.submit(std::forward<F>(func));
}

// ์‚ฌ์šฉ๋ฒ•
auto future = submit_computation(executor, []() { return 42; });

์ฟผ๋ฆฌ ์ฝœ๋ฐฑ ๋“ฑ๋ก

#include <database/core/concepts.h>
using namespace database::concepts;

// ํƒ€์ž… ์•ˆ์ „ ์ฟผ๋ฆฌ ์ฝœ๋ฐฑ ๋“ฑ๋ก
template<QueryCallback<database_result> F>
void on_query_complete(F&& callback) {
    query_callbacks_.push_back(std::forward<F>(callback));
}

// ์‚ฌ์šฉ๋ฒ•
on_query_complete([](const database_result& result) {
    std::cout << "์ฟผ๋ฆฌ๊ฐ€ " << result.size() << " ํ–‰์„ ๋ฐ˜ํ™˜ํ–ˆ์Šต๋‹ˆ๋‹ค" << std::endl;
});

Concept ์ œ์•ฝ์ด ์žˆ๋Š” ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ

#include <database/core/concepts.h>
using namespace database::concepts;

// ์ปดํŒŒ์ผ ํƒ€์ž„ ํƒ€์ž… ๊ฒ€์ฆ์ด ์žˆ๋Š” ์—๋Ÿฌ ํ•ธ๋“ค๋Ÿฌ ์„ค์ •
template<ErrorHandler F>
void set_error_handler(F&& handler) {
    error_handler_ = std::forward<F>(handler);
}

// ์‚ฌ์šฉ๋ฒ•
set_error_handler([](const std::exception& e) {
    std::cerr << "๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ค๋ฅ˜: " << e.what() << std::endl;
});

์ŠคํŠธ๋ฆผ ์ด๋ฒคํŠธ ์ฒ˜๋ฆฌ

#include <database/core/concepts.h>
using namespace database::concepts;

// concept ์ œ์•ฝ์ด ์žˆ๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ ๋“ฑ๋ก
template<StreamEventHandler<stream_event> F>
void register_handler(const std::string& channel, F&& handler) {
    handlers_[channel] = std::forward<F>(handler);
}

// concept ์ œ์•ฝ์ด ์žˆ๋Š” ์ด๋ฒคํŠธ ํ•„ํ„ฐ ๋“ฑ๋ก
template<StreamEventFilter<stream_event> F>
void add_filter(const std::string& channel, F&& filter) {
    filters_[channel] = std::forward<F>(filter);
}

// ์‚ฌ์šฉ๋ฒ•
register_handler("user_updates", [](const stream_event& event) {
    process_user_update(event);
});

add_filter("user_updates", [](const stream_event& event) {
    return event.type == "INSERT" || event.type == "UPDATE";
});

ํŠธ๋žœ์žญ์…˜ Concepts๋ฅผ ์‚ฌ์šฉํ•œ Saga ํŒจํ„ด

#include <database/core/concepts.h>
using namespace database::concepts;

// concept ์ œ์•ฝ์ด ์žˆ๋Š” saga ๋‹จ๊ณ„ ์ถ”๊ฐ€
template<TransactionAction A, CompensationAction C>
void add_saga_step(A&& action, C&& compensation) {
    steps_.emplace_back(
        std::forward<A>(action),
        std::forward<C>(compensation)
    );
}

// ์‚ฌ์šฉ๋ฒ•
saga_builder builder;
builder.add_step(
    []() { /* ์ฃผ๋ฌธ ์ƒ์„ฑ */ },
    []() { /* ์ฃผ๋ฌธ ์ทจ์†Œ */ }
);
builder.add_step(
    []() { /* ์žฌ๊ณ  ์˜ˆ์•ฝ */ },
    []() { /* ์žฌ๊ณ  ํ•ด์ œ */ }
);

Concept ์ œ์•ฝ์ด ์žˆ๋Š” API ๋ฉ”์„œ๋“œ

๋‹ค์Œ ๋ฉ”์„œ๋“œ๋“ค์€ ์ด์ œ C++20 concept ์ œ์•ฝ์„ ๊ฐ€์ง‘๋‹ˆ๋‹ค:

ํด๋ž˜์Šค ๋ฉ”์„œ๋“œ Concept ์ œ์•ฝ
async_executor submit() requires concepts::SubmittableTask<F, Args...>
async_executor_v2 submit() requires concepts::SubmittableTask<F, Args...>
thread_adapter submit() requires concepts::SubmittableTask<F, Args...>
async_result<T> then() concepts::VoidCallable<T>
async_result<T> on_error() concepts::ErrorHandler
stream_processor register_event_handler() concepts::StreamEventHandler<stream_event>
stream_processor register_global_handler() concepts::StreamEventHandler<stream_event>
stream_processor add_event_filter() concepts::StreamEventFilter<stream_event>
saga_builder add_step() concepts::TransactionAction, concepts::CompensationAction

์ฐธ๊ณ : ๊ธฐ์กด std::function ์˜ค๋ฒ„๋กœ๋“œ๋Š” ํ•˜์œ„ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์œ ์ง€๋ฉ๋‹ˆ๋‹ค.

์—๋Ÿฌ ์ฒ˜๋ฆฌ

์˜ˆ์™ธ ์•ˆ์ „์„ฑ

๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž‘์—…์€ RAII ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ๋ฅผ ํ†ตํ•ด ์˜ˆ์™ธ ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

try {
    database_manager& db = database_manager::handle();

    if (!db.set_mode(database_types::postgres)) {
        throw std::runtime_error("Failed to set database mode");
    }

    if (!db.connect(connection_string)) {
        throw std::runtime_error("Failed to connect to database");
    }

    auto result = db.select_query("SELECT * FROM users");
    // Process result

} catch (const std::exception& e) {
    std::cerr << "Database error: " << e.what() << std::endl;
}

Mock ๊ตฌํ˜„

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ, ์‹œ์Šคํ…œ์€ ๋นˆ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€๋งŒ ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚ค์ง€ ์•Š๋Š” mock ๊ตฌํ˜„์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

// Even without PostgreSQL libraries, this won't crash
database_manager& db = database_manager::handle();
db.set_mode(database_types::postgres);

if (!db.connect("mock://connection")) {
    // This will fail gracefully with mock implementation
    std::cout << "Mock connection - no actual database required" << std::endl;
}

auto result = db.select_query("SELECT * FROM users");
// Returns empty result with mock implementation

์˜ˆ์ œ

์™„์ „ํ•œ ์‚ฌ์šฉ ์˜ˆ์ œ

#include <database/database_manager.h>
#include <database/connection_pool.h>
#include <database/query_builder.h>
#include <iostream>

int main() {
    try {
        // Initialize database manager
        database_manager& db = database_manager::handle();

        // Configure PostgreSQL
        if (!db.set_mode(database_types::postgres)) {
            std::cerr << "Failed to set database mode" << std::endl;
            return 1;
        }

        // Setup connection pool
        connection_pool_config config;
        config.min_connections = 2;
        config.max_connections = 10;
        config.connection_string = "host=localhost port=5432 dbname=test user=admin password=secret";

        if (!db.create_connection_pool(database_types::postgres, config)) {
            std::cerr << "Failed to create connection pool" << std::endl;
            return 1;
        }

        // Create table using query builder
        auto create_table = db.create_query_builder()
            .create_raw("CREATE TABLE IF NOT EXISTS users ("
                       "id SERIAL PRIMARY KEY, "
                       "name VARCHAR(100) NOT NULL, "
                       "email VARCHAR(100) UNIQUE, "
                       "created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP)");

        // Insert data
        auto insert_query = db.create_query_builder()
            .insert_into("users")
            .values({
                {"name", database_value{std::string("John Doe")}},
                {"email", database_value{std::string("john@example.com")}}
            });

        // Select data with conditions
        auto select_query = db.create_query_builder()
            .select({"id", "name", "email", "created_at"})
            .from("users")
            .where("name", "LIKE", database_value{std::string("%John%")})
            .order_by("created_at", sort_order::desc)
            .limit(10);

        // Execute queries
        auto pool = db.get_connection_pool(database_types::postgres);
        auto connection = pool->acquire_connection();

        if (connection) {
            // Execute through connection
            auto result = select_query.execute(connection.get());

            // Process results
            for (const auto& row : result) {
                for (const auto& [column, value] : row) {
                    std::cout << column << ": ";
                    std::visit([](const auto& v) {
                        using T = std::decay_t<decltype(v)>;
                        if constexpr (std::is_same_v<T, std::monostate>) {
                            std::cout << "NULL";
                        } else {
                            std::cout << v;
                        }
                    }, value);
                    std::cout << " ";
                }
                std::cout << std::endl;
            }
        }

        // Monitor pool statistics
        auto stats = db.get_pool_stats();
        for (const auto& [db_type, stat] : stats) {
            std::cout << "Pool Stats - Active: " << stat.active_connections
                      << " Available: " << stat.available_connections << std::endl;
        }

    } catch (const std::exception& e) {
        std::cerr << "Error: " << e.what() << std::endl;
        return 1;
    }

    return 0;
}

๋‹ค์ค‘ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์˜ˆ์ œ

#include <database/database_manager.h>
#include <database/query_builder.h>

int main() {
    database_manager& db = database_manager::handle();

    // PostgreSQL operations
    auto pg_query = db.create_query_builder(database_types::postgres)
        .select({"id", "name"})
        .from("users")
        .where("status", "=", database_value{std::string("active")});

    std::cout << "PostgreSQL: " << pg_query.build() << std::endl;

    // MongoDB operations
    auto mongo_query = db.create_query_builder(database_types::mongodb)
        .collection("users")
        .find({{"status", database_value{std::string("active")}}})
        .project({"_id", "name"});

    std::cout << "MongoDB: " << mongo_query.build() << std::endl;

    // Redis operations
    auto redis_query = db.create_query_builder(database_types::redis)
        .hgetall("user:123");

    std::cout << "Redis: " << redis_query.build() << std::endl;

    return 0;
}

Phase 4: Enterprise APIs

ORM ํ”„๋ ˆ์ž„์›Œํฌ

#include <database/orm/entity.h>

// Entity definition
class User : public entity_base {
    ENTITY_TABLE("users")
    ENTITY_FIELD(int64_t, id, primary_key() | auto_increment())
    ENTITY_FIELD(std::string, username, not_null() | index("idx_username"))
    ENTITY_FIELD(std::string, email, unique())
    ENTITY_METADATA()
};

// Entity operations
entity_manager::instance().create_tables(db);
auto users = User::query(db).where("age > 18").execute();

์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง

#include <database/monitoring/performance_monitor.h>

// Performance monitoring
auto& monitor = performance_monitor::instance();
monitor.set_alert_thresholds(0.05, std::chrono::milliseconds(1000));
auto summary = monitor.get_performance_summary();

๋ณด์•ˆ ํ”„๋ ˆ์ž„์›Œํฌ

#include <database/security/secure_connection.h>

// Access control
auto& access = access_control::instance();
access.create_role(admin_role);
bool allowed = access.check_permission("user123", "users", "SELECT");

// Audit logging
AUDIT_LOG_ACCESS("user123", "session456", "SELECT", "users", "query_hash", true, "");

๋น„๋™๊ธฐ ์ž‘์—…

#include <database/async/async_operations.h>

// Coroutine support
database_awaitable<bool> async_operation() {
    auto result = co_await async_db.execute_coro("SELECT * FROM users");
    co_return result;
}

// Distributed transactions
auto& coordinator = transaction_coordinator::instance();
auto tx_id = coordinator.begin_distributed_transaction({db1, db2});

์‹œ์Šคํ…œ ์š”๊ตฌ์‚ฌํ•ญ

  • C++ ํ‘œ์ค€: C++20
  • ์ง€์› ์ปดํŒŒ์ผ๋Ÿฌ: GCC 10+, Clang 11+, MSVC 2019+
  • ์ง€์› ํ”Œ๋žซํผ: Windows, macOS, Linux

์ตœ์‹  API ์—…๋ฐ์ดํŠธ ๋ฐ ๋ณ€๊ฒฝ์‚ฌํ•ญ์€ CHANGELOG๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.


Last Updated: 2025-12-09