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

๋ฐ˜์‘ํ˜•

๐Ÿ“Œ 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 ์‹ค์ „ ํ”„๋กœ์ ํŠธ ์ ์šฉ ์‚ฌ๋ก€

 

๋ฐ˜์‘ํ˜•
๊ณต์ง€์‚ฌํ•ญ
์ตœ๊ทผ์— ์˜ฌ๋ผ์˜จ ๊ธ€
์ตœ๊ทผ์— ๋‹ฌ๋ฆฐ ๋Œ“๊ธ€
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
๊ธ€ ๋ณด๊ด€ํ•จ
๋ฐ˜์‘ํ˜•