진이의 Developer Story

도로명 주소 구축 (1) 본문

DBMS/MySQL

도로명 주소 구축 (1)

JIN3260 2016. 12. 6. 10:25

처음 구축하는 경우에만 해당하는 포스팅입니다.

포스팅을 하기에 앞서 여러가지 방법중 제일 효율적인 방법을 적고자 합니다.


(1) 외부 사이트 API를 활용. (예시 : 다음 주소검색 API)

(2) 우정사업본부에서 제공하는 데이터로 구축

(3) 도로명주소(www.juso.or.kr)에서 제공하는 데이터로 구축


저의 경우는 가장 쉬운 1번과 2번방법을 이용했습니다.

(1) 다음 주소검색 API

다음에서 제공하는 js파일과 가이드에서 보여주는 html, 스크립트 코드만 넣으면 쉽게 도로명 주소를 구축하실 수 있습니다.


자체적으로 도로명 주소를 구축하면 좋겠지만, 우정사업본부에서 제공하는 600만건의 데이터, 그리고 인덱스를 잡다보면 용량이 어마어마하게 잡히는 것을 알 수 있습니다.

그리고 주소는 계속 업데이트가 되기 때문에 주기적으로 마이그레이션도 해주어야 하는 점이 골치가 아프죠.

서버 규모가 작은 경우 이용하시면 좋겠네요.


저는 팝업형으로 구현하였으며, 주소를 찾고 나서 클릭했을 때 이벤트만 사용자가 지정해주면 됩니다.

예시에서는 팝업에서 검색된 주소를 클릭했을 때, 팝업이 닫히며 검색된 값들이 본페이지의 우편번호와 주소값에 들어가는 것을 확인하실 수 있습니다.

도로명 주소와 지번 주소를 모두 지원하고 있습니다.


콜백으로 주는 json 오브젝트 안에 보시면 우편번호부터 시/도, 시/군/구, 동/읍/면, 도로명 주소, 시군구건물명, 건물관리번호 등 여러가지 값들을 제공하고 있으니, 이용자에 따라 자신의 사이트에 맞게 이용하시면 될 것 같습니다.


(2) 우정사업본부에서 제공하는 데이터로 구축

우체국 우편번호 DB를 다운받아야 합니다.

여기서 지역별 주소 DB를 다운받아주세요.


압축을 풀고 나면 지역별(강원도,서울특별시 등)로 txt파일과 레이아웃 정의에 관한 PDF파일이 있을꺼에요.

이제 테이블을 만들고, txt 파일을 밀어넣어줘야 겠죠.


테이블 구조입니다.

