Skip to content

Latest commit

ย 

History

History
327 lines (242 loc) ยท 10 KB

File metadata and controls

327 lines (242 loc) ยท 10 KB

CI Code Coverage Static Analysis Doxygen codecov License

Database System

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

ORM ํ”„๋ ˆ์ž„์›Œํฌ, ์‹ค์‹œ๊ฐ„ ์„ฑ๋Šฅ ๋ชจ๋‹ˆํ„ฐ๋ง, ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์„ ํฌํ•จํ•œ ํ˜„๋Œ€์ ์ธ C++20 ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ถ”์ƒํ™” ๋ ˆ์ด์–ด์ž…๋‹ˆ๋‹ค.

๋ชฉ์ฐจ


๊ฐœ์š”

Database System์€ PostgreSQL, SQLite, MongoDB, Redis๋ฅผ ํ†ตํ•ฉ๋œ ํƒ€์ž… ์•ˆ์ „ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ์ง€์›ํ•˜๋Š” ํฌ๊ด„์ ์ธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ฐ€์น˜: ๋ฒค๋” ์ข…์†์„ฑ ์ œ๊ฑฐ, ์„ฑ๋Šฅ ๊ทน๋Œ€ํ™”, ํ†ตํ•ฉ ํƒ€์ž… ์•ˆ์ „ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ๊ฐœ๋ฐœ ๊ฐ€์†ํ™”.

์—ฐ๊ฒฐ ๋ชจ๋“œ ์ƒํƒœ:

  • DirectMode: ํ”„๋กœ๋•์…˜ ์ค€๋น„ ์™„๋ฃŒ (์•ˆ์ •)
  • ProxyMode: ์Šคํ… ๊ตฌํ˜„ (database_server ๋Œ€๊ธฐ ์ค‘)

์ตœ์‹  ์—…๋ฐ์ดํŠธ:

  • C++20 ๋ชจ๋“ˆ ์ง€์› ์ถ”๊ฐ€ (kcenon.database ๋ชจ๋“ˆ)
  • ๋กœ์ปฌ ์—ฐ๊ฒฐ ํ’€๋ง ์ œ๊ฑฐ (Phase 4.3) - ProxyMode ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜
  • C++20 Concepts ํ†ตํ•ฉ (SubmittableTask, ErrorHandler, QueryCallback)
  • monitoring_system ํ†ตํ•ฉ
  • ๋ถˆ๋ณ€ ์ฟผ๋ฆฌ ๋นŒ๋” ์ถ”๊ฐ€

์ฃผ์š” ๊ธฐ๋Šฅ

๊ธฐ๋Šฅ ์„ค๋ช… ์ƒํƒœ
PostgreSQL ๋ฐฑ์—”๋“œ libpqxx ๊ธฐ๋ฐ˜ ์ „์ฒด ์ง€์› ์•ˆ์ •
SQLite ๋ฐฑ์—”๋“œ ๊ฒฝ๋Ÿ‰ ๋กœ์ปฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ˆ์ •
MongoDB ๋ฐฑ์—”๋“œ NoSQL ๋ฌธ์„œ ์ €์žฅ์†Œ ์‹คํ—˜์ 
Redis ๋ฐฑ์—”๋“œ ํ‚ค-๊ฐ’ ์บ์‹œ ์ €์žฅ์†Œ ์‹คํ—˜์ 
ORM ํ”„๋ ˆ์ž„์›Œํฌ C++20 Concepts ๊ธฐ๋ฐ˜ ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘ ์•ˆ์ •
๋ถˆ๋ณ€ ์ฟผ๋ฆฌ ๋นŒ๋” ์Šค๋ ˆ๋“œ ์•ˆ์ „ ํ•จ์ˆ˜ํ˜• ์ฟผ๋ฆฌ ๊ตฌ์„ฑ ์•ˆ์ •
๋ฐฑ์—”๋“œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ๋Ÿฐํƒ€์ž„ ๋ฐฑ์—”๋“œ ์„ ํƒ ํŒฉํ† ๋ฆฌ ์•ˆ์ •
ํ†ตํ•ฉ DB ์‹œ์Šคํ…œ ์ œ๋กœ ์„ค์ • ์ง„์ž…์  (๋นŒ๋” ํŒจํ„ด) ์•ˆ์ •
๋น„๋™๊ธฐ ์—ฐ์‚ฐ ์Šค๋ ˆ๋“œ ํ’€ ๊ธฐ๋ฐ˜ ๋น„๋™๊ธฐ ์ฟผ๋ฆฌ ์•ˆ์ •
C++20 ๋ชจ๋“ˆ ๋ชจ๋“ˆ ์ž„ํฌํŠธ ์ง€์› ์‹คํ—˜์ 

