๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Project ESG+AI/[์‚ผ์ •KPMG]ESG ๋ฐ์ดํ„ฐ ํ™œ์šฉ ํ’€์Šคํ… ๊ฐœ๋ฐœ

13์ผ. ๋„์ปค ์„ค์น˜ํ•˜๊ธฐ

by GreenJin_S2 2025. 10. 27.


๋„์ปค์— ํฌ์ŠคํŠธ๊ทธ๋ฆฌ๋ฅผ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ด ์ดˆ๋ณด์ž๋„ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์ƒ์„ธํ•˜๊ฒŒ ์ง„ํ–‰๊ณผ์ •์„ ์„ค๋ช…ํ•ด์ค˜

๋ฌด๋ฃŒ ํ•œ๊ตญ์–ด GPT์˜ ๋ง:

์ข‹์•„์š” ๐Ÿ‘ ์•„์ฃผ ์‹ค์šฉ์ ์ธ ์„ ํƒ์ด์‹ญ๋‹ˆ๋‹ค!
Docker์— PostgreSQL์„ ์„ค์น˜ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ฑด, ์ดˆ๋ณด์ž๋ผ๋„ ๋น„๊ต์  ์‰ฝ๊ณ  ์•ˆ์ „ํ•˜๊ฒŒ DB ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด์—์š”.
์ง€๊ธˆ๋ถ€ํ„ฐ ์™„์ „ ์ดˆ๋ณด ๊ธฐ์ค€์œผ๋กœ “๋ช…๋ น์–ด ํ•œ ์ค„ ํ•œ ์ค„ ์˜๋ฏธ๊นŒ์ง€” ์„ค๋ช…๋“œ๋ฆด๊ฒŒ์š”.


๐Ÿงฉ ์ค€๋น„ ๋‹จ๊ณ„

โœ… 1. Docker ์„ค์น˜ ํ™•์ธ

๋จผ์ € Docker๊ฐ€ ์„ค์น˜๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
ํ„ฐ๋ฏธ๋„(๋˜๋Š” ๋ช…๋ น ํ”„๋กฌํ”„ํŠธ)์— ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”.

 
docker --version
  • ๋งŒ์•ฝ ๋ฒ„์ „์ด ์ถœ๋ ฅ๋˜๋ฉด OK.
  • ๋งŒ์•ฝ “๋ช…๋ น์–ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค” ๋ผ๋ฉด https://www.docker.com ์—์„œ OS์— ๋งž๋Š” Docker Desktop์„ ์„ค์น˜ํ•˜์„ธ์š”.
    ์„ค์น˜ ํ›„ ๋ฐ˜๋“œ์‹œ Docker Desktop์„ ์‹คํ–‰ํ•ด๋‘ก๋‹ˆ๋‹ค.

๐Ÿ˜ PostgreSQL ์„ค์น˜ ๋ฐ ์‹คํ–‰ (Docker ๋ฐฉ์‹)

โœ… 2. PostgreSQL ์ปจํ…Œ์ด๋„ˆ ์‹คํ–‰

ํ„ฐ๋ฏธ๋„์—์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ๊ทธ๋Œ€๋กœ ์ž…๋ ฅํ•˜์„ธ์š” ๐Ÿ‘‡

 
docker run --name seed-postgres \ -e POSTGRES_USER=seeduser \ -e POSTGRES_PASSWORD=seedpass \ -e POSTGRES_DB=seed_db \ -p 5432:5432 \ -d postgres

๐Ÿง  ๋ช…๋ น์–ด ํ•ด์„

์˜ต์…˜์˜๋ฏธ
--name seed-postgres ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์„ ‘seed-postgres’๋กœ ์ง€์ •
-e POSTGRES_USER=seeduser DB ์‚ฌ์šฉ์ž ์ด๋ฆ„ ์„ค์ •
-e POSTGRES_PASSWORD=seedpass ๋น„๋ฐ€๋ฒˆํ˜ธ ์„ค์ •
-e POSTGRES_DB=seed_db ์ดˆ๊ธฐ ์ƒ์„ฑํ•  ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ด๋ฆ„
-p 5432:5432 ๋กœ์ปฌํฌํŠธ 5432๋ฅผ ์ปจํ…Œ์ด๋„ˆ์˜ 5432ํฌํŠธ์™€ ์—ฐ๊ฒฐ
-d postgres ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์‹คํ–‰, ๊ณต์‹ PostgreSQL ์ด๋ฏธ์ง€ ์‚ฌ์šฉ

โœ… 3. ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ž˜ ๋–ด๋Š”์ง€ ํ™•์ธ

 
docker ps

