ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ฐ˜์‘ํ˜•

๐Ÿ“Œ PostgreSQL๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ: ์ด๋ก ๊ณผ ์‹ค์Šต

5.1 PostgreSQL ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์ ์šฉ ์‚ฌ๋ก€

PostgreSQL์€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜, ๋ฐ์ดํ„ฐ ๋ถ„์„, ๋น…๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, ๊ธˆ์œต ์‹œ์Šคํ…œ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ํ™œ์šฉ๋ฉ๋‹ˆ๋‹ค.
์ด๋ฒˆ ๊ธ€์—์„œ๋Š” PostgreSQL์ด ์‹ค์ œ ํ”„๋กœ์ ํŠธ์—์„œ ์–ด๋–ป๊ฒŒ ์ ์šฉ๋˜๋Š”์ง€๋ฅผ ์•Œ์•„๋ณด๊ณ ,
๊ฐ ์‚ฌ๋ก€์—์„œ ์‚ฌ์šฉ๋œ ์ฃผ์š” ๊ธฐ๋Šฅ๊ณผ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ์†Œ๊ฐœํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.


5.1.1 PostgreSQL์ด ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์š” ๋ถ„์•ผ

โœ… ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
โœ… ๋น…๋ฐ์ดํ„ฐ ๋ฐ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ถ„์„
โœ… ํ•€ํ…Œํฌ ๋ฐ ๊ธˆ์œต ์„œ๋น„์Šค
โœ… IoT ๋ฐ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ
โœ… GIS(๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ) ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ
โœ… ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ (Full-Text Search ํ™œ์šฉ)

๊ฐ ๋ถ„์•ผ๋ณ„๋กœ PostgreSQL์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


5.1.2 ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฑ์—”๋“œ์—์„œ์˜ PostgreSQL ํ™œ์šฉ

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” ์‚ฌ์šฉ์ž ์ธ์ฆ, ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๊ด€๋ฆฌ ๋“ฑ์˜ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด
PostgreSQL์ด ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

โœ… ์ฃผ์š” ํ™œ์šฉ ๊ธฐ๋Šฅ

๐Ÿ”น JSONB๋ฅผ ํ™œ์šฉํ•œ ์œ ์—ฐํ•œ ๋ฐ์ดํ„ฐ ์ €์žฅ
๐Ÿ”น Foreign Key์™€ JOIN์„ ์ด์šฉํ•œ ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ ๋ชจ๋ธ
๐Ÿ”น Full-Text Search๋ฅผ ์ด์šฉํ•œ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ ๊ตฌํ˜„
๐Ÿ”น INDEX ์ตœ์ ํ™”๋ฅผ ํ†ตํ•œ ๋น ๋ฅธ ์กฐํšŒ

๐Ÿ”น ์‚ฌ์šฉ์ž ์ธ์ฆ ์‹œ์Šคํ…œ ์˜ˆ์ œ

CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(100) UNIQUE NOT NULL,
    password_hash TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

โœ… UNIQUE ์ œ์•ฝ ์กฐ๊ฑด์„ ์‚ฌ์šฉํ•˜์—ฌ ์ค‘๋ณต ๋ฐฉ์ง€
โœ… password_hash๋ฅผ ์ €์žฅํ•˜์—ฌ ๋ณด์•ˆ ๊ฐ•ํ™”

CREATE INDEX idx_users_email ON users(email);

โœ… ์ด๋ฉ”์ผ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ์†๋„๋ฅผ ๋†’์ด๊ธฐ ์œ„ํ•ด ์ธ๋ฑ์Šค ์ถ”๊ฐ€

๐Ÿ’ก Django, Node.js, Spring Boot ๋“ฑ์˜ ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ PostgreSQL๊ณผ ์‰ฝ๊ฒŒ ์—ฐ๋™ ๊ฐ€๋Šฅ


5.1.3 ๋น…๋ฐ์ดํ„ฐ ๋ฐ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ ๋ถ„์„

๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๋ถ„์„ ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ณ ์„ฑ๋Šฅ ์ฟผ๋ฆฌ ์‹คํ–‰๊ณผ ํ™•์žฅ์„ฑ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
PostgreSQL์€ ํŒŒํ‹ฐ์…”๋‹(Partitioning)๊ณผ ๋ณ‘๋ ฌ ์ฟผ๋ฆฌ(Parallel Query) ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๋น…๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์ฃผ์š” ํ™œ์šฉ ๊ธฐ๋Šฅ

๐Ÿ”น Partitioning์„ ์‚ฌ์šฉํ•œ ํ…Œ์ด๋ธ” ๋ถ„ํ•  ์ €์žฅ
๐Ÿ”น Parallel Query๋ฅผ ํ†ตํ•œ ์„ฑ๋Šฅ ํ–ฅ์ƒ
๐Ÿ”น Foreign Data Wrapper(FDW)๋ฅผ ํ™œ์šฉํ•œ ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ ์—ฐ๋™

๐Ÿ”น ํŒŒํ‹ฐ์…”๋‹์„ ํ™œ์šฉํ•œ ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ

CREATE TABLE logs (
    id SERIAL PRIMARY KEY,
    event_time TIMESTAMP NOT NULL,
    user_id INT NOT NULL,
    event_type TEXT NOT NULL
) PARTITION BY RANGE (event_time);

โœ… PARTITION BY RANGE๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ๋ถ„์‚ฐ ์ €์žฅ

CREATE TABLE logs_2023 PARTITION OF logs FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');
CREATE TABLE logs_2024 PARTITION OF logs FOR VALUES FROM ('2024-01-01') TO ('2024-12-31');

โœ… ์—ฐ๋„๋ณ„๋กœ ํ…Œ์ด๋ธ”์„ ๋‚˜๋ˆ„์–ด ์ €์žฅํ•˜์—ฌ ๊ฒ€์ƒ‰ ์„ฑ๋Šฅ ํ–ฅ์ƒ

๐Ÿ’ก ๋น…๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ์‹œ Citus ํ™•์žฅ ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•˜๋ฉด PostgreSQL์„ ๋”์šฑ ํ™•์žฅ ๊ฐ€๋Šฅ


5.1.4 ํ•€ํ…Œํฌ ๋ฐ ๊ธˆ์œต ์„œ๋น„์Šค์—์„œ์˜ PostgreSQL ํ™œ์šฉ

๊ธˆ์œต ์‹œ์Šคํ…œ์—์„œ๋Š” ๊ณ ๊ฐ€์šฉ์„ฑ(HA), ๊ฐ•๋ ฅํ•œ ๋ณด์•ˆ, ํŠธ๋žœ์žญ์…˜ ๋ฌด๊ฒฐ์„ฑ์ด ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
PostgreSQL์€ MVCC์™€ ACID ํŠธ๋žœ์žญ์…˜์„ ํ†ตํ•ด ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

โœ… ์ฃผ์š” ํ™œ์šฉ ๊ธฐ๋Šฅ

๐Ÿ”น ACID ํŠธ๋žœ์žญ์…˜์„ ํ†ตํ•œ ๊ธˆ์œต ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ
๐Ÿ”น MVCC๋ฅผ ํ™œ์šฉํ•œ ๋™์‹œ์„ฑ ์ œ์–ด
๐Ÿ”น PITR(Point-In-Time Recovery)๋ฅผ ํ†ตํ•œ ์žฅ์•  ๋ณต๊ตฌ
๐Ÿ”น ์•”ํ˜ธํ™” ๋ฐ ์ ‘๊ทผ ์ œ์–ด๋ฅผ ํ†ตํ•œ ๋ณด์•ˆ ๊ฐ•ํ™”

๐Ÿ”น ๊ธˆ์œต ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌ ์˜ˆ์ œ

BEGIN;

UPDATE accounts SET balance = balance - 100 WHERE user_id = 1;
UPDATE accounts SET balance = balance + 100 WHERE user_id = 2;

COMMIT;

โœ… ํŠธ๋žœ์žญ์…˜์„ ํ™œ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ •ํ•ฉ์„ฑ์„ ์œ ์ง€

๐Ÿ’ก ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” WAL(Write-Ahead Logging) ๋ฐ Streaming Replication์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๋ณต๊ตฌ ๋ฐ ๋ณต์ œ ๊ฐ€๋Šฅ


5.1.5 IoT ๋ฐ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ

IoT(Internet of Things) ์„œ๋น„์Šค์—์„œ๋Š” ๋Œ€๋Ÿ‰์˜ ์„ผ์„œ ๋ฐ์ดํ„ฐ ๋ฐ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
PostgreSQL์€ TimescaleDB ํ™•์žฅ ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•˜์—ฌ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ๋ฅผ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์ฃผ์š” ํ™œ์šฉ ๊ธฐ๋Šฅ

๐Ÿ”น TimescaleDB๋ฅผ ์ด์šฉํ•œ ๊ณ ์„ฑ๋Šฅ ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
๐Ÿ”น ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๋ฐ ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ ์ €์žฅ ์ตœ์ ํ™”
๐Ÿ”น BRIN ์ธ๋ฑ์Šค๋ฅผ ํ™œ์šฉํ•œ ์ €์žฅ ๊ณต๊ฐ„ ์ ˆ์•ฝ

๐Ÿ”น TimescaleDB ํ™œ์šฉ ์˜ˆ์ œ

CREATE EXTENSION IF NOT EXISTS timescaledb;

CREATE TABLE sensor_data (
    time TIMESTAMPTZ NOT NULL,
    device_id INT NOT NULL,
    temperature DOUBLE PRECISION,
    humidity DOUBLE PRECISION
);

SELECT create_hypertable('sensor_data', 'time');

โœ… create_hypertable()์„ ์‚ฌ์šฉํ•˜์—ฌ ์ž๋™ ํŒŒํ‹ฐ์…”๋‹ ์ ์šฉ

๐Ÿ’ก ์‹œ๊ณ„์—ด ๋ฐ์ดํ„ฐ ์ €์žฅ ์‹œ BRIN Index๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ €์žฅ ๊ณต๊ฐ„์„ ์ ˆ์•ฝํ•˜๋ฉด์„œ ๋น ๋ฅธ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ


5.1.6 GIS(๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ) ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ

PostgreSQL์˜ PostGIS ํ™•์žฅ ๋ชจ๋“ˆ์„ ํ™œ์šฉํ•˜๋ฉด ์ง€๋„ ๊ธฐ๋ฐ˜ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋ฐ ์œ„์น˜ ์ •๋ณด๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ์ฃผ์š” ํ™œ์šฉ ๊ธฐ๋Šฅ

๐Ÿ”น PostGIS ํ™•์žฅ์„ ํ™œ์šฉํ•œ ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ ์ €์žฅ
๐Ÿ”น ST_DWithin()์„ ์ด์šฉํ•œ ๊ฑฐ๋ฆฌ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰
๐Ÿ”น ST_Contains()๋ฅผ ํ™œ์šฉํ•œ ์œ„์น˜ ํฌํ•จ ์—ฌ๋ถ€ ํ™•์ธ

๐Ÿ”น PostGIS๋ฅผ ํ™œ์šฉํ•œ ๊ณต๊ฐ„ ๊ฒ€์ƒ‰

SELECT name FROM locations 
WHERE ST_DWithin(geom, ST_GeomFromText('POINT(127.5 37.5)', 4326), 5000);

โœ… ํŠน์ • ์ขŒํ‘œ์—์„œ 5km ์ด๋‚ด์˜ ์žฅ์†Œ ๊ฒ€์ƒ‰

๐Ÿ’ก PostGIS๋Š” ์ง€๋„ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค, ๋‚ด๋น„๊ฒŒ์ด์…˜, ๋ถ€๋™์‚ฐ ๊ฒ€์ƒ‰ ์‹œ์Šคํ…œ ๋“ฑ์— ํ™œ์šฉ ๊ฐ€๋Šฅ


5.1.7 PostgreSQL ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์ ์šฉ ์š”์•ฝ

๋ถ„์•ผ ์ฃผ์š” ํ™œ์šฉ ๊ธฐ๋Šฅ

์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ JSONB, ์™ธ๋ถ€ ์ธ์ฆ, Full-Text Search
๋น…๋ฐ์ดํ„ฐ ๋ถ„์„ ํŒŒํ‹ฐ์…”๋‹, Parallel Query, FDW
ํ•€ํ…Œํฌ ACID ํŠธ๋žœ์žญ์…˜, PITR ๋ฐฑ์—…, MVCC
IoT ๋ฐ ๋กœ๊ทธ ์ €์žฅ TimescaleDB, BRIN Index
GIS ๋ฐ ์ง€๋„ ์„œ๋น„์Šค PostGIS, ๊ณต๊ฐ„ ๋ฐ์ดํ„ฐ ๊ฒ€์ƒ‰

๐Ÿ’ก ๊ฐ ํ”„๋กœ์ ํŠธ์—์„œ PostgreSQL์˜ ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์„ ํ™œ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ๊ณผ ํ™•์žฅ์„ฑ์„ ๊ทน๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ์Œ


5.1.8 ๊ฒฐ๋ก : PostgreSQL์„ ์‹ค์ „์—์„œ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•

โœ… ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ๋Š” JSONB ๋ฐ Full-Text Search ์ ๊ทน ํ™œ์šฉ
โœ… ๋น…๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์—๋Š” Partitioning๊ณผ FDW๋กœ ํ™•์žฅ์„ฑ ํ™•๋ณด
โœ… ๊ธˆ์œต ์„œ๋น„์Šค์—์„œ๋Š” ํŠธ๋žœ์žญ์…˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ๋ณด์•ˆ์„ ์ตœ์šฐ์„ 
โœ… IoT ๋ฐ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ๋Š” TimescaleDB๋กœ ์ตœ์ ํ™”
โœ… ์ง€๋„ ์„œ๋น„์Šค ๋ฐ ์œ„์น˜ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰์—๋Š” PostGIS ์ ์šฉ

์ด์ œ PostgreSQL์˜ ์‹ค์ „ ํ”„๋กœ์ ํŠธ ํ™œ์šฉ ์‚ฌ๋ก€๋ฅผ ์ตํ˜”์Šต๋‹ˆ๋‹ค!
๋‹ค์Œ ๊ธ€์—์„œ๋Š” PostgreSQL ์šด์˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์ „๋žต์„ ๋‹ค๋ฃจ๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿš€


๐Ÿ”Ž ๋‹ค์Œ ๊ธ€ ์˜ˆ๊ณ : PostgreSQL ์šด์˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์ „๋žต

๐Ÿ“Œ ๋‹ค์Œ ํŽธ: 5.2 PostgreSQL ์šด์˜ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ์ „๋žต

 

๋ฐ˜์‘ํ˜•
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
Total
Today
Yesterday
๋งํฌ
ยซ   2025/03   ยป
์ผ ์›” ํ™” ์ˆ˜ ๋ชฉ ๊ธˆ ํ† 
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•