์š”๊ตฌ์‚ฌํ•ญ

์ปดํŒŒ์ผ๋Ÿฌ ๋งคํŠธ๋ฆญ์Šค

์ปดํŒŒ์ผ๋Ÿฌ ์ตœ์†Œ ๋ฒ„์ „ ๋น„๊ณ 
GCC 13+ thread_system ์ „์ด ์˜์กด์„ฑ
Clang 17+ thread_system ์ „์ด ์˜์กด์„ฑ
Apple Clang 14+ macOS ์ง€์›
MSVC 2022+ C++20 ๊ธฐ๋Šฅ ํ•„์ˆ˜

๋นŒ๋“œ ๋„๊ตฌ ๋ฐ ์˜์กด์„ฑ

์˜์กด์„ฑ ๋ฒ„์ „ ํ•„์ˆ˜ ์„ค๋ช…
CMake 3.20+ ์˜ˆ ๋นŒ๋“œ ์‹œ์Šคํ…œ
common_system latest ์˜ˆ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค ๋ฐ Result
thread_system latest ์•„๋‹ˆ์˜ค ๋น„๋™๊ธฐ ์—ฐ์‚ฐ์šฉ ์Šค๋ ˆ๋“œ ํ’€
container_system latest ์•„๋‹ˆ์˜ค ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”
monitoring_system latest ์•„๋‹ˆ์˜ค ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ

๋ฐฑ์—”๋“œ๋ณ„ ์˜์กด์„ฑ

๋ฐฑ์—”๋“œ ์˜์กด์„ฑ ๋ฒ„์ „
PostgreSQL libpqxx 7.9.2
SQLite sqlite3 3.45.0+
MongoDB mongo-cxx-driver 3.8.0+
Redis hiredis 1.2.0+

๋น ๋ฅธ ์‹œ์ž‘

#include <database/integrated/unified_database_system.h>

int main() {
    // ํ†ตํ•ฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ (์ œ๋กœ ์„ค์ •)
    auto db = kcenon::database::unified_database_system::builder()
        .backend("postgresql")
        .connection_string("host=localhost dbname=mydb")
        .build();

    // ์ฟผ๋ฆฌ ์‹คํ–‰
    auto result = db->execute("SELECT * FROM users WHERE active = true");
    if (result.is_ok()) {
        for (const auto& row : result.value()) {
            // ๊ฒฐ๊ณผ ์ฒ˜๋ฆฌ
        }
    }

    return 0;
}

์„ค์น˜

์˜์กด์„ฑ๊ณผ ํ•จ๊ป˜ ๋นŒ๋“œ

# ์ƒํƒœ๊ณ„ ์˜์กด์„ฑ ์„ค์น˜
./scripts/dependency.sh

# ๋นŒ๋“œ
./scripts/build.sh

CMake ์ˆ˜๋™ ๋นŒ๋“œ

cmake -B build -DCMAKE_BUILD_TYPE=Release -DUSE_POSTGRESQL=ON
cmake --build build

CMake ์˜ต์…˜

์˜ต์…˜ ๊ธฐ๋ณธ๊ฐ’ ์„ค๋ช…
USE_POSTGRESQL ON PostgreSQL ๋ฐฑ์—”๋“œ
USE_SQLITE OFF SQLite ๋ฐฑ์—”๋“œ
USE_MONGODB OFF MongoDB ๋ฐฑ์—”๋“œ
USE_REDIS OFF Redis ๋ฐฑ์—”๋“œ
USE_THREAD_SYSTEM ON ์Šค๋ ˆ๋“œ ํ’€ ํ†ตํ•ฉ
USE_MONITORING_SYSTEM ON ๋ชจ๋‹ˆํ„ฐ๋ง ํ†ตํ•ฉ

์•„ํ‚คํ…์ฒ˜

๋ชจ๋“ˆ ๊ตฌ์กฐ