CREATE TABLE `TB_ADDR` (
  `ZIP_CD` char(5) DEFAULT NULL COMMENT '구역번호',
  `SIDO_NM` varchar(20) DEFAULT NULL COMMENT '시도',
  `SIDO_NM_ENG` varchar(40) DEFAULT NULL COMMENT '시도영문',
  `SIGUNGU_NM` varchar(20) DEFAULT NULL COMMENT '시군구',
  `SIGUNGU_NM_ENG` varchar(40) DEFAULT NULL COMMENT '시군구영문',
  `EYUP_NM` varchar(20) DEFAULT NULL COMMENT '읍면',
  `EYUP_NM_ENG` varchar(40) DEFAULT NULL COMMENT '읍면영문',
  `DORO_NM_CODE` char(12) DEFAULT NULL COMMENT '도로명코드',
  `DORO_NM` varchar(80) DEFAULT NULL COMMENT '도로명',
  `DORO_NM_ENG` varchar(80) DEFAULT NULL COMMENT '도로명영문',
  `JIHA_FG` char(1) DEFAULT NULL COMMENT '지하여부',
  `BUILD_MST` int(11) DEFAULT NULL COMMENT '건물번호본번',
  `BUILD_DTL` int(11) DEFAULT NULL COMMENT '건물번호부번',
  `BUILD_MNG_NO` char(25) NOT NULL COMMENT '건물관리번호',
  `DELIVERY_NM` varchar(40) DEFAULT NULL COMMENT '다량배달처명',
  `SIGUNGU_BUILD_NM` varchar(200) DEFAULT NULL COMMENT '시군구용건물명',
  `BJD_CODE` char(10) NOT NULL COMMENT '법정동코드',
  `BJD_NM` varchar(20) DEFAULT NULL COMMENT '법정동명',
  `RI_NM` varchar(20) DEFAULT NULL COMMENT '리명',
  `HJD_NM` varchar(40) DEFAULT NULL COMMENT '행정동명',
  `SAN_FG` char(1) DEFAULT NULL COMMENT '산여부',
  `JIBUN_MST` int(11) DEFAULT NULL COMMENT '지번본번',
  `EYUPDONG_NO` char(2) DEFAULT NULL COMMENT '읍면동일련번호',
  `JIBUN_DTL` int(11) DEFAULT NULL COMMENT '지번부번',
  `PRE_ZIP_CD` char(6) DEFAULT NULL COMMENT '구우편번호',
  `ZIP_NO` char(3) DEFAULT NULL COMMENT '우편번호일련번호',
  PRIMARY KEY (`BUILD_MNG_NO`),
  KEY `IDX_BJD_CODE` (`BJD_CODE`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8


이 데이터들의 PK는 건물관리번호로 잡아주시면 됩니다.

인덱스는 여러분들이 사용하는 검색방법에 따라 잡아주시면 되겠죠.


이제 데이터를 마이그레이션을 해줘야 할텐데요.

대용량 데이터를 쉽게 넣는 방법으로는 LOAD DATA INFILE을 사용하시면 됩니다.

서버 인코딩에 따라 압축파일의 인코딩을 달리해주어야 합니다.

PDF 파일 하단에 보시면 데이터 구조 및 파일 인코딩 TYPE이 있습니다.


압축파일의 인코딩은 CP949(파일 이름, 내용)로 되어 있습니다.

그러니, UTF-8 환경에서 압축을 풀 경우 한글이 깨져보이게 되는데요,

(저의 서버 환경은 UTF-8입니다)

unzip 에서 -O 옵션을 이용해서 UTF-8로 풀면 한글이름은 제대로 나오게 되지만, 최신 unzip에서는 이 옵션이 존재하지 않더군요.


저는 윈도우에서 압축을 풀고, 한글이름을 제거한 후 재압축후 서버에 넣었습니다.

그리고 서버에서 파일내용의 인코딩을 CP949 -> UTF-8로 변환하니 한글이 제대로 출력이 되더라구요. (iconv를 이용하시면 됩니다)


그리고 나서 파일을 합쳐주셔야 합니다. (파일 합치기 이전에는 파일별로 최상단에 구분값을 삭제해주세요)

구분값은 구역번호|시도|시도영문... 이런식으로 되어있는 첫줄을 의미합니다.


파일별로 구분값을 삭제해주셨다면 cat 을 이용하여 하나의 파일로 합쳐줍니다.

cat *.txt > doro.txt (모든 텍스트 파일의 내용을 doro.txt로 저장한다)


그리고 doro.txt 파일을 LOAD DATE INFILE을 이용하여 테이블에 넣어주시면 됩니다.

LOAD DATA INFILE '경로/doro.txt' 
INTO TABLE TB_ADDR 
FIELDS TERMINATED BY '|' // 컬럼별 구분자
LINES TERMINATED BY '\n' // 한 ROW의 끝은 개행

이렇게 해주시면 도로명 주소의 모든 데이터를 밀어넣으실 수 있고, 다음편에서는 해당 데이터를 활용하는 방법에 대해 포스팅해보겠습니다.

'DBMS > MySQL' 카테고리의 다른 글

TABLE TO POJO  (0) 2023.02.16
Comments