PostgreSQL ๊ธฐ์ดˆ

PostgreSQL ๊ธฐ์ดˆ

1. PostgreSQL์ด๋ž€?

PostgreSQL(ํฌ์ŠคํŠธ๊ทธ๋ ˆ์Šคํ์—˜)์€ ์˜คํ”ˆ์†Œ์Šค ๊ด€๊ณ„ํ˜• ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ฆฌ ์‹œ์Šคํ…œ(RDBMS)์ž…๋‹ˆ๋‹ค.

ํŠน์ง•

  • ์˜คํ”ˆ์†Œ์Šค: ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅ
  • ํ‘œ์ค€ SQL ์ค€์ˆ˜: ANSI SQL ํ‘œ์ค€์„ ์ž˜ ๋”ฐ๋ฆ„
  • ํ™•์žฅ์„ฑ: JSON, ๋ฐฐ์—ด, ์‚ฌ์šฉ์ž ์ •์˜ ํƒ€์ž… ์ง€์›
  • ACID ์ค€์ˆ˜: ํŠธ๋žœ์žญ์…˜์˜ ์•ˆ์ •์„ฑ ๋ณด์žฅ
  • ๋™์‹œ์„ฑ ์ œ์–ด: MVCC(Multi-Version Concurrency Control)

์™œ PostgreSQL์„ ์‚ฌ์šฉํ• ๊นŒ?

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    PostgreSQL ์žฅ์                           โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚  โ€ข ๋ณต์žกํ•œ ์ฟผ๋ฆฌ ์ฒ˜๋ฆฌ ์„ฑ๋Šฅ์ด ์šฐ์ˆ˜                              โ”‚
โ”‚  โ€ข JSON/JSONB ํƒ€์ž…์œผ๋กœ NoSQL์ฒ˜๋Ÿผ ์‚ฌ์šฉ ๊ฐ€๋Šฅ                  โ”‚
โ”‚  โ€ข ํ’€ํ…์ŠคํŠธ ๊ฒ€์ƒ‰ ๋‚ด์žฅ                                       โ”‚
โ”‚  โ€ข ์ง€๋ฆฌ ๋ฐ์ดํ„ฐ ์ง€์› (PostGIS)                               โ”‚
โ”‚  โ€ข ๋Œ€๊ทœ๋ชจ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์— ์ ํ•ฉ                                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2. ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ๋น„๊ต

ํŠน์ง• PostgreSQL MySQL SQLite
๋ผ์ด์„ ์Šค PostgreSQL License GPL Public Domain
JSON ์ง€์› JSONB (๊ณ ์„ฑ๋Šฅ) JSON JSON (์ œํ•œ์ )
๋™์‹œ์„ฑ MVCC InnoDB MVCC ํŒŒ์ผ ์ž ๊ธˆ
ํ™•์žฅ์„ฑ ๋งค์šฐ ๋†’์Œ ๋†’์Œ ๋‚ฎ์Œ
์šฉ๋„ ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ, ๋ถ„์„ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž„๋ฒ ๋””๋“œ, ํ…Œ์ŠคํŠธ

3. ์„ค์น˜ ๋ฐฉ๋ฒ•

Docker (๊ถŒ์žฅ)

๊ฐ€์žฅ ๋น ๋ฅด๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.

# PostgreSQL 16 ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰
docker run --name postgres-study \
  -e POSTGRES_PASSWORD=mypassword \
  -e POSTGRES_USER=myuser \
  -e POSTGRES_DB=mydb \
  -p 5432:5432 \
  -d postgres:16

# ์‹คํ–‰ ํ™•์ธ
docker ps

# ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ psql ์ ‘์†
docker exec -it postgres-study psql -U myuser -d mydb

macOS (Homebrew)

# PostgreSQL ์„ค์น˜
brew install postgresql@16

# ์„œ๋น„์Šค ์‹œ์ž‘
brew services start postgresql@16

# ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘์†
psql postgres

Linux (Ubuntu/Debian)

# ํŒจํ‚ค์ง€ ๋ชฉ๋ก ์—…๋ฐ์ดํŠธ
sudo apt update

# PostgreSQL ์„ค์น˜
sudo apt install postgresql postgresql-contrib