database/
  core/           - ๋ฐฑ์—”๋“œ ์ธํ„ฐํŽ˜์ด์Šค, CRTP ๋ฒ ์ด์Šค, backend_registry, concepts
  backends/       - postgresql, sqlite, mongodb, redis ๊ตฌํ˜„
  query/          - immutable_query_builder (์Šค๋ ˆ๋“œ ์•ˆ์ „, ํ•จ์ˆ˜ํ˜•)
  query_builder/  - condition_builder, join_builder, sql_dialect
  orm/            - entity.h (ENTITY_TABLE, ENTITY_FIELD ๋งคํฌ๋กœ)
  integrated/     - unified_database_system (์ œ๋กœ ์„ค์ • ์ง„์ž…์ )
  async/          - async_operations
  monitoring/     - performance_monitor, pool_metrics
  security/       - secure_connection (TLS/SSL)

์˜์กด์„ฑ ํ๋ฆ„

database_system
+-- common_system (ํ•„์ˆ˜)
+-- thread_system (์„ ํƒ)
+-- container_system (์„ ํƒ)
+-- monitoring_system (์„ ํƒ)

ํ•ต์‹ฌ ๊ฐœ๋…

๋ถˆ๋ณ€ ์ฟผ๋ฆฌ ๋นŒ๋” (Immutable Query Builder)

์Šค๋ ˆ๋“œ ์•ˆ์ „ํ•œ ํ•จ์ˆ˜ํ˜• ์Šคํƒ€์ผ์˜ ์ฟผ๋ฆฌ ๊ตฌ์„ฑ:

auto query = kcenon::database::immutable_query_builder()
    .select({"name", "email"})
    .from("users")
    .where("active = true")
    .order_by("name")
    .build();

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

C++20 Concepts ๊ธฐ๋ฐ˜ ์—”ํ‹ฐํ‹ฐ ๋งคํ•‘:

struct User : kcenon::database::entity_base {
    ENTITY_TABLE("users")
    ENTITY_FIELD(std::string, name, "name", primary_key)
    ENTITY_FIELD(std::string, email, "email", not_null)
    ENTITY_FIELD(bool, active, "active", default_value(true))
};

๋ฐฑ์—”๋“œ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ (Backend Registry)

ํŒฉํ† ๋ฆฌ ํŒจํ„ด์œผ๋กœ ๋Ÿฐํƒ€์ž„ ๋ฐฑ์—”๋“œ ์„ ํƒ (#ifdef ์—†์ด):

auto& registry = kcenon::database::backend_registry::instance();
auto backend = registry.create("postgresql", config);

ํ†ตํ•ฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‹œ์Šคํ…œ

๋นŒ๋” ํŒจํ„ด์˜ ์ œ๋กœ ์„ค์ • ์ง„์ž…์ ์œผ๋กœ, ๋ฐฑ์—”๋“œ ์„ค์ •, ์—ฐ๊ฒฐ, ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ž๋™์œผ๋กœ ๊ตฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.


API ๊ฐœ์š”

API ํ—ค๋” ์„ค๋ช…
database_backend core/database_backend.h ์ˆœ์ˆ˜ ๊ฐ€์ƒ ๋ฐฑ์—”๋“œ ์ธํ„ฐํŽ˜์ด์Šค
backend_registry core/backend_registry.h ๋Ÿฐํƒ€์ž„ ๋ฐฑ์—”๋“œ ํŒฉํ† ๋ฆฌ
unified_database_system integrated/unified_database_system.h ์ œ๋กœ ์„ค์ • ์ง„์ž…์ 
immutable_query_builder query/immutable_query_builder.h ์Šค๋ ˆ๋“œ ์•ˆ์ „ ์ฟผ๋ฆฌ ๋นŒ๋”
entity_base orm/entity.h ORM ์—”ํ‹ฐํ‹ฐ ๊ธฐ๋ฐ˜
async_operations async/async_operations.h ๋น„๋™๊ธฐ ์—ฐ์‚ฐ

์˜ˆ์ œ

์˜ˆ์ œ ๋‚œ์ด๋„ ์„ค๋ช…
basic_query ์ดˆ๊ธ‰ ๊ธฐ๋ณธ SQL ์ฟผ๋ฆฌ ์‹คํ–‰
orm_example ์ค‘๊ธ‰ ORM ์—”ํ‹ฐํ‹ฐ CRUD
query_builder ์ค‘๊ธ‰ ๋ถˆ๋ณ€ ์ฟผ๋ฆฌ ๋นŒ๋” ์‚ฌ์šฉ
multi_backend ๊ณ ๊ธ‰ ๋‹ค์ค‘ ๋ฐฑ์—”๋“œ ์ „ํ™˜
async_operations ๊ณ ๊ธ‰ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ฐ์‚ฐ

์„ฑ๋Šฅ

ํ’ˆ์งˆ ๋ฉ”ํŠธ๋ฆญ

  • ๋ชจ๋“  CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์ •์ƒ (๋ชจ๋“  ํ”Œ๋žซํผ)
  • ThreadSanitizer / AddressSanitizer ํด๋ฆฐ
  • C++20 Concepts๋ฅผ ํ™œ์šฉํ•œ ์ปดํŒŒ์ผ ํƒ€์ž„ ํƒ€์ž… ๊ฒ€์ฆ
  • RAII ๊ธฐ๋ฐ˜ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

๋ฐฑ์—”๋“œ๋ณ„ ํŠน์„ฑ

๋ฐฑ์—”๋“œ ์ตœ์  ์‚ฌ์šฉ์ฒ˜ ๋น„๊ณ 
PostgreSQL ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ OLTP ์ „์ฒด ๊ธฐ๋Šฅ ์ง€์›
SQLite ์ž„๋ฒ ๋””๋“œ/๋กœ์ปฌ ๊ฒฝ๋Ÿ‰, ์„ค์ • ๋ถˆํ•„์š”
MongoDB ๋ฌธ์„œ ์ €์žฅ์†Œ ์‹คํ—˜์ 
Redis ์บ์‹œ/์„ธ์…˜ ์‹คํ—˜์ 

์ƒํƒœ๊ณ„ ํ†ตํ•ฉ

์˜์กด์„ฑ ๊ณ„์ธต

common_system      (Tier 0) [ํ•„์ˆ˜]
thread_system      (Tier 1) [์„ ํƒ]
container_system   (Tier 1) [์„ ํƒ]
monitoring_system  (Tier 2) [์„ ํƒ]
database_system    (Tier 3) <-- ์ด ํ”„๋กœ์ ํŠธ

ํ†ตํ•ฉ ํ”„๋กœ์ ํŠธ

ํ”„๋กœ์ ํŠธ ๊ด€๊ณ„
common_system ํ•„์ˆ˜ ์˜์กด์„ฑ
thread_system ๋น„๋™๊ธฐ ์—ฐ์‚ฐ
container_system ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™”
monitoring_system ์„ฑ๋Šฅ ๋ฉ”ํŠธ๋ฆญ
pacs_system ํ•˜์œ„ ์†Œ๋น„์ž

ํ”Œ๋žซํผ ์ง€์›

ํ”Œ๋žซํผ ์ปดํŒŒ์ผ๋Ÿฌ ์ƒํƒœ
Linux GCC 13+, Clang 17+ ์™„์ „ ์ง€์›
macOS Apple Clang 14+ ์™„์ „ ์ง€์›
Windows MSVC 2022+ ์™„์ „ ์ง€์›

๊ธฐ์—ฌํ•˜๊ธฐ

๊ธฐ์—ฌ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค! ์ž์„ธํ•œ ๋‚ด์šฉ์€ ๊ธฐ์—ฌ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  1. ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ํฌํฌ
  2. ๊ธฐ๋Šฅ ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ
  3. ํ…Œ์ŠคํŠธ์™€ ํ•จ๊ป˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ž‘์„ฑ
  4. ๋กœ์ปฌ์—์„œ ํ…Œ์ŠคํŠธ ์‹คํ–‰
  5. Pull Request ์—ด๊ธฐ

๋ผ์ด์„ ์Šค

์ด ํ”„๋กœ์ ํŠธ๋Š” BSD 3-Clause ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค - ์ž์„ธํ•œ ๋‚ด์šฉ์€ LICENSE ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜์„ธ์š”.


Made with โค๏ธ by ๐Ÿ€โ˜€๐ŸŒ•๐ŸŒฅ ๐ŸŒŠ