TL;DR
์ด๋ฒ ๊ธ์ ํต์ฌ์ ์์ฝํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค
- ๊ฐ์ฅ ํจ์จ์ ์ธ ๋๋ฏธ๋ฐ์ดํฐ ์์ฑ ๋ฐฉ๋ฒ
- temp table ์ ์ด์ฉํ์ฌ insert Query ๋ ๋ฆฌ๊ธฐ
- temp table ์์ฑ
generate_series
์random
ํจ์๋ฅผ ์ด์ฉํ์ฌ insert
- temp table ์ ์ด์ฉํ์ฌ insert Query ๋ ๋ฆฌ๊ธฐ
- docker-compose ๋ก ์คํ
- docker-compose ์ด์ฉํ๊ธฐ
- application runner ์ด์ฉํ๊ธฐ
- ๋ฑ๋ฑ
๊ฐ์ฅ ํจ์จ์ ์ธ ๋๋ฏธ๋ฐ์ดํฐ ์์ฑ ๋ฐฉ๋ฒ
DB ๋ Application ์ ์ฒ๋ฆฌ๋ ํน์ ํน์ ๋๋ ๋ฐ์ดํฐ์ ์ํฉ์ ํ ์คํธํ๊ธฐ ์ํด ๋๋ฏธ ๋ฐ์ดํฐ๊ฐ ํ์ํ๋ค.
excel, mockaroo, bulk insert ๋ฑ๋ฑ ๋ค์ํ ๋ฐฉ๋ฒ์ ์ด์ฉํด์ ๋๋์ ๋ฐ์ดํฐ๊ฐ ์๋ ์ค์ต ํ๊ฒฝ์ ๊ตฌ์ฑํด๋ดค๋๋ฐ ์ผ์ด์ค์ ๋ฐ๋ผ ๋ค๋ฅด๊ฒ ์ง๋ง ์ด ๋ฐฉ๋ฒ์ด ๊ฐ์ฅ ํจ์จ์ ์ด์๋ค.
์๋์ ํต์ฌ ์ปจ์ ๋ง ์ดํดํ๋ค๋ฉด ์ด๋ ํ ๊ตฌ์กฐ์ ๋ฐ์ดํฐ๋, ์ด๋ ํ ํฌ๊ธฐ์ Dataset ์ด ํ์ํ๋๋ผ๋ ๊ณผ์ฅ ์์ด 10์ด ์์ ์์ฑ ๊ฐ๋ฅํ๋ค.
์ฐ์ ์งํ ์์๋ ์ปจ์ ์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๋๋ฏธ๋ฐ์ดํฐ์ ์ปฌ๋ผ ๊ฐ์ ์ํ ํ ์ด๋ธ ๊ตฌ์ฑ
- ์ปฌ๋ผ ๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋๋ฏธ๋ฐ์ดํฐ ์์ฑ ํ ์์ํ ์ด๋ธ์ insert
- ์์ ํ ์ด๋ธ์์ ๋๋ฏธ ๋ฐ์ดํฐ ํ ์ด๋ธ๋ก insert
Step 1. ๊ฐ์ ์ํ ์์ํ ์ด๋ธ ๊ตฌ์ฑ
names ๋ ๋๋ฏธ๋ฐ์ดํฐ ์ปฌ๋ผ์ ๋๋คํ ๊ฐ์ ์ํ ๋จ์ ํ ์ด๋ธ๋ก ๋๋ฏธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋ง๊ฒ ์ด๋ฌํ ๊ฐ ํ ์ด๋ธ ๋ค์ ์ผ๋ง๋ ์ง ์ถ๊ฐํด๋ ์ข๋ค.
์๋์์ ๋ณด๊ฒ ์ง๋ง ๋๋ฏธ ๋ฐ์ดํฐ ์์ฑํ ๋ ์์ 5๊ฐ์ง ๊ฐ๋ค ์ค ๋๋คํ๊ฒ ์ธํ ๋ ๊ฒ์ด๋ค.
-- value ํ
์ด๋ธ ์์ฑ
CREATE TABLE names
(
id SERIAL PRIMARY KEY,
name TEXT
);
-- ์์ ์ด๋ฆ value ์ฝ์
INSERT INTO names (name)
VALUES ('Ann'),
('Bill'),
('Cindy'),
('Diane'),
('Emma');
Step 2. ๊ฐ ํ ์ด๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋๋ฏธ๋ฐ์ดํฐ๋ฅผ temp ํ ์ด๋ธ์ insert
์ด๋ฒ ๋จ๊ณ์์๋ ๋๋ฏธ ํ ์ด๋ธ์ ์์ฑํ๊ณ ์์ ๋ง๋ ๊ฐ ํ ์ด๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ์์ ํ ์ด๋ธ์ ๋ง๋ค ๊ฒ์ด๋ค.
๊ทธ ์์ ํ
์ด๋ธ์๋ generate_series()
ํจ์๋ก id ๋ฅผ ์์ฑํ๊ณ random()
์ ์ด์ฉํด ๊ฐ๋ค์ ์ธํ
ํ ๊ฒ์ด๋ค.
-- Step 3: ๋๋ฏธ ํ
์ด๋ธ ์์ฑ
CREATE TABLE person_data
(
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
);
-- generate_series๋ฅผ ์ฌ์ฉํ์ฌ 100๋ง ๊ฐ์ ๋ฐ์ดํฐ ์ฝ์
WITH tmp AS (
SELECT
generate_series(1, 1000000) AS id, -- 1๋ถํฐ 100๋ง๊น์ง์ id ์์ฑ
(random() * 4 + 1)::integer AS idx, -- ๋๋คํ ์ด๋ฆ์ ์ ํํ๊ธฐ ์ํ ์ธ๋ฑ์ค (1-5)
(random() * 79 + 1)::integer AS age -- ๋๋คํ ๋์ด ์์ฑ (1-80)
)
์์ ๋ณด์ด๋ generate_series ์ ๋ฐ๋ผ ๋๋ฏธ ๋ฐ์ดํฐ์ ์ ํฌ๊ธฐ๊ฐ ๊ฒฐ์ ๋๋ฏ๋ก ์์จ์ ์ผ๋ก ๋๋ ค์ฃผ๊ฑฐ๋ ์ค์ฌ์ฃผ๋ฉด ๋๋ค.
Step 3. ์์ ํ ์ด๋ธ์ ๊ธฐ๋ฐ์ผ๋ก ๋๋ฏธ ๋ฐ์ดํฐ insert
์ด์ ์ค์ ๋๋ฏธ ํ ์ด๋ธ (person_data) ์ insert ๋ฅผ ํ๋ฉด ๋๋ค.
temp table ์์ ์์ฑํ ๊ฐ์ sub query ๋ก ์กฐํํด์ insert ํ๋ ๋จ์ํ ๋ฐฉ๋ฒ์ด๋ค
INSERT
INTO person_data (id, name, age)
SELECT tmp.id,
(SELECT name FROM names WHERE names.id = tmp.idx) AS name,
tmp.age
FROM tmp;
์ ์ฒด init.sql
์์ ์ด์ผ๊ธฐ ํ ์ ์ฒด ๊ณผ์ ์ ํ๋์ sql ํ์ผ๋ก ๋ง๋ค๋ฉด ์๋์ ๊ฐ๋ค.
CREATE TABLE names
(
id SERIAL PRIMARY KEY,
name TEXT
);
INSERT INTO names (name)
VALUES ('Ann'),
('Bill'),
('Cindy'),
('Diane'),
('Emma');
CREATE TABLE person_data
(
id INTEGER PRIMARY KEY,
name TEXT,
age INTEGER
);
WITH tmp AS (
SELECT
generate_series(1, 1000000) AS id,
(random() * 4 + 1)::integer AS idx,
(random() * 79 + 1)::integer AS age
)
INSERT
INTO person_data (id, name, age)
SELECT tmp.id,
(SELECT name FROM names WHERE names.id = tmp.idx) AS name,
tmp.age
FROM tmp;
์ด์ ์ด sql ํ์ผ๋ก ์ฝ๊ฒ n ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์์ฑํ ์ ์๊ฒ ๋๋ค.
docker-compose ๋ก ์คํ
๋๋ ์ด๋ ๊ฒ ๋๋ฏธ๋ฐ์ดํฐ๋ฅผ ์์ฑํ๋ฉด ๋ณดํต Spring Application ๊ณผ ํตํฉํ์ฌ ํ ์คํธ๋ ๊ฒ์ฆ์ ์ํํ๋ค.
์ด๋ ๋ค์ํ ๋ฐฉ๋ฒ์ด ์ฌ์ฉ๋ ์ ์๊ฒ ์ง๋ง ๋๋ ๋ณดํต docker-compose ๋ก ์คํํ๊ฒฝ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ์ฆ๊ฒจ ํ๋ฏ๋ก ๋ด๊ฐ ์ค์ ํ๋ docker-compose ๋ ์๋์ ๊ฐ๋ค.
version: "3.8"
services:
order-db:
image: postgres:14
container_name: order-db
environment:
POSTGRES_DB: orderdb
POSTGRES_USER: orderuser
POSTGRES_PASSWORD: orderpassword
ports:
- "5432:5432"
volumes:
- ./sql/init.sql:/docker-entrypoint-initdb.d/init.sql
volumes ๋ฅผ ๋ณด๋ฉด ์๊ฒ ์ง๋ง dc ๋ฅผ ์คํํ๋ ์์น์ /sql
ํ์ ๋๋ ํ ๋ฆฌ์ ์์ sql ๋ฌธ์ด init.sql
๋ก ๋ค์ด๊ฐ ์์ด์ผ ํ๋ค.
์ด์ธ์๋ spring application runner ๋ Bean Initializer ๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ https://engineerinsight.tistory.com/71 ์์ ์ ์ ๋ฆฌ๋์ด ์์ผ๋ ์ฐธ๊ณ ํ๋ ๊ฒ๋ ์ถ์ฒํ๋ค.
'๐ฌweb application > - Database' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์คํ์ ํ์ด์ง, ๋จ๊ณ๋ณ๋ก ์ต์ ํํ๊ธฐ (0) | 2023.11.19 |
---|---|
์คํ์ ํ์ด์ง์ด ๋๋ฆฐ ์ง์ง ์ด์ (5) | 2023.11.19 |
[๋ฐ์ดํฐ๋ฒ ์ด์ค] Isolation Level, ๊ณ ๋ฆฝ ์์ค (0) | 2021.04.07 |
[๋ฐ์ดํฐ๋ฒ ์ด์ค] Transaction, ํธ๋์ญ์ ์ด๋? (0) | 2021.04.07 |
[SQL๋ฌธ ๊ธฐ์ด] DML ๋ฐ์ดํฐ ์กฐ์์ด :: INSERT, UPDATE, DELETE (0) | 2020.07.07 |
๋๊ธ