본문 바로가기
Project/project 1 - JH community

[MySQL] 우체국 주소db 저장하기

by 끊임없는정진 2022. 11. 2.

 

▶우체국db 불러오기

 

주소 검색란을 만들 때, 우선적으로 필요한 건 우체국 주소정보의 db이다.  우체국에서는 database를 txt파일 형식으로 제공하고 있는데, 우정사업본부 홈페이지(koreapost.go.kr)에서 구할 수 있다. 

(1) 우정사업본부 홈페이지 우측 상단 메뉴버튼 누르기 -> (2) 정보공개란에서 '우정데이터 제공센터'의 '우편'란 누르기 -> (3) '우편번호DB' 누른 후, 우편번호 DB파일의 '지역별 주소 DB' 다운받기

 

우정사업본부 홈페이지 홈화면(우측 위에 메뉴가 있다.)

 

메뉴 우측하단에 '우편'

 

우편번호 DB 페이지 이동

 

제일 위의 '지역별 주소 DB' 다운받기

 

txt파일로 지역의 우편번호가 전부 모여있는데, 이제 이 내용을 데이터베이스로 불러와야 한다. 

 

 

MySQL로 주소DB 불러오기 

 

1. LOAD DATA LOCAL INFILE 기능을 최우선적으로 바꿔준다.

바꾸기 전에 local infile 설정이 어떻게 되어 있는지 확인해준다.

1
2
3
4
5
6
7
8
MariaDB [(none)]> show global variables like 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | OFF   |
+---------------+-------+
1 row in set (0.002 sec)
 
cs

 

OFF 기능이 되어있으므로, 다음과 같은 명령어를 사용해서 설정을 바꿔준다.

1
2
MariaDB [(none)]> set global local_infile=true;
Query OK, 0 rows affected (0.000 sec)
cs

 

그러면 다음과 같이 local infile 설정이 바뀌게 된다. 

1
2
3
4
5
6
7
MariaDB [(none)]> show global variables like 'local_infile';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| local_infile  | ON    |
+---------------+-------+
1 row in set (0.002 sec)
cs

 

그럼 sql을 재접속 해줘야 하는데, --local_infile -u root -p 옵션을 줘서 접속한다. (이 옵션을 줘서 접속을 하지 않으면, local infile 기능이 작동이 제대로 안될 수도 있다.)

1
2
3
MariaDB [(none)]> exit
Bye
student@jungjin:~/webApp$ mysql --local_infile -u root -p
cs

 

※ phpmyadmin에 있는 콘솔기능으로는 해결할 수 없었다. 왜냐하면 exit후 옵션을 줘서 재로그인을 해줘야 하는데, 콘솔에서는 exit를 할 수가 없었고 당연히 exit 후 옵션을 줘서 로그인도 할 수가 없었기 때문이다. 나는 며칠간 고민하다가 해결못해서 결국 쉘접속이 되도록 새로 서버를 구축했다. 

 

 

2. 주소 데이터가 들어갈 테이블을 만들어준다.

('테이블명'에 테이블 이름을 넣고 나머지는 그대로 두면 된다.)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
CREATE TABLE IF NOT EXISTS `테이블명` (
`ZIP_NO` VARCHAR(5NULL COMMENT '우편번호',
`SIDO` VARCHAR(20NULL COMMENT '시도',
`SIDO_ENG` VARCHAR(40NULL COMMENT '시도(영문)',
`SIGUNGU` VARCHAR(20NULL COMMENT '시군구',
`SIGUNGU_ENG` VARCHAR(40NULL COMMENT '시군구(영문)',
`EUPMYUN` VARCHAR(20NULL COMMENT '읍면',
`EUPMYUN_ENG` VARCHAR(40NULL COMMENT '읍면(영문)',
`DORO_CD` VARCHAR(12NULL COMMENT '도로명코드',
`DORO` VARCHAR(80NULL COMMENT '도로명',
`DORO_ENG` VARCHAR(80NULL COMMENT '도로명(영문)',
`UNDERGROUND_YN` CHAR(1NULL COMMENT '지하여부',
`BUILD_NO1` DECIMAL(5,0NULL COMMENT '건물번호본번',
`BUILD_NO2` DECIMAL(5,0NULL COMMENT '건물번호부번',
`BUILD_NO_MANAGE_NO` VARCHAR(25NULL COMMENT '건물관리번호',
`DARYANG_NM` VARCHAR(40NULL COMMENT '다량배달처명',
`BUILD_NM` VARCHAR(200NULL COMMENT '시군구용건물명',
`DONG_CD` VARCHAR(10NULL COMMENT '법정동코드',
`DONG_NM` VARCHAR(20NULL COMMENT '법정동명',
`RI` VARCHAR(20NULL COMMENT '리명',
`H_DONG_NM` VARCHAR(40NULL COMMENT '행정동명',
`SAN_YN` VARCHAR(1NULL COMMENT '산여부',
`ZIBUN1` DECIMAL(4,0NULL COMMENT '지번본번',
`EUPMYUN_DONG_SN` VARCHAR(2NULL COMMENT '읍면동일련번호',
`ZIBUN2` DECIMAL(4,0NULL COMMENT '지번부번' ,
`ZIP_NO_OLD` VARCHAR(4NULL COMMENT '구우편번호' ,
`ZIP_SN` VARCHAR(2NULL COMMENT '우편일련번호'
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
;
cs

 

 

 

 

3. 주소 데이터를 테이블에 하나씩 넣어준다.

1
2
3
mysql> LOAD DATA LOCAL INFILE "/home/student/webApp/Gangwon.txt" INTO TABLE Gangwon CHARACTER SET 'utf8' FIELDS TERMINATED BY '|' IGNORE 1 LINES;
Query OK, 359826 rows affected, 2 warnings (4.70 sec)
Records: 359826  Deleted: 0  Skipped: 0  Warnings: 2
cs

 

주소 데이터를 테이블에 하나씩 넣어주는데, 참고한 자료에서는 한 테이블에 전부 넣은 반면, 나는 지역마다 다른 테이블에 나눠서 담았다. 각각 다른 테이블에 작성한 이유는 크게 두가지인데,

(1) 대규모 데이터를 관리하기 무서웠다.(table 실수로 건들면 다시 17 시,도 데이터를 다시 업로드 해야한다.)

(2) 데이터를 불러올 때, 한 테이블에 데이터가 전부 있으면, 불러오는 속도가 엄청 느려질 것 같았다.(소규모 데이터면 상관없는데, 주소db는 어림잡아 600만개가 넘는 데이터를 가지고 있다.)

 

 

4. 구축된 DB의 상태를 확인한다.

 

 

데이터베이스가 성공적으로 업로드 된 것을 확인할 수 있다.

(※ 쉘에서 Table내용 조회하면 강제종료해야 할 수도 있다.)

 

 

 

출처 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=mariapang&logNo=221512818793 - 우체국 데이터베이스 불러오기

https://choco4study.tistory.com/66?category=1054456 - 우체국 데이터베이스 구축 (MySQL)

댓글