# ์„œ๋น„์Šค ์ƒํƒœ ํ™•์ธ
sudo systemctl status postgresql

# postgres ์‚ฌ์šฉ์ž๋กœ ์ ‘์†
sudo -u postgres psql

Linux (CentOS/RHEL)

# PostgreSQL ์ €์žฅ์†Œ ์ถ”๊ฐ€
sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-8-x86_64/pgdg-redhat-repo-latest.noarch.rpm

# PostgreSQL ์„ค์น˜
sudo dnf install -y postgresql16-server

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ดˆ๊ธฐํ™”
sudo /usr/pgsql-16/bin/postgresql-16-setup initdb

# ์„œ๋น„์Šค ์‹œ์ž‘
sudo systemctl start postgresql-16
sudo systemctl enable postgresql-16

Windows

  1. ๊ณต์‹ ๋‹ค์šด๋กœ๋“œ ํŽ˜์ด์ง€์—์„œ ์„ค์น˜ ํ”„๋กœ๊ทธ๋žจ ๋‹ค์šด๋กœ๋“œ
  2. ์„ค์น˜ ๋งˆ๋ฒ•์‚ฌ ์‹คํ–‰
  3. ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •
  4. ๊ธฐ๋ณธ ํฌํŠธ 5432 ์‚ฌ์šฉ
  5. pgAdmin ํ•จ๊ป˜ ์„ค์น˜ (GUI ๋„๊ตฌ)

4. ์„ค์น˜ ํ™•์ธ

# PostgreSQL ๋ฒ„์ „ ํ™•์ธ
psql --version
# ๋˜๋Š”
postgres --version

์ถœ๋ ฅ ์˜ˆ์‹œ:

psql (PostgreSQL) 16.1

5. psql ํด๋ผ์ด์–ธํŠธ

psql์€ PostgreSQL์˜ ๋Œ€ํ™”ํ˜• ํ„ฐ๋ฏธ๋„ ํด๋ผ์ด์–ธํŠธ์ž…๋‹ˆ๋‹ค.

์ ‘์† ๋ฐฉ๋ฒ•

# ๊ธฐ๋ณธ ์ ‘์† (๋กœ์ปฌ, ํ˜„์žฌ ์‚ฌ์šฉ์ž)
psql

# ํŠน์ • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘์†
psql -d mydb

# ์‚ฌ์šฉ์ž ์ง€์ • ์ ‘์†
psql -U username -d dbname

# ํ˜ธ์ŠคํŠธ/ํฌํŠธ ์ง€์ • ์ ‘์†
psql -h localhost -p 5432 -U username -d dbname

# Docker ์ปจํ…Œ์ด๋„ˆ ์ ‘์†
docker exec -it postgres-study psql -U myuser -d mydb

๋ฉ”ํƒ€ ๋ช…๋ น์–ด (๋ฐฑ์Šฌ๋ž˜์‹œ ๋ช…๋ น)

psql์—์„œ \๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ช…๋ น์–ด๋“ค์ž…๋‹ˆ๋‹ค.

๋ช…๋ น์–ด ์„ค๋ช…
\l ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก (list)
\c dbname ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „ํ™˜ (connect)
\dt ํ˜„์žฌ DB์˜ ํ…Œ์ด๋ธ” ๋ชฉ๋ก
\dt+ ํ…Œ์ด๋ธ” ๋ชฉ๋ก (์ƒ์„ธ)
\d tablename ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ํ™•์ธ
\d+ tablename ํ…Œ์ด๋ธ” ๊ตฌ์กฐ (์ƒ์„ธ)
\du ์‚ฌ์šฉ์ž(Role) ๋ชฉ๋ก
\dn ์Šคํ‚ค๋งˆ ๋ชฉ๋ก
\df ํ•จ์ˆ˜ ๋ชฉ๋ก
\di ์ธ๋ฑ์Šค ๋ชฉ๋ก
\x ํ™•์žฅ ์ถœ๋ ฅ ๋ชจ๋“œ ํ† ๊ธ€
\timing ์ฟผ๋ฆฌ ์‹คํ–‰ ์‹œ๊ฐ„ ํ‘œ์‹œ ํ† ๊ธ€
\i filename SQL ํŒŒ์ผ ์‹คํ–‰
\o filename ์ถœ๋ ฅ์„ ํŒŒ์ผ๋กœ ์ €์žฅ
\q psql ์ข…๋ฃŒ (quit)
\? ๋ฉ”ํƒ€ ๋ช…๋ น์–ด ๋„์›€๋ง
\h SQL ๋ช…๋ น์–ด ๋„์›€๋ง
\h SELECT SELECT ๋ฌธ๋ฒ• ๋„์›€๋ง