๊ฒฐ๊ณผ ์˜ˆ์‹œ ๐Ÿ‘‡

 
CONTAINER ID IMAGE COMMAND PORTS NAMES a1b2c3d4e5f6 postgres "docker-entrypoint.s…" 0.0.0.0:5432->5432/tcp seed-postgres

์ด๋ ‡๊ฒŒ ๋‚˜์˜ค๋ฉด ์ •์ƒ ์ž‘๋™ ์ค‘์ž…๋‹ˆ๋‹ค ๐Ÿš€


๐Ÿงญ 4. PostgreSQL ์ ‘์†ํ•˜๊ธฐ

๋ฐฉ๋ฒ• โ‘  : Docker ์•ˆ์—์„œ ์ง์ ‘ ์ ‘์†

 
docker exec -it seed-postgres psql -U seeduser -d seed_db
  • -it : ํ„ฐ๋ฏธ๋„ ๋ชจ๋“œ๋กœ ์ ‘์†
  • -U seeduser : ์‚ฌ์šฉ์ž ์ด๋ฆ„
  • -d seed_db : ์ ‘์†ํ•  DB ์ด๋ฆ„

์ ‘์† ํ›„ ๋‚˜์˜ค๋Š” ํ”„๋กฌํ”„ํŠธ ์˜ˆ์‹œ ๐Ÿ‘‡

 
seed_db=#

๊ฐ„๋‹จํ•œ ๋ช…๋ น์–ด ์˜ˆ์‹œ

 
\dt -- ํ…Œ์ด๋ธ” ๋ชฉ๋ก ๋ณด๊ธฐ \q -- ์ข…๋ฃŒ

๐Ÿ–ฅ๏ธ 5. GUI๋กœ ์ ‘์†ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด (์„ ํƒ)

์ดˆ๋ณด์ž๋ถ„๋“ค์ด๋ผ๋ฉด pgAdmin 4๋ฅผ ์ถ”์ฒœ๋“œ๋ ค์š”.

  • ์„ค์น˜: https://www.pgadmin.org/download/
  • ์‹คํ–‰ ํ›„ → Add New Server ํด๋ฆญ
    • Host name/address: localhost
    • Port: 5432
    • Username: seeduser
    • Password: seedpass

์ด์ œ GUI ํ™˜๊ฒฝ์—์„œ DB๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐ŸŽ‰


๐Ÿ”„ 6. ์ž์ฃผ ์“ฐ๋Š” Docker ๋ช…๋ น์–ด ๋ชจ์Œ

๋ช…๋ น์–ด์„ค๋ช…
docker ps ์‹คํ–‰ ์ค‘์ธ ์ปจํ…Œ์ด๋„ˆ ํ™•์ธ
docker stop seed-postgres ์ปจํ…Œ์ด๋„ˆ ์ •์ง€
docker start seed-postgres ์ปจํ…Œ์ด๋„ˆ ์žฌ์‹œ์ž‘
docker logs seed-postgres ๋กœ๊ทธ ๋ณด๊ธฐ
docker rm -f seed-postgres ์ปจํ…Œ์ด๋„ˆ ์™„์ „ ์‚ญ์ œ

๐Ÿ“ฆ 7. (์„ ํƒ) Docker Compose๋กœ ์ž๋™ํ™”ํ•˜๊ธฐ

๋งค๋ฒˆ ๋ช…๋ น์–ด๋ฅผ ์น˜๊ธฐ ๋ฒˆ๊ฑฐ๋กญ๋‹ค๋ฉด, docker-compose.yml ํŒŒ์ผ์„ ๋งŒ๋“ค์–ด ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค ๐Ÿ‘‡

 
version: '3.1' services: postgres: image: postgres container_name: seed-postgres restart: always environment: POSTGRES_USER: seeduser POSTGRES_PASSWORD: seedpass POSTGRES_DB: seed_db ports: - "5432:5432" volumes: - ./pgdata:/var/lib/postgresql/data

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค:

 
docker-compose up -d

๐Ÿ‘‰ ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ป๋‹ค ์ผœ๋„ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค (./pgdata ํด๋”์— ์ €์žฅ).


โœ… ์š”์•ฝ

ํ•ญ๋ชฉํ•ต์‹ฌ ๋‚ด์šฉ
์„ค์น˜ ๋ช…๋ น docker run -e POSTGRES_USER=... -d postgres
๊ธฐ๋ณธ ํฌํŠธ 5432
๊ธฐ๋ณธ ์ ‘์† docker exec -it ์ปจํ…Œ์ด๋„ˆ๋ช… psql -U ์‚ฌ์šฉ์ž๋ช… -d DB๋ช…
GUI ๊ด€๋ฆฌ pgAdmin 4
์œ ์ง€ ๋ฐฉ์‹ volume ๋งˆ์šดํŠธ๋กœ ๋ฐ์ดํ„ฐ ์˜๊ตฌ ์ €์žฅ

