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¶
- ๊ณต์ ๋ค์ด๋ก๋ ํ์ด์ง์์ ์ค์น ํ๋ก๊ทธ๋จ ๋ค์ด๋ก๋
- ์ค์น ๋ง๋ฒ์ฌ ์คํ
- ๋น๋ฐ๋ฒํธ ์ค์
- ๊ธฐ๋ณธ ํฌํธ 5432 ์ฌ์ฉ
- 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์์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฌ์ฉ์ ๊ด๋ฆฌ๋ฅผ ์์ธํ ๋ค๋ค๋ด ์๋ค!