์‹ค์Šต: ๊ธฐ๋ณธ ๋ช…๋ น์–ด ์‚ฌ์šฉ

-- psql ์ ‘์† ํ›„

-- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก ํ™•์ธ
\l

-- ํ˜„์žฌ ์—ฐ๊ฒฐ ์ •๋ณด ํ™•์ธ
\conninfo

-- ํ…Œ์ด๋ธ” ๋ชฉ๋ก ํ™•์ธ (์ฒ˜์Œ์—” ๋น„์–ด์žˆ์Œ)
\dt

-- ๋„์›€๋ง ๋ณด๊ธฐ
\?

6. ์ฒซ ๋ฒˆ์งธ ์ฟผ๋ฆฌ ์‹คํ–‰

๊ฐ„๋‹จํ•œ ๊ณ„์‚ฐ

-- ๊ณ„์‚ฐ๊ธฐ์ฒ˜๋Ÿผ ์‚ฌ์šฉ
SELECT 1 + 1;

์ถœ๋ ฅ:

 ?column?
----------
        2
(1 row)

๋ฌธ์ž์—ด ์ถœ๋ ฅ

SELECT 'Hello, PostgreSQL!';

์ถœ๋ ฅ:

      ?column?
--------------------
 Hello, PostgreSQL!
(1 row)

ํ˜„์žฌ ์‹œ๊ฐ„ ํ™•์ธ

SELECT NOW();

์ถœ๋ ฅ:

              now
-------------------------------
 2024-01-15 10:30:45.123456+09
(1 row)

๋ฒ„์ „ ํ™•์ธ

SELECT version();

7. ๊ธฐ๋ณธ SQL ๋ฌธ๋ฒ•

๋Œ€์†Œ๋ฌธ์ž

  • SQL ํ‚ค์›Œ๋“œ: ๋Œ€์†Œ๋ฌธ์ž ๊ตฌ๋ถ„ ์—†์Œ (SELECT = select)
  • ํ…Œ์ด๋ธ”/์ปฌ๋Ÿผ๋ช…: ๊ธฐ๋ณธ์ ์œผ๋กœ ์†Œ๋ฌธ์ž๋กœ ์ €์žฅ
  • ๋ฌธ์ž์—ด: ์ž‘์€๋”ฐ์˜ดํ‘œ ์‚ฌ์šฉ ('Hello')
-- ์ด ์„ธ ์ฟผ๋ฆฌ๋Š” ๋™์ผ
SELECT * FROM users;
select * from users;
Select * From Users;

์ฃผ์„

-- ํ•œ ์ค„ ์ฃผ์„

/* ์—ฌ๋Ÿฌ ์ค„
   ์ฃผ์„ */

SELECT 1; -- ์ธ๋ผ์ธ ์ฃผ์„

๋ฌธ์žฅ ๋

  • ์„ธ๋ฏธ์ฝœ๋ก (;)์œผ๋กœ ๋ฌธ์žฅ ์ข…๋ฃŒ
  • psql์—์„œ ์—ฌ๋Ÿฌ ์ค„ ์ž…๋ ฅ ํ›„ ;๋กœ ์‹คํ–‰
SELECT
    id,
    name,
    email
FROM users
WHERE active = true;

8. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ ๋ฐ ์‚ญ์ œ

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ

-- ๊ธฐ๋ณธ ์ƒ์„ฑ
CREATE DATABASE mydb;

-- ์˜ต์…˜ ์ง€์ •
CREATE DATABASE mydb
    ENCODING 'UTF8'
    LC_COLLATE 'ko_KR.UTF-8'
    LC_CTYPE 'ko_KR.UTF-8';

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ „ํ™˜

