DB엔지니어가 공부하는 python

파이썬_주소DB 공공데이터포털 에서 주소DB 다운 받아 DB에 insert 하기 #1

sTricky 2020. 1. 17. 10:49

파이썬_주소DB 공공데이터포털 에서 주소DB 다운 받아 DB에 insert 하기 #1

 

안녕하세요.

 

이번 작업은 제가 이미 여러 번 했던 작업이긴 한데..

 

혹시나 필요하신 분들이 계실까 싶어 공유합니다.

 

우리나라 주소 DB를 내 DB에 구축하는 방법입니다.

 

1편은 파이썬과 직접적으로 관련 없습니다.

 

이젠 추후에 이 주소 DB를 가지고 여러 가지 작업을 할 텐데요, 업데이트도 해야 하고, 주소와 관련된 다른 정보도 

 

받아 오도록 해보겠습니다.

 

1. 필요한 자료 다운로드하기

 

우선 아래 링크에서 주소DB 전체분을 다운로드합니다.

 

 

http://www.juso.go.kr/addrlink/addressBuildDevNew.do?menu=match

 

 

 

 

공공데이터 포털입니다.

 

여기 재미있는 데이터 많이 있습니다. 

 

미세먼지 데이터도 있고, 출산, 고령과 와 관련된 데이터, 농축산 가격정보 데이터 등등..

 

우리가 흔히 쓰는 버스도착정보 같은 api도 제공합니다.

 

말도 못 할 정도로 많아요!!

 

아무튼 저희는 오늘 주소 DB를 다운로드하겠습니다.

 

위 링크에 접속을 하셔서 가장 최신의 주소 DB 다운로드를 합니다.

 

"전체 자료"를 받아주시면 됩니다.

 

 

 

 

다운로드를 하시고, 파일을 다운로드한 폴더로 이동하셔서 압축을 풀어 줍니다.

 

압축을 풀어주면 아래와 같은 파일들이 들어 있는 것을 확인할 수 있습니다.

 

 

 

 

여기 있는 "[가이드]주소DB 활용방법. pdf" 파일을 열면 대략적으로 같이 있는 "*. txt" 파일들에 들어있는

 

데이터의 형태, 그리고 정의를 보실 수 있습니다.

 

파일명을 보고 예상을 하실 수 있겠지만,

 

주소 DB는 크게 4개의 테이블로 구성되어 있습니다.

2. 테이블생성 하기

 

주소, 지번, 부가정보, 도로명 코드

 

이렇게 4개의 테이블을 생성해서 각각의 "*. txt" 파일 안의 데이터를 4개의 테이블에 insert 하면 됩니다.

 

저 같은 경우엔 mariadb를 사용해서 insert 했습니다.

 

DB에 위 4개의 테이블을 각각 생성하여

LOAD DATA local infile "/home/naddru/test/test.txt" INTO TABLE test;

LOAD DATA 기능을 이용하여 insert 하니 정말 빠르게 데이터를 넣을 수 있었습니다.

 

도로명 주소 테이블만 봐도 630만 건의 데이터가 있고, 지번 쪽은 824만 건의 데이터가 있습니다.

 

4개 테이블을 다 합치면 데이터 건수는 약 2117만 건 정도가 나옵니다.

 

일단 제가 만든 4개의 테이블 DDL을 공유하겠습니다.  WOW!!

 

#부가정보 테이블
create table add_info_m
(
	mgmt_num varchar(25) not null comment '관리번호'
		primary key,
	adm_dong_cd varchar(10) null comment '행정동코드',
	adm_dong_nm varchar(50) null comment '행정동명',
	zipcode varchar(5) null comment '우편번호',
	zipcode_seq varchar(3) null comment '우편번호일련번호',
	plent_dlvr_nm varchar(100) null comment '다량배달처명',
	build_rgst_nm varchar(100) null comment '건축물대장건물명',
	sgg_build_nm varchar(100) null comment '시군구건물명',
	multi_unit_yn varchar(1) null comment '공동주택여부'
);

#지번 테이블
create table jibun_info_m
(
	mgmt_num varchar(25) not null comment '관리번호',
	seq varchar(12) not null comment '일련번호',
	law_dong_cd varchar(10) null comment '법정동코드',
	sd_nm varchar(50) null comment '시도명',
	sgg_nm varchar(50) null comment '시군구명',
	law_umd_nm varchar(50) null comment '법정읍면동명',
	law_ri_nm varchar(50) null comment '법정리명',
	san_yn varchar(1) null comment '산여부',
	jb_main_num int(4) null comment '지번본번(번지)',
	jb_sub_num int(4) null comment '지번본번(호)',
	main_yn varchar(1) null comment '대표여부',
	primary key (mgmt_num, seq)
);

#주소 테이블(도로명 주소)
create table juso_info_m
(
	mgmt_num varchar(25) not null comment '관리번호'
		primary key,
	road_nm_cd varchar(12) not null comment '도로명코드',
	umd_seq varchar(2) not null comment '읍면동일련번호',
	basement_yn varchar(1) null comment '지하여부',
	build_main_num int(5) null comment '건물본번',
	build_sub_num int(5) null comment '건물부번',
	base_area_num varchar(5) null comment '기초구역번호',
	update_type_cd varchar(2) null comment '변경사유코드',
	anncmt_date varchar(8) null comment '고시일자',
	orgn_road_nm_addr varchar(100) null comment '변경전도로명주소',
	get_detail_addr_yn varchar(1) null comment '상세주소부여여부'
);

#도로명코드 테이블
create table road_cd_info_m
(
	road_nm_cd varchar(12) not null comment '도로명코드',
	umd_seq varchar(2) not null comment '읍면동일련번호',
	road_nm varchar(160) null comment '도로명',
	road_roma_nm varchar(160) null comment '도로명로마자',
	sd_nm varchar(50) null comment '시도명',
	sd_roma_nm varchar(100) null comment '시도로마자',
	sgg_nm varchar(50) null comment '시군구명',
	sgg_roma_nm varchar(100) null comment '시군구로마자',
	umd_nm varchar(50) null comment '읍면동명',
	umd_roma_nm varchar(100) null comment '읍면동로마자',
	umd_gb varchar(1) null comment '읍면동구분',
	umd_cd varchar(3) null comment '읍면동코드',
	use_yn varchar(1) null comment '사용여부',
	update_rs_cd varchar(1) null comment '변경사유',
	update_his_info varchar(14) null comment '변경이력정보',
	anncmt_date varchar(8) null comment '고시일자',
	erase_date varchar(8) null comment '말소일자',
	primary key (road_nm_cd, umd_seq)
);



 

이렇게 4개의 테이블을 만드시고 나서

3. 데이터 insert 하기

아래 sql을 자신에게 맞게, 테이블에 맞게, 수정하여 실행하면 텍스트 파일을 테이블로 insert 할 수 있습니다.

 

 

LOAD DATA LOCAL INFILE '/home/mariadb/all_juso_201911/지번_충청북도_utf8.txt'
REPLACE
INTO TABLE jibun_info_m
FIELDS TERMINATED BY '|'
OPTIONALLY ENCLOSED BY ''
LINES TERMINATED BY '\n'
(@mgmt_num,
@seq,
@law_dong_cd,
@sd_nm,
@sgg_nm,
@law_umd_nm,
@law_ri_nm,
@san_yn,
@jb_main_num,
@jb_sub_num,
@main_yn)

SET
mgmt_num = @mgmt_num,
seq = @seq,
law_dong_cd = @law_dong_cd,
sd_nm = @sd_nm,
sgg_nm = @sgg_nm,
law_umd_nm = @law_umd_nm,
law_ri_nm = @law_ri_nm,
san_yn = @san_yn,
jb_main_num = @jb_main_num,
jb_sub_num = @jb_sub_num,
main_yn = @main_yn,
aud_last_update = now();

 

 

참고로 저는 다운로드한 텍스트 파일을 DB가 설치되어 있는 ubuntu OS에 옮겼고,

 

이걸 바로 실행했는데, 한글이 깨졌었습니다. 그래서 텍스트 파일을 utf8 캐릭터 셋으로 변환하는 작업을

 

먼저 하고 위와 같이 LOAD DATA LOCAL INFILE 기능으로 INSERT 작업을 했습니다.

 

이렇게 여러 번 작업을 하고 나면 테이블에 데이터가 다 쌓였겠죠?

 

이렇게 일단, 공공데이터 포털에서 주소 DB를 다운로드하였고, 그 다운로드한 텍스트 파일을 이용해서 DB에 테이블 만들고

 

데이터까지 부어보는 것을 했습니다.

 

다음 편에선 주소 데이터를 이용해서 필요한 주소를 만들어내고, 도로명주소와 지번주소를 변환하는 

 

파이썬 코드를 짜 보겠습니다.

 

파이팅입니다!!

 

 

# 아래는 상가 상권 정보를 다운받아서 데이터 insert 하는 내용 입니다.

# 상가(상권)데이터 DB에 넣기

2020/02/24 - [DB엔지니어가 공부하는 python] - [python_상가(상권)정보DB가지고놀기]공공데이터포털 에서 상가(상권)정보DB 다운 받아 DB에 insert 하기

 

[python_상가(상권)정보DB가지고놀기]공공데이터포털 에서 상가(상권)정보DB 다운 받아 DB에 insert 하기

[python_상가(상권)정보DB가지고놀기]공공데이터포털 에서 상가(상권)정보DB 다운 받아 DB에 insert 하기 #1 안녕하세요. 이번에는 지난번 주소DB에 이어 상가(상권) 정보 DB를 공공데이터 포털에서 다운로드하여..

stricky.tistory.com

 

 

by.sTricky