ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต - PostgreSQL ์ค์ ํ๋ก์ ํธ ์ ์ฉ ์ฌ๋ก
octo54 2025. 3. 10. 10:49๐ 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 ์ด์ ๋ฐ ์ ์ง๋ณด์ ์ ๋ต
'study > postgresql' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- fastapi
- REACT
- ์ฑ๋ด๊ฐ๋ฐ
- Page
- Python
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- Next.js
- nodejs
- Project
- Ktor
- babel
- ํ๋ก ํธ์๋
- ์น๊ฐ๋ฐ
- ๊ด๋ฆฌ์
- Docker
- Webpack
- AI์ฑ๋ด
- til
- ๋ฆฌ์กํธ
- LangChain
- nextJS
- kotlin
- ๋ฐฑ์๋๊ฐ๋ฐ
- PostgreSQL
- llm
- github
- rag
- ๋ก์ปฌLLM
- ํ์ด์ง
- ๋ฐฑ์๋
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |