์ตœ๊ทผ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ ๊ธฐ๋Šฅ์€ '์ง€์—ญ ๊ธฐ๋ฐ˜ ๊ฒŒ์‹œ๊ธ€ ๊ฒ€์ƒ‰'์ด๋‹ค. ๋„ˆ๋ฌด๋‚˜๋„ ์œ ๋ช…ํ•œ ์„œ๋น„์Šค์ธ ๋‹น๊ทผ๋งˆ์ผ“์˜ ํ™ˆํ™”๋ฉด์—์„œ ๋‚ด๊ฐ€ ์‚ด๊ณ  ์žˆ๋Š” ๋™๋„ค ๊ทผ์ฒ˜์— ์žˆ๋Š” ์ค‘๊ณ ๊ฑฐ๋ž˜ ๊ฒŒ์‹œ๊ธ€์„ ๋ณด๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค. ๋‚ด๊ฐ€ ํ”„๋กœ์ ํŠธ์—์„œ ๊ตฌํ˜„ํ•˜๊ฒŒ ๋œ ๊ธฐ๋Šฅ๋„ ์‚ฌ์šฉ์ž๊ฐ€ ์„ ํƒํ•œ ์ง€์—ญ์˜ ๊ทผ์ฒ˜ ์ง€์—ญ์— ์žˆ๋Š” ๋ชจ๋“  ๊ฒŒ์‹œ๊ธ€๋“ค์„ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.

 

 ์›๋ž˜๋Š” ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค(์‚ฌ์šฉ์ž ์ฃผ์†Œ ๋“ฑ๋ก, ๊ณต์‚ฌ ๋‚ด์—ญ ๋“ฑ๋ก)์€ ํ”„๋ก ํŠธ์—”๋“œ์—์„œ select box๋ฅผ ํ†ตํ•ด ๋ฒ•์ •๋™ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ๋„, ์‹œ๊ตฐ๊ตฌ, ์๋ช…๋™์„ ์ž…๋ ฅ์„ ํ•˜๋ฉด, ์ฃผ์†Œ๋ช…์œผ๋กœ ์š”์ฒญ์ด ์™€์„œ DB์— ์ฃผ์†Œ๋ช… ๊ทธ๋Œ€๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ด์—ˆ๋‹ค.

 

 ํ•˜์ง€๋งŒ, '์ง€์—ญ ๊ธฐ๋ฐ˜ ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ'์ด ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๋ฉด์„œ ํ™•์žฅ์„ฑ์„ ์œ„ํ•ด ๋ฐฑ์—”๋“œ ์„œ๋ฒ„์—๋„ ๋ฒ•์ •๋™ ์ฝ”๋“œ์™€ ํ•จ๊ป˜ ์‹œ๋„๋ช…, ์‹œ๊ตฐ๊ตฌ๋ช…, ์๋ฉด๋™๋ช…์„ ์ €์žฅํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€, '๊ทผ์ฒ˜ ์ง€์—ญ์˜ ๊ฒŒ์‹œ๋ฌผ ๊ฒ€์ƒ‰'์ด ๋˜๋ฉด์„œ, ๋ฒ•์ •๋™ ์ •๋ณด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฒ•์ •๋™์˜ ์ขŒํ‘œ ์ •๋ณด(์œ„๋„, ๊ฒฝ๋„)๊นŒ์ง€ ํ•„์š”ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค...

 

 

 

 

 

๊ธฐ๋Šฅ ๊ตฌํ˜„์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘๊ณผ ๊ฐ€๊ณต์— ๋งŽ์€ ๊ณ ๋ฏผ๊ณผ ์‹œ๊ฐ„์„ ์Ÿ๊ฒŒ ๋˜์–ด์„œ, ๊ทธ ๊ณผ์ •์„ ์ ์–ด๋ณด๊ณ ์ž ํ•œ๋‹ค!

 

1. ๋ฒ•์ •๋™ ์ฝ”๋“œ์™€ ๋™์ด๋ฆ„ ์ €์žฅํ•˜๊ธฐ -> ํ˜„์žฌ ํฌ์ŠคํŒ…

2. ๋ฒ•์ •๋™์˜ ์ขŒํ‘œ๊ฐ’(์œ„๋„, ๊ฒฝ๋„) ์ €์žฅํ•˜๊ธฐ -> ๋‹ค์Œ ํฌ์ŠคํŒ…

 

 

 

 

 

 

 

 

 

๊ฐœ๋ฐœ ํ™˜๊ฒฝ


  • OS : MAC M2
  • Data : Python3
  • IDE : Visual Studio Code
  • DB : MySQL 8.0.36

 

 

 

 

 

 

 

 

 

 

๋ฒ•์ •๋™ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘ํ•˜๊ธฐ


 ํ˜„์žฌ ํ”„๋ก ํŠธ์—”๋“œ(React Native)์—์„œ ์“ฐ๊ณ  ์žˆ๋Š” JSON ํ˜•ํƒœ์˜ ๋ฒ•์ •๋™ ์ฃผ์†Œ ํŒŒ์ผ์ด ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ €์žฅ๋œ ์ฃผ์†Œ๊ฐ€ ๊ณ„์ธตํ™”๋˜์–ด ์žˆ์–ด ๋ณต์žกํ•ด DB์— ์ €์žฅํ•˜๊ธฐ์—๋Š” ์–ด๋ ค์›Œ๋ณด์˜€๋‹ค.

 

 ๊ทธ๋ž˜์„œ XLSX(์—‘์…€)์ด๋‚˜ SCV ํŒŒ์ผ์„ ๊ตฌํ•ด์„œ ์ง์ ‘ ๊ฐ€๊ณตํ•˜๊ธฐ๋กœ ํ–ˆ๋‹ค. ํŒŒ์ผ์„ ์ด์šฉํ•˜๋ฉด ๋ฒ•์ •๋™ ์ฝ”๋“œ, ์‹œ๋„๋ช…, ์‹œ๊ตฐ๊ตฌ๋ช…, ์๋ช…๋™๋ช…์„ ์ค„(row) ๋‹จ์œ„๋กœ ๊ฐ€์ ธ์™€ ๊ทธ๋Œ€๋กœ DB์— ์ €์žฅํ•˜๊ธฐ ์ข‹๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

 

 

๋ฒ•์ •๋™ ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ

 

 

๊ฒ€์ƒ‰์„ ํ†ตํ•ด ์ •๋ถ€ ๊ธฐ๊ด€์—์„œ ๊ณต๊ฐœํ•œ ๋ฒ•์ •๋™ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

  • ํ–‰์ „์•ˆ์ „๋ถ€(2024.02.08 ๋“ฑ๋ก ๋ฒ„์ „)  : https://www.mois.go.kr/frt/bbs/type001/commonSelectBoardArticle.do?bbsId=BBSMSTR_000000000052&nttId=107074
    • jscode20240228.zip ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์œผ๋ฉด, ๋‹ค์–‘ํ•œ ๋ฒ„์ „์˜ xlsx(์—‘์…€ํŒŒ์ผ)์ด ์žˆ๋‹ค. ํŒŒ์ผ๋งˆ๋‹ค ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ƒ์„ธ ์ •๋ณด๊ฐ€ ๋‹ค๋ฅด๋‹ค.
    • ๋‚˜๋Š” ๋ฒ•์ •๋™์˜ ์ฃผ์†Œ๋ช…๋งŒ ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— KIKcd_B.20240208.xlsx์„ ์‚ฌ์šฉํ–ˆ๋‹ค.

 

  • ๊ณต๊ณต๋ฐ์ดํ„ฐํฌํ„ธ(2024.05.13 ์ˆ˜์ • ๋ฒ„์ „) : https://www.data.go.kr/data/15063424/fileData.do
    • csv ํ˜•ํƒœ์˜ ํŒŒ์ผ์„ ๋‹ค์šด๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

 

 

 

 

 

 

 

 

 

 

๋ฒ•์ •๋™ ๋ฐ์ดํ„ฐ ๊ฐ€๊ณตํ•˜๊ธฐ


๋ฐฉ๋ฒ•1) XLSX ํŒŒ์ผ์„ SQL ์ฟผ๋ฆฌ๋กœ ๋ฐ”๊ฟ”์„œ DB์— ์ €์žฅํ•˜๊ธฐ

 

 XLSX์ด๋‚˜ SCV ํŒŒ์ผ์„ ํŒŒ์ด์ฌ์—์„œ ๊ฐ€์ ธ์™€ DB๋กœ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์—ˆ๋‹ค. ํ•˜์ง€๋งŒ, ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ ๊ท€์ฐฎ์•˜๊ธฐ์—.. SQL์— ์‚ฝ์ž…ํ•˜๋Š” ์ฟผ๋ฆฌ๋กœ ๋ณ€ํ™˜ํ•ด ์‹คํ–‰์‹œํ‚ค๊ณ ์ž, Exel ํŒŒ์ผ์„ SQL๋กœ ๋ฐ”๊ฟ”์ฃผ๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

 

์—‘์…€ ํŒŒ์ผ ๋ฐ์ดํ„ฐ

 

 

 

๋ฒ•์ •๋™์ฝ”๋“œ, ์‹œ๋„๋ช…, ์๋ฉด๋™๋ช…์„ ๊ฐ€์ ธ์™€ ์‚ฝ์ž…ํ•˜๋„๋ก ํ–ˆ๋‹ค.

INSERT INTO ADDRESS (ADDRESS_CODE, SIDO, SIGUNGU, EUBMYEONDONG) VALUES ('1100000000', '์„œ์šธํŠน๋ณ„์‹œ', '', '');
INSERT INTO ADDRESS (ADDRESS_CODE, SIDO, SIGUNGU, EUBMYEONDONG) VALUES ('1111000000', '์„œ์šธํŠน๋ณ„์‹œ', '์ข…๋กœ๊ตฌ', '');
INSERT INTO ADDRESS (ADDRESS_CODE, SIDO, SIGUNGU, EUBMYEONDONG) VALUES ('1111010100', '์„œ์šธํŠน๋ณ„์‹œ', '์ข…๋กœ๊ตฌ', '์ฒญ์šด๋™');
INSERT INTO ADDRESS (ADDRESS_CODE, SIDO, SIGUNGU, EUBMYEONDONG) VALUES ('1111010200', '์„œ์šธํŠน๋ณ„์‹œ', '์ข…๋กœ๊ตฌ', '์‹ ๊ต๋™');
INSERT INTO ADDRESS (ADDRESS_CODE, SIDO, SIGUNGU, EUBMYEONDONG) VALUES ('1111010300', '์„œ์šธํŠน๋ณ„์‹œ', '์ข…๋กœ๊ตฌ', '๊ถ์ •๋™');
INSERT INTO ADDRESS (ADDRESS_CODE, SIDO, SIGUNGU, EUBMYEONDONG) VALUES ('1111010400', '์„œ์šธํŠน๋ณ„์‹œ', '์ข…๋กœ๊ตฌ', 'ํšจ์ž๋™');

 

 

 

 ํ•˜์ง€๋งŒ, ์‹œ๊ตฐ๊ตฌ๋ช…, ์๋ฉด๋™๋ช…์ด ๋น„์–ด์žˆ๋Š” ๊ฒƒ๋„ ํ•จ๊ป˜ ์ €์žฅ์ด ๋˜์—ˆ๋‹ค. ๋‚˜์ค‘์—๋Š” ์‹œ๊ตฐ๊ตฌ๋ช…, ์๋ฉด๋™๋ช…์— ๋‚˜์ค‘์— ์ถ”๊ฐ€๋  ์œ„๋„, ๊ฒฝ๋„๊ฐ€ null์ธ ๋ฐ์ดํ„ฐ๊ฐ€ ๊ฝค ์ƒ๊ธด๋‹ค๋Š” ๊ฒƒ์ด ๋ฌธ์ œ์˜€๋‹ค. ๋‹จ์ˆœํžˆ ๋ณ€ํ™˜์œผ๋กœ๋Š” ์ด ๊ฒฝ์šฐ๊ฐ€ ์ €์žฅ๋˜์ง€ ์•Š๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ๋ชปํ•œ๋‹ค.

 

 ๊ทธ๋ฆฌ๊ณ , ์ขŒํ‘œ ์ •๋ณด๋„ ์ €์žฅ์„ ํ•ด์•ผํ•˜๋Š”๋ฐ, ์–ด์ฐจํ”ผ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด API๋กœ ์ขŒํ‘œ๋ฅผ ๋ฐ›์•„์™€ ์ €์žฅํ•ด์•ผ ๋ผ์„œ ํŒŒ์ด์ฌ์œผ๋กœ ๋Œ๋ฆฌ๊ธฐ๋กœ ํ–ˆ๋‹ค!

 

 

 

 

 

 

๋ฐฉ๋ฒ•2) ํŒŒ์ด์ฌ์œผ๋กœ ์—‘์…€ ํŒŒ์ผ์„ ์ฝ์–ด DB์— ์ €์žฅํ•˜๊ธฐ

 

 ๊ฒ€์ƒ‰์„ ํ†ตํ•ด ํŒŒ์ด์ฌ์œผ๋กœ ์ž‘์„ฑ๋œ ํ–‰์ •๋™ ๋ฐ์ดํ„ฐ๋ฅผ MySQL DB์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ํŒŒ์ด์ฌ์˜ openpysl๊ณผ pymysql ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด ์—‘์…€ ํŒŒ์ผ์„ ์ฝ์–ด, mysql์— ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.

 

 ์ฝ”๋“œ๋ฅผ ๋‚ด ์•ก์…€ ํŒŒ์ผ๊ณผ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ์— ๋งž๊ฒŒ ์ˆ˜์ •ํ•ด DB์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

 

 

MySQL์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ๊ฒฐ๊ณผ

 

 

 

 

 

 

 

 

 

 

 

ํŒŒ์ด์ฌ์œผ๋กœ ์—‘์…€ ๋ฐ์ดํ„ฐ DB์— ์ €์žฅํ•˜๊ธฐ


1) ํŒŒ์ด์ฌ ํŒจํ‚ค์ง€ ์„ค์น˜ํ•˜๊ธฐ

pip3 install openpyxl
pip3 install pymysql

 

  • openpyxl : ์—‘์…€ ํŒŒ์ผ ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ 
  • pymysql : MySQL ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ

 

 

*์ฃผ์˜ : ๋งฅ์—์„œ๋Š” pip ๋ง๊ณ , pip3๋ผ๊ณ  ๋ช…์‹œ๋ฅผ ํ•ด์ค˜์•ผ ์‹คํ–‰์ด ๋œ๋‹ค. ๋งŒ์•ฝ, pip3 ๋ช…๋ น์–ด๋„ ์•ˆ๋จนํžŒ๋‹ค๋ฉด, ์„ค์ •์„ ๋”ฐ๋กœ ๋˜ ํ•ด์ค˜์•ผ ํ•œ๋‹ค!

python3 -m pip config set global.break-system-packages true

 

 

 

 

 

2) ์—‘์…€ ํŒŒ์ผ ๋ถˆ๋Ÿฌ์™€์„œ ์ฝ๊ธฐ

์—‘์…€ ๋ฐ์ดํ„ฐ ์˜ˆ์‹œ

 

 

 

 

 

๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๋•Œ, ๊ณ ๋ คํ•ด์•ผ ๋  ๋ถ€๋ถ„์ด ์žˆ์—ˆ๋‹ค.

  • ์‹œ๊ตฐ๊ตฌ๋ช…, ์๋ช…๋™๋ช…์ด ๋น„์–ด์žˆ๋Š” ์ค„์€ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ๋™๋ฆฌ๋ช… ๋‹จ์œ„๊นŒ์ง€๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค. (์—ฌ๊ธฐ์„œ ์ฃผ์˜ํ•˜๊ธฐ)

 

์๋‹จ์œ„๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„

 

 

์œ„์˜ ๊ฒฝ์šฐ์ฒ˜๋Ÿผ, ์๋‹จ์œ„์—์„œ๋Š” ๋ฆฌ๊นŒ์ง€ ์กด์žฌํ•œ๋‹ค. ๊ทธ๋ž˜์„œ ๋™๋ฆฌ๋ช…์ด null์ธ ๊ฒฝ์šฐ์—๋งŒ ์ €์žฅ์„ ํ•˜๋„๋ก ํ–ˆ๋‹ค.

 

 

 

 

 

from openpyxl import load_workbook
import pymysql

mydict = {}

def import_xlsxfile(filename):
    load_wb = load_workbook(filename, data_only=True)
    load_ws = load_wb['KIKcd_B']

    head = True
    for row in load_ws.rows:
        if head is True:
            head = False
            continue

        if row[2].value is None or row[3].value is None:
            continue

        if not row[4].value: #๋™๋ฆฌ๋ช…๊นŒ์ง„ ์ถœ๋ ฅ ์•ˆํ•จ
            fullCode = row[0].value  # A = row[0] ๋ฒ•์ •๋™์ฝ”๋“œ 
            sido = row[1].value  # B = row[1] ์‹œ๋„๋ช…
            sigungu = row[2].value  # C = row[2] ์‹œ๊ตฐ๊ตฌ๋ช…
            eubmyeondong = row[3].value  # D = row[3] ์๋ฉด๋™๋ช…

            mydict[fullCode] = [fullCode, sido, sigungu, eubmyeondong]

 

 

 

 

 

 

 

 

 

 

2) MySQL์— ์ €์žฅํ•˜๊ธฐ

 

 MySQL์— ๋จผ์ € ํ…Œ์ด๋ธ”์„ ์ƒ์„ฑํ•ด์ฃผ์—ˆ๋‹ค.

 

ํ…Œ์ด๋ธ” ๊ตฌ์กฐ

 

 

 

 

 

๊ทธ๋ฆฌ๊ณ  MySQL์— ์—ฐ๊ฒฐํ•˜์—ฌ, ์•ž์„œ Dictionary์— ์ €์žฅํ•œ ๊ฐ’๋“ค์„ DB์— ๋„ฃ์—ˆ๋‹ค.

 

def insert_into_mysql():
    conn = pymysql.connect(host='ํ˜ธ์ŠคํŠธ ์ฃผ์†Œ', user='๊ณ„์ •๋ช…', password='๋น„๋ฐ€๋ฒˆํ˜ธ', db='DB๋ช…', charset='utf8')
    curs = conn.cursor()

    for key in mydict:
        arr = mydict[key]
        sql = "INSERT INTO address VALUES(\"%s\", \"%s\", \"%s\", \"%s\", \"%s\", \"%s\");"\
            % (arr[0], arr[1], arr[2], arr[3], arr[4], arr[5])
        curs.execute(sql)

    conn.commit()
    conn.close()

 

 

 

 

 

 

 

4) ์‹คํ–‰ ๊ฒฐ๊ณผ

 

 

 

 

 

 

 

 

 

 

์ฐธ๊ณ  ์ž๋ฃŒ


[Python] ๋Œ€ํ•œ๋ฏผ๊ตญ ํ–‰์ •๋™ ๋ฐ์ดํ„ฐ MySQL DB ํ…Œ์ด๋ธ” ์ƒ์„ฑ ์˜ˆ์‹œ : https://woonizzooni.tistory.com/entry/Python-%EB%8C%80%ED%95%9C%EB%AF%BC%EA%B5%AD-%ED%96%89%EC%A0%95%EB%8F%99-%EB%8D%B0%EC%9D%B4%ED%84%B0-MySQL-DB-%ED%85%8C%EC%9D%B4%EB%B8%94-%EC%83%9D%EC%84%B1-%EC%98%88%EC%8B%9C

 

giraffe_