| 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 |
SSOT: This document is the single source of truth for Database System API Reference.
Language: English | ํ๊ตญ์ด
๋ฉํฐ ๋ฐฑ์๋ ์ง์, ์ฐ๊ฒฐ ํ๋ง, ์ฟผ๋ฆฌ ๋น๋๋ฅผ ๊ฐ์ถ Database System C++20 ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์ ํ API ๋ ํผ๋ฐ์ค์ ๋๋ค.
- ํต์ฌ ํด๋์ค
- Database Manager
- ์ฐ๊ฒฐ ํ๋ง
- ์ฟผ๋ฆฌ ๋น๋
- ORM ํ๋ ์์ํฌ
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง
- ๋ณด์ ํ๋ ์์ํฌ
- ๋น๋๊ธฐ ์์
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์
- C++20 Concepts
- ์๋ฌ ์ฒ๋ฆฌ
- ์์
๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌํ์ ์ถ์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค.
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;
};๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฐ๊ฒฐ ๋ฐ ์์ ์ ๊ด๋ฆฌํ๋ ์ฑ๊ธํค ํด๋์ค์ ๋๋ค.
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();
};#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 |
์ฐ๊ฒฐ ํ์ ๊ตฌ์ฑ ๊ตฌ์กฐ์ฒด์ ๋๋ค.
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
};์ฐ๊ฒฐ ํ ๋ชจ๋ํฐ๋ง์ ์ํ ํต๊ณ ๊ตฌ์กฐ์ฒด์ ๋๋ค.
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
};์ฐ๊ฒฐ ํ์ ์ถ์ ๊ธฐ๋ณธ ํด๋์ค์ ๋๋ค.
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;
}๋ค์ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ ์ ์ ์ํ๋ ๋ฒ์ฉ ์ฟผ๋ฆฌ ๋น๋์ ๋๋ค.
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 ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ํ ํนํ๋ ์ฟผ๋ฆฌ ๋น๋์ ๋๋ค.
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๋ฅผ ์ํ ํนํ๋ ์ฟผ๋ฆฌ ๋น๋์ ๋๋ค.
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๋ฅผ ์ํ ํนํ๋ ์ฟผ๋ฆฌ ๋น๋์ ๋๋ค.
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์ง์๋๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ ์ ์ด๊ฑฐํ์ ๋๋ค.
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
};๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฐ์ ์ํ variant ํ์ ์ ๋๋ค.
using database_value = std::variant<std::string, int64_t, double, bool, std::monostate>;๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ฒฐ๊ณผ๋ฅผ ์ํ ํ์ ์ ์์ ๋๋ค.
using database_row = std::map<std::string, database_value>;
using database_result = std::vector<database_row>;// 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);database_system์ ์ปดํ์ผ ํ์ ํ์ ๊ฒ์ฆ์ ์ํ C++20 concepts๋ฅผ ์ ๊ณตํ์ฌ, ๋ ๋ช ํํ ์ค๋ฅ ๋ฉ์์ง, ์์ฒด ๋ฌธ์ํ ์ฝ๋, ๋ ๋์ IDE ์ง์์ ์ ๊ณตํฉ๋๋ค.
ํค๋: #include <database/core/concepts.h>
๋ค์์คํ์ด์ค: database::concepts
- ๋ ๋ช ํํ ์ค๋ฅ ๋ฉ์์ง: ํ ํ๋ฆฟ ์ค๋ฅ๊ฐ ์๋ฐฑ ์ค์ SFINAE ์คํจ ๋์ concept ์๋ฐ์ผ๋ก ํ์๋จ
- ์์ฒด ๋ฌธ์ํ ์ฝ๋: Concepts๊ฐ ํ์ ์๊ตฌ์ฌํญ์ ๋ช ์์ ์ผ๋ก ํํ
- ๋ ๋์ IDE ์ง์: ๋ ์ ํํ ์๋ ์์ฑ ๋ฐ ํ์ ํํธ
- ์ฝ๋ ๋จ์ํ:
std::enable_if๋ณด์ผ๋ฌํ๋ ์ดํธ ์ ๊ฑฐ
| 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() |
| 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() |
| Concept | ์ค๋ช | ์๊ทธ๋์ฒ |
|---|---|---|
StreamEventHandler<F, EventType> |
์คํธ๋ฆผ ์ด๋ฒคํธ ์ฒ๋ฆฌ | void F(const EventType&) |
StreamEventFilter<F, EventType> |
์คํธ๋ฆผ ์ด๋ฒคํธ ํํฐ๋ง | bool F(const EventType&) |
| Concept | ์ค๋ช | ์ฉ๋ |
|---|---|---|
TransactionAction<F> |
ํธ๋์ญ์ ์ก์ | Saga ํจํด ์ ๋ฐฉํฅ ์ก์ |
CompensationAction<F> |
๋ณด์ (๋กค๋ฐฑ) ์ก์ | Saga ํจํด ๋กค๋ฐฑ ์ก์ |
| Concept | ์ค๋ช | ์ฉ๋ |
|---|---|---|
SubmittableTask<F, Args...> |
๋น๋๊ธฐ executor ์ ์ถ์ฉ ํธ์ถ ๊ฐ๋ฅ | async_executor.submit() |
VoidTask<F, Args...> |
Fire-and-forget ํธ์ถ ๊ฐ๋ฅ | ๋ฐฑ๊ทธ๋ผ์ด๋ ํ์คํฌ |
| 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;
});#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";
});#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(
[]() { /* ์ฌ๊ณ ์์ฝ */ },
[]() { /* ์ฌ๊ณ ํด์ */ }
);๋ค์ ๋ฉ์๋๋ค์ ์ด์ 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 ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค.
// 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;
}#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