์›ํ•˜์‹ ๋‹ค๋ฉด,
๐Ÿ‘‰ ๋‹ค์Œ ๋‹จ๊ณ„๋กœ Spring Boot + ์ด PostgreSQL ๋„์ปค๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ์„ค์ • (application.yml ์˜ˆ์‹œ ํฌํ•จ) ๋„ ๋ฐ”๋กœ ์•ˆ๋‚ดํ•ด๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

 

 

 

 

1- docker pull postgres:15

2-

docker run -d `
  --name pg `
  --restart unless-stopped `
  -e POSTGRES_USER=app `
  -e POSTGRES_PASSWORD=app1234 `
  -e POSTGRES_DB=appdb `
  -p 5432:5432 `
  -v pgdata:/var/lib/postgresql/data `
  --health-cmd="pg_isready -U app" `
  --health-interval=10s --health-timeout=5s --health-retries=5 `
  postgres:15

 

 

-ํ•œ์ค„์งœ๋ฆฌ ๋ฒ„์ „

 

docker run -d --name labzang --restart unless-stopped -e POSTGRES_USER=labzang -e POSTGRES_PASSWORD=labzang88 -e POSTGRES_DB=labzangdb -p 5432:5432 -v pgdata:/var/lib/postgresql/data --health-cmd="pg_isready -U app" --health-interval=10s --health-timeout=5s --health-retries=5 postgres:15

 

 

3- docker ps

 

 

4-

docker exec -it esgseed bash

*์„ค์ •ํ•œ ์ด๋ฆ„์œผ๋กœ ๊ฒ€์ƒ‰

 

 

5-
root@4da107a874d3:/# psql -U labzang -d labzangdb

6- ์ด ํ™”๋ฉด์ด ๋‚˜์˜ค๋ฉด db ์ ‘์†๊นŒ์ง€ ์™„์„ฑ์ž…๋‹ˆ๋‹ค.
labzangdb=#

 


1- 
docker pull postgres:15


2-
docker run -d --name esgseed --restart unless-stopped -e POSTGRES_USER=esgseed -e POSTGRES_PASSWORD=esgseed1234 -e POSTGRES_DB=esgseeddb -p 5432:5432 -v pgdata:/var/lib/postgresql/data --health-cmd="pg_isready -U app" --health-interval=10s --health-timeout=5s --health-retries=5 postgres:15

3-
docker ps


docker exec -it esgseed bash


5-
root@4da107a874d3:/# psql -U esgseed -d esgseeddb

6- ์ด ํ™”๋ฉด์ด ๋‚˜์˜ค๋ฉด db ์ ‘์†๊นŒ์ง€ ์™„์„ฑ์ž…๋‹ˆ๋‹ค.
esgseeddb=#

 

 


 

 

 

 


๋งŒ๋“ค์–ด์ง„ db์— test.csv ํŒŒ์ผ์„ test ํ…Œ์ด๋ธ”๋กœ ์ €์žฅํ•˜๊ณ  ์‹ถ์–ด. ํ˜„์žฌ csvํŒŒ์ผ์€ C:\Users\hi\Documents\project\api-server\src\main\resources\static\csv ์ด ๊ฒฝ๋กœ์— ์žˆ์–ด. ์ด ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋„์ปค์•ˆ์— ์žˆ๋Š” ํฌ์ŠคํŠธ๊ทธ๋ฆฌ๋กœ ์˜ฎ๊ธฐ๊ณ  ์‹ถ์–ด. ๊ณผ์ •์„ ์„ค๋ช…ํ•ด์ค˜.

 

 

์ค€๋น„: CSV ํŒŒ์ผ ๋ณต์‚ฌ (์ด๋ฏธ ํ–ˆ์œผ๋ฉด ์ƒ๋žต)

docker cp "C:\Users\hi\Documents\project\api-server\src\main\resources\static\csv\test.csv" esgseed:/tmp/test.csv

 

1๋‹จ๊ณ„: ์ปจํ…Œ์ด๋„ˆ bash๋กœ ๋“ค์–ด๊ฐ€๊ธฐ

docker exec -it esgseed bash

 

2๋‹จ๊ณ„: psql๋กœ DB ์ ‘์†

์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ ์ž…๋ ฅ:

