ํฐ์คํ ๋ฆฌ ๋ทฐ
๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต - PostgreSQL ๊ณ ๊ธ ๊ธฐ๋ฅ ๋ฐ ํ์ฅ ๋ชจ๋ ํ์ฉ
octo54 2025. 3. 10. 10:30๐ PostgreSQL๋ก ์์ํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ด๋ฆฌ: ์ด๋ก ๊ณผ ์ค์ต
4.1 PostgreSQL ๊ณ ๊ธ ๊ธฐ๋ฅ ๋ฐ ํ์ฅ ๋ชจ๋ ํ์ฉ
PostgreSQL์ ์คํ์์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ค์์๋ ๊ฐ์ฅ ๊ฐ๋ ฅํ ํ์ฅ์ฑ์ ์ ๊ณตํ๋ฉฐ,
๋ค์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ๊ณผ ํ์ฅ ๋ชจ๋์ ํ์ฉํ๋ฉด ๋ฐ์ดํฐ ์ฒ๋ฆฌ ์ฑ๋ฅ๊ณผ ๊ธฐ๋ฅ์ ๊ทน๋ํํ ์ ์์ต๋๋ค.
์ด๋ฒ ๊ธ์์๋ PostgreSQL์ ๊ณ ๊ธ ๊ธฐ๋ฅ๊ณผ ํ์ ํ์ฅ ๋ชจ๋์ ์๊ฐํ๊ณ , ์ค๋ฌด์์ ์ด๋ป๊ฒ ํ์ฉํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
4.1.1 PostgreSQL์ ์ฃผ์ ๊ณ ๊ธ ๊ธฐ๋ฅ
PostgreSQL์ ๊ธฐ๋ณธ์ ์ธ SQL ๊ธฐ๋ฅ ์ธ์๋ ๋ค์ํ ๊ณ ๊ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
์๋๋ PostgreSQL์์ ์์ฃผ ์ฌ์ฉ๋๋ ๊ณ ๊ธ ๊ธฐ๋ฅ ๋ชฉ๋ก์
๋๋ค.
โ
์คํ ์ด๋ ํ๋ก์์ ๋ฐ ํจ์ (PL/pgSQL)
โ
JSON/JSONB๋ฅผ ์ด์ฉํ NoSQL ๊ธฐ๋ฅ
โ
Full-Text Search (์ ๋ฌธ ๊ฒ์ ๊ธฐ๋ฅ)
โ
ํํฐ์
๋(Partitioning)๊ณผ ์ค๋ฉ(Sharding)
โ
์ธ๋ถ ๋ฐ์ดํฐ ์ฐ๋ (FDW - Foreign Data Wrapper)
โ
PostGIS๋ฅผ ํ์ฉํ ๊ณต๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ(GIS ๋ฐ์ดํฐ๋ฒ ์ด์ค)
4.1.2 ์คํ ์ด๋ ํ๋ก์์ ๋ฐ ํจ์ (PL/pgSQL)
PostgreSQL์ PL/pgSQL์ด๋ผ๋ SQL ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํ์ฌ
SQL ๋ฌธ์ ๋ณด๋ค ๊ฐ๋ ฅํ๊ฒ ํ์ฅํ ์ ์์ต๋๋ค.
๐น PL/pgSQL ํจ์ ์์
CREATE FUNCTION add_numbers(a INTEGER, b INTEGER) RETURNS INTEGER AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;
โ ์ฌ์ฉ์ ์ ์ ํจ์๋ฅผ ์์ฑํ์ฌ SQL ๋ฌธ์์ ํธ์ถ ๊ฐ๋ฅ
SELECT add_numbers(10, 20);
โ ๊ฒฐ๊ณผ: 30
๐ก PL/pgSQL์ ์ฌ์ฉํ๋ฉด ํธ๋ฆฌ๊ฑฐ(Trigger), ์คํ ์ด๋ ํ๋ก์์ ๋ฅผ ํ์ฉํ ๋ฐ์ดํฐ ์๋ํ๊ฐ ๊ฐ๋ฅ
4.1.3 JSON/JSONB๋ฅผ ์ด์ฉํ NoSQL ๊ธฐ๋ฅ
PostgreSQL์ JSON๊ณผ JSONB(Binary JSON) ํ์
์ ์ง์ํ์ฌ
NoSQL๊ณผ ์ ์ฌํ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๐น JSONB ์ปฌ๋ผ ์ฌ์ฉ ์์
CREATE TABLE users (
id SERIAL PRIMARY KEY,
name TEXT,
data JSONB
);
๐น JSON ๋ฐ์ดํฐ ์ฝ์
INSERT INTO users (name, data)
VALUES ('Alice', '{"age": 25, "city": "Seoul"}');
๐น JSON ๋ฐ์ดํฐ๋ฅผ ์กฐ๊ฑด์ผ๋ก ๊ฒ์
SELECT name, data->>'city' AS city FROM users WHERE data->>'age' = '25';
โ data->>'age'๋ฅผ ์ฌ์ฉํ์ฌ JSON ํ๋์์ ๊ฐ์ ์ถ์ถ
๐ก JSONB๋ ์ผ๋ฐ JSON๋ณด๋ค ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ, ์ธ๋ฑ์ฑ(GIN ์ธ๋ฑ์ค)๊น์ง ์ง์ํจ
CREATE INDEX idx_users_data ON users USING GIN (data);
โ JSON ํ๋์์ ๊ฒ์ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด GIN ์ธ๋ฑ์ค ์ ์ฉ ๊ฐ๋ฅ
4.1.4 Full-Text Search (์ ๋ฌธ ๊ฒ์ ๊ธฐ๋ฅ)
PostgreSQL์ ๊ฐ๋ ฅํ ์ ๋ฌธ ๊ฒ์(Full-Text Search) ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ฉฐ,
๊ฒ์์์ง๊ณผ ๊ฐ์ ๋ฐฉ์์ผ๋ก ํ
์คํธ ๋ฐ์ดํฐ ๊ฒ์ ๋ฐ ๋ญํน ์ ์ฉ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐น ๊ธฐ๋ณธ์ ์ธ Full-Text Search ์ฌ์ฉ๋ฒ
SELECT to_tsvector('postgresql is a powerful database')
@@ to_tsquery('powerful & database');
โ
to_tsvector → ๋ฌธ์ฅ์ ๊ฒ์ ๊ฐ๋ฅํ ํํ๋ก ๋ณํ
โ
to_tsquery → ๊ฒ์์ด๋ฅผ AND/OR ์กฐ๊ฑด์ผ๋ก ๋ณํ
๐น ํ ์ด๋ธ์์ ์ ๋ฌธ ๊ฒ์ ์ ์ฉ
CREATE TABLE articles (
id SERIAL PRIMARY KEY,
title TEXT,
body TEXT,
tsv TSVECTOR GENERATED ALWAYS AS (to_tsvector('english', title || ' ' || body)) STORED
);
SELECT title FROM articles WHERE tsv @@ to_tsquery('database & performance');
โ @@ ์ฐ์ฐ์๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฌธ ๊ฒ์์ ์ํ
๐ก Full-Text Search๋ ๋ธ๋ก๊ทธ, ๋ฌธ์ ๊ฒ์, ๋ด์ค ์๋น์ค ๋ฑ์์ ๋งค์ฐ ์ ์ฉ
4.1.5 ํํฐ์ ๋(Partitioning)๊ณผ ์ค๋ฉ(Sharding)
๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ๋ ํ
์ด๋ธ์ ๋๋์ด ์ ์ฅํ๋ฉด ์ฑ๋ฅ์ด ํฌ๊ฒ ํฅ์๋ฉ๋๋ค.
PostgreSQL์ ํํฐ์
๋(Partitioning)๊ณผ ์ค๋ฉ(Sharding) ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ ์ง์ํฉ๋๋ค.
๐น ํํฐ์ ๋(Partitioning) ์ ์ฉ ์์
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
sale_date DATE NOT NULL,
amount NUMERIC NOT NULL
) PARTITION BY RANGE (sale_date);
โ ๋ ์ง๋ณ ๋ฐ์ดํฐ๋ฅผ ๋ณ๋ ํ ์ด๋ธ์ ๋ถํ ์ ์ฅ ๊ฐ๋ฅ
CREATE TABLE sales_2023 PARTITION OF sales FOR VALUES FROM ('2023-01-01') TO ('2023-12-31');
CREATE TABLE sales_2024 PARTITION OF sales FOR VALUES FROM ('2024-01-01') TO ('2024-12-31');
โ 2023๋ , 2024๋ ๋ฐ์ดํฐ๊ฐ ์๋์ผ๋ก ๋๋์ด ์ ์ฅ๋จ
๐ก ํํฐ์ ๋์ ํ์ฉํ๋ฉด ํน์ ๊ธฐ๊ฐ์ ๋ฐ์ดํฐ๋ง ๋น ๋ฅด๊ฒ ์กฐํํ ์ ์์
4.1.6 ์ธ๋ถ ๋ฐ์ดํฐ ์ฐ๋ (FDW - Foreign Data Wrapper)
PostgreSQL์ ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค(MySQL, MongoDB, CSV ํ์ผ ๋ฑ)์ ์ง์ ์ฐ๋ ๊ฐ๋ฅํฉ๋๋ค.
๐น MySQL ์ฐ๋ ์์
1๏ธโฃ mysql_fdw ํ์ฅ ์ค์น
CREATE EXTENSION mysql_fdw;
2๏ธโฃ ์ธ๋ถ MySQL ์๋ฒ ๋ฑ๋ก
CREATE SERVER mysql_server FOREIGN DATA WRAPPER mysql_fdw OPTIONS (host '127.0.0.1', port '3306');
3๏ธโฃ ์ธ๋ถ ํ ์ด๋ธ ์์ฑ ๋ฐ ์กฐํ
CREATE FOREIGN TABLE mysql_users (
id INT,
name TEXT
) SERVER mysql_server OPTIONS (database 'mydb', table 'users');
SELECT * FROM mysql_users;
โ PostgreSQL์์ MySQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ง์ ์กฐํ ๊ฐ๋ฅ
๐ก FDW๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์ํ ๋ฐ์ดํฐ ์์ค์ PostgreSQL์ ํตํฉํ์ฌ ํ์ฉ ๊ฐ๋ฅ
4.1.7 PostGIS๋ฅผ ํ์ฉํ ๊ณต๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ (GIS ๋ฐ์ดํฐ๋ฒ ์ด์ค)
PostGIS๋ PostgreSQL์์ ์ง๋ฆฌ ๊ณต๊ฐ ๋ฐ์ดํฐ(์๋, ๊ฒฝ๋)๋ฅผ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ ์ ์๋ ํ์ฅ ๋ชจ๋์ ๋๋ค.
๐น PostGIS ํ์ฅ ์ค์น ๋ฐ ํ์ฑํ
CREATE EXTENSION postgis;
๐น ๊ณต๊ฐ ๋ฐ์ดํฐ ์ปฌ๋ผ ์ถ๊ฐ
ALTER TABLE locations ADD COLUMN geom GEOMETRY(Point, 4326);
๐น ํน์ ๋ฒ์ ๋ด ์์น ๊ฒ์
SELECT name FROM locations WHERE ST_DWithin(geom, ST_GeomFromText('POINT(127.5 37.5)', 4326), 1000);
โ ST_DWithin() → ํน์ ์์น์์ 1000๋ฏธํฐ ์ด๋ด์ ์ฅ์ ๊ฒ์
๐ก PostGIS๋ ์ง๋ ์๋น์ค, ์์น ๊ธฐ๋ฐ ์ฑ, ์ง๋ฆฌ ์ ๋ณด ๋ถ์ ์์คํ ์ ํ์์
4.1.8 PostgreSQL ํ์ฅ ๋ชจ๋ ์ ๋ฆฌ
ํ์ฅ ๋ชจ๋ ์ค๋ช
plpgsql | ์คํ ์ด๋ ํ๋ก์์ ๋ฐ ํจ์ ์์ฑ |
jsonb | JSON ๋ฐ์ดํฐ ์ฒ๋ฆฌ |
pg_trgm | ์ ์ฌ ๊ฒ์ (๋ฌธ์์ด ๋น๊ต) |
pg_stat_statements | SQL ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง |
mysql_fdw | MySQL ์ฐ๋ |
postgis | ๊ณต๊ฐ ๋ฐ์ดํฐ(GIS) ์ฒ๋ฆฌ |
๐ก ํ์ฅ ๋ชจ๋์ ์ ๊ทน ํ์ฉํ๋ฉด PostgreSQL์ ๊ธฐ๋ฅ์ ๊ทน๋ํํ ์ ์์
4.1.9 ๊ฒฐ๋ก : PostgreSQL์ ๊ฐ๋ ฅํ ํ์ฅ์ฑ ํ์ฉ
โ
PL/pgSQL์ ํ์ฉํ ์คํ ์ด๋ ํ๋ก์์ ์์ฑ
โ
JSONB๋ฅผ ํ์ฉํ NoSQL ๊ธฐ๋ฅ ์ ์ฉ ๊ฐ๋ฅ
โ
Full-Text Search๋ฅผ ํตํด ์ ๋ฌธ ๊ฒ์ ๊ตฌํ
โ
ํํฐ์
๋(Partitioning)์ผ๋ก ๋๋ ๋ฐ์ดํฐ ์ต์ ํ
โ
FDW๋ฅผ ํ์ฉํด ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค(MySQL, MongoDB ๋ฑ) ์ฐ๋
โ
PostGIS๋ฅผ ์ด์ฉํ ์ง๋ฆฌ ๊ณต๊ฐ ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๊ฐ๋ฅ
๐ ๋ค์ ๊ธ ์๊ณ : PostgreSQL ์ค์ ํ๋ก์ ํธ ์ ์ฉ ์ฌ๋ก
๐ ๋ค์ ํธ: 5.1 PostgreSQL ์ค์ ํ๋ก์ ํธ ์ ์ฉ ์ฌ๋ก
'study > postgresql' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
- Total
- Today
- Yesterday
- Page
- ๊ด๋ฆฌ์
- Ktor
- github
- ๊ฐ๋ฐ๋ธ๋ก๊ทธ
- rag
- ํ์ด์ง
- ์น๊ฐ๋ฐ
- REACT
- fastapi
- babel
- Next.js
- ๋ฐฑ์๋
- ๋ก์ปฌLLM
- ํ๋ก ํธ์๋
- ์ฑ๋ด๊ฐ๋ฐ
- kotlin
- til
- llm
- PostgreSQL
- Webpack
- nodejs
- nextJS
- Project
- LangChain
- Docker
- AI์ฑ๋ด
- Python
- ๋ฆฌ์กํธ
- ๋ฐฑ์๋๊ฐ๋ฐ
์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
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 |