-- psql ๋ฉ”ํƒ€ ๋ช…๋ น
\c mydb

์ถœ๋ ฅ:

You are now connected to database "mydb" as user "postgres".

๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์‚ญ์ œ

DROP DATABASE mydb;

-- ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ์‚ญ์ œ
DROP DATABASE IF EXISTS mydb;

9. ์‹ค์Šต ์˜ˆ์ œ

์‹ค์Šต 1: ํ™˜๊ฒฝ ์„ค์ • ํ™•์ธ

-- 1. PostgreSQL ๋ฒ„์ „ ํ™•์ธ
SELECT version();

-- 2. ํ˜„์žฌ ์‚ฌ์šฉ์ž ํ™•์ธ
SELECT current_user;

-- 3. ํ˜„์žฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™•์ธ
SELECT current_database();

-- 4. ํ˜„์žฌ ์‹œ๊ฐ„ ํ™•์ธ
SELECT NOW();

-- 5. ์„œ๋ฒ„ ์„ค์ • ํ™•์ธ
SHOW server_version;
SHOW data_directory;

์‹ค์Šต 2: ์ฒซ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งŒ๋“ค๊ธฐ

-- 1. ํ•™์Šต์šฉ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ƒ์„ฑ
CREATE DATABASE study_db;

-- 2. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ชฉ๋ก ํ™•์ธ
\l

-- 3. ์ƒˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋กœ ์ „ํ™˜
\c study_db

-- 4. ์—ฐ๊ฒฐ ์ •๋ณด ํ™•์ธ
\conninfo

์‹ค์Šต 3: ๊ฐ„๋‹จํ•œ ํ…Œ์ด๋ธ” ๋งŒ๋“ค๊ธฐ

-- 1. ํ…Œ์ด๋ธ” ์ƒ์„ฑ
CREATE TABLE hello (
    id SERIAL PRIMARY KEY,
    message TEXT,
    created_at TIMESTAMP DEFAULT NOW()
);

-- 2. ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
INSERT INTO hello (message) VALUES ('Hello, PostgreSQL!');
INSERT INTO hello (message) VALUES ('์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.');

-- 3. ๋ฐ์ดํ„ฐ ์กฐํšŒ
SELECT * FROM hello;

-- 4. ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ํ™•์ธ
\d hello

์ถœ๋ ฅ ์˜ˆ์‹œ:

 id |        message        |         created_at
----+-----------------------+----------------------------
  1 | Hello, PostgreSQL!    | 2024-01-15 10:30:45.123456
  2 | ์ฒซ ๋ฒˆ์งธ ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค. | 2024-01-15 10:30:50.654321
(2 rows)

10. ๋ฌธ์ œ ํ•ด๊ฒฐ

์ ‘์† ์˜ค๋ฅ˜

์˜ค๋ฅ˜: psql: error: connection refused

# ์„œ๋น„์Šค ์‹คํ–‰ ํ™•์ธ
sudo systemctl status postgresql

# ์„œ๋น„์Šค ์‹œ์ž‘
sudo systemctl start postgresql

์˜ค๋ฅ˜: FATAL: password authentication failed

# pg_hba.conf ํ™•์ธ ๋ฐ ์ˆ˜์ • ํ•„์š”
# ๋˜๋Š” ์˜ฌ๋ฐ”๋ฅธ ๋น„๋ฐ€๋ฒˆํ˜ธ ์‚ฌ์šฉ

์˜ค๋ฅ˜: FATAL: database "username" does not exist

# ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ง€์ •ํ•˜์—ฌ ์ ‘์†
psql -d postgres

Docker ๊ด€๋ จ

# ์ปจํ…Œ์ด๋„ˆ ์ƒํƒœ ํ™•์ธ
docker ps -a

# ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ ํ™•์ธ
docker logs postgres-study

# ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘
docker restart postgres-study

๋‹ค์Œ ๋‹จ๊ณ„

02_Database_Management.md์—์„œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์‚ฌ์šฉ์ž ๊ด€๋ฆฌ๋ฅผ ์ž์„ธํžˆ ๋‹ค๋ค„๋ด…์‹œ๋‹ค!

to navigate between lessons