psql -U esgseed -d esgseeddb

 

3๋‹จ๊ณ„: ํ…Œ์ด๋ธ” ์‚ญ์ œ (๊ธฐ์กด ํ…Œ์ด๋ธ” ์žˆ์œผ๋ฉด)

psql ์•ˆ์—์„œ ์ž…๋ ฅ:

 

DROP TABLE IF EXISTS test;

 

2. ํ…Œ์ด๋ธ” ๋‹ค์‹œ ์ƒ์„ฑ (๋™์ผ)

CREATE TABLE test (
    ๋Œ€์ƒ์—ฐ๋„ TEXT,
    ๊ธฐ๊ด€๊ตฌ๋ถ„ TEXT,
    ๊ธฐ๊ด€๋ช… TEXT,
    "๊ธฐ์ค€๋ฐฐ์ถœ๋Ÿ‰(tonCOโ‚‚-eq)" NUMERIC,
    "์˜จ์‹ค๊ฐ€์Šค ์ˆœ ๋ฐฐ์ถœ๋Ÿ‰(tonCOโ‚‚-eq)" NUMERIC,
    "์˜จ์‹ค๊ฐ€์Šค ์ด ๊ฐ์ถ•๋Ÿ‰(tonCOโ‚‚-eq)" NUMERIC,
    "์˜จ์‹ค๊ฐ€์Šค ๊ฐ์ถ•(%)" NUMERIC,
    "๊ถŒ์žฅ๋ชฉํ‘œ ๋‹ฌ์„ฑ์œ ๋ฌด(13.2%)" TEXT,
    ๋น„๊ณ  TEXT
);

3. ๋ฐ์ดํ„ฐ ๋กœ๋“œ (ํ•ต์‹ฌ: FORCE_NULL ์ถ”๊ฐ€!)

\copy test FROM '/tmp/test.csv' WITH (FORMAT csv, HEADER true, DELIMITER ',', FORCE_NULL ("๊ธฐ์ค€๋ฐฐ์ถœ๋Ÿ‰(tonCOโ‚‚-eq)", "์˜จ์‹ค๊ฐ€์Šค ์ˆœ ๋ฐฐ์ถœ๋Ÿ‰(tonCOโ‚‚-eq)", "์˜จ์‹ค๊ฐ€์Šค ์ด ๊ฐ์ถ•๋Ÿ‰(tonCOโ‚‚-eq)", "์˜จ์‹ค๊ฐ€์Šค ๊ฐ์ถ•(%)"), ENCODING 'UTF8');

 

4. ํ™•์ธ

SELECT COUNT(*) FROM test;

 

์˜ˆ์ƒ: 12

 

SELECT * FROM test LIMIT 3;

 

"" ์žˆ๋˜ ๊ณณ์ด NULL๋กœ ๋“ค์–ด๊ฐ

 

 

 

ํ™•์ธ: ์ „์ฒด ๋ฐ์ดํ„ฐ๋Š” ์ž˜ ๋“ค์–ด๊ฐ”๋‚˜์š”?

sql
 
SELECT COUNT(*) FROM test;

 

 

์ด๊ฑธ ์ž…๋ ฅํ•˜๋ฉด ์ „์ฒด ํ–‰ ์ˆ˜๊ฐ€ ๋‚˜์™€์š” ์˜ˆ: 1212๊ฐœ ํ–‰์ด ๋‹ค ๋“ค์–ด๊ฐ„ ๊ฑฐ!


์ „์ฒด ๋ฐ์ดํ„ฐ ๋ณด๊ธฐ (๋ชจ๋‘ ๋‹ค ๋ณด๊ธฐ)

sql
 
SELECT * FROM test;

 

๋ชจ๋“  ํ–‰์ด ์ถœ๋ ฅ๋จ (12๊ฐœ)


์ผ๋ถ€๋งŒ ๋ณด๊ธฐ (์˜ˆ: ์•ž 5๊ฐœ)

sql
 
 

SELECT * FROM test LIMIT 5;

 

 

 

 

 

 

 

 

๊นƒํ—ˆ๋ธŒ

๋„์ปคํ—ˆ๋ธŒ

 

 

**์ด ๊ฒฝ๋กœ ์•„๋‹˜! ์ฐธ๊ณ ํ•˜์ง€ ๋ง๊ฒƒ

 

 

 

 

 

 

 

5432

 

ํ„ฐ๋ฏธ๋„์— ๋‹ค์Œ๊ฐ™์€ ๋ช…๋ น์–ด ๋„ฃ๊ธฐ

 

netstat -ano | findstr 5432 taskkill /PID 1552 /F