Developer Factory

Postcodify API를 사용하여 변환 스크립트를 PHP로 새우편번호 변환 본문

Developer/PHP

Postcodify API를 사용하여 변환 스크립트를 PHP로 새우편번호 변환

Jeremy.Park 2015. 7. 22. 10:50

새우편번호 변환 안내

개요

2015년 8월 1일부터 우편번호가 5자리로 변경됩니다. Postcodify를 사용하면 기존 우편번호를 사용하는 주소 DB를 새우편번호로 쉽게 변환할 수 있습니다.

Postcodify를 구동하려면 PHP 5.2 이상에 curl 및 json 모듈이 설치되어 있어야 합니다. MySQL DB 덤프를 사용할 경우 mysqlmysqlipdo 방식을 모두 지원하며, SQLite 덤프를 사용할 경우에는 pdo 방식만 지원합니다.

많은 양의 데이터를 처리하려면 시간이 많이 소요될 수 있으므로 웹에서 호출하기보다는 SSH 쉘, 명령프롬프트 등의 CLI 환경에서 사용하시기 바랍니다.

로컬 검색서버 구축

2천 건 이상 변환하려면 Postcodify에서 제공하는 DB 덤프를 다운받아 로컬 검색서버를 구축하는 것이 좋습니다. 무료 API를 사용하지 않으므로 검색수 제한이 없으며, 서버 사양에 따라서는 CPU 코어 1개당 시간당 10만 건 이상의 대량 변환도 가능합니다.

Postcodify 프로그램과 DB 덤프를 다운로드한 후, 변환이 필요한 주소 DB를 불러와 변환하는 스크립트를 아래와 같이 작성합니다. 검색 결과가 2건 이상인 경우 가장 정확하게 일치하는 것을 자동으로 찾아 입력하며, 검색 결과가 없거나 너무 많아서 검색에 실패한 경우에는 null이 입력됩니다.

<?php

// Postcodify 인클루드
include './postcodify/lib/autoload.php';

// 다운로드한 DB 덤프를 사용하여 검색서버 생성
$server = new Postcodify_Server();
$server->db_driver = 'sqlite';
$server->db_dbname = 'postcodify.20150713.v3.sqlite';

// 기존 주소 DB를 $addresses 배열로 불러왔다고 가정함
// 실제 시스템 구조에 따라 mysql_fetch_assoc() 등의 함수를 사용해야 할 수도 있음
// 검색어에는 주소 첫 줄만 입력할 것 (예: 서울특별시 중구 세종대로 110)
foreach ($addresses as $address)
{
    // 검색 실행
    $results = $server->search($address);

    // 검색에 실패한 경우 $postcode5는 null로 남음
    $postcode5 = null;

    // 검색 결과가 1건인 경우
    if ($results->count == 1)
    {
        $postcode5 = $results->results[0]->postcode5;
    }

    // 검색 결과가 2건 이상인 경우
    elseif ($results->count > 1)
    {
        // 모든 검색 결과의 우편번호가 똑같은 경우 상관없음
        $postcode5_list = array();
        foreach ($results->results as $result)
        {
            $postcode5_list[] = $result->postcode5;
        }
        $postcode5_list = array_unique($postcode5_list);
        if (count($postcode5_list) == 1)
        {
            $postcode5 = $postcode5_list[0];
        }

        // 검색어와 정확하게 일치하는 레코드를 찾아 사용
        if ($postcode5 === null)
        {
            $keyword = preg_match('/[동리가로길]\s*산?\s?\d+(-\d+)?$/u', $address, $matches) ? $matches[0] : '';
            foreach ($results->results as $result)
            {
                if ($keyword && (strpos($result->ko_doro, $keyword) !== false || strpos($result->ko_jibeon, $keyword) !== false))
                {
                    $postcode5 = $result->postcode5;
                    break;
                }
            }
        }
    }

    // 검색한 새우편번호를 DB에 다시 입력
    // 실제 시스템 구조에 따라 응용할 것
    if ($postcode5 !== null)
    {
        echo "$postcode5 $address \n";
    }
    else
    {
        echo "ERROR $address \n";
    }
}

무료 API 사용

변환할 주소가 2천 건 미만인 경우에는 로컬 검색서버를 구축하지 않고 무료 API 서버를 사용하여 변환할 수도 있습니다. 단, 네트워크 통신이 발생하기 때문에 로컬 서버에 비해 검색 속도가 크게 떨어집니다.

사용할 스크립트는 위와 같으나, 검색 서버를 생성하는 코드 대신 아래와 같이 클라이언트를 생성하도록 하고:

// 무료 API 클라이언트 생성
$client = new Postcodify_Client();
$client->set_domain('님의.도메인.com');

서버 대신 클라이언트 클래스를 사용하여 검색하면 됩니다.

// 검색 실행
$results = $client->search($address);

사용할 도메인이 마땅치 않은 경우에는 기타 어플리케이션 개발 안내 페이지의 “도메인” 섹션을 참고하여 작성하시기 바랍니다. 하루 2천 건 이상 검색하거나 도메인 및 IP를 조작하여 검색수 제한을 우회하려고 시도할 경우 서버 정책에 따라 검색이 차단될 수 있으니 유의하십시오.

가능하면 무료 API 사용자가 적은 새벽 시간대에 작업하시기를 권장합니다.

고급 기법

대부분의 데이터가 정확한 도로명주소 또는 지번주소로 이루어져 있다면 DB 덤프에 포함된 아래의 테이블들을 사용하여 검색 루틴을 직접 개발하실 수도 있습니다.

  • postcodify_ranges_roads
  • postcodify_ranges_jibeon

위의 테이블들에는 도로명주소 및 지번주소 범위에 따른 새우편번호 배정 내역이 담겨 있습니다. 2015년 초 행자부 일일변동분(업데이트) 데이터에 새우편번호가 누락된 경우가 종종 있어서, 이것을 채워넣기 위해 사용하던 데이터입니다. 만약 위의 방법으로 검색이 되지 않는다면 이 테이블들을 사용하여 채워넣을 수도 있습니다.

이 기법을 구현하기 위한 소스코드는 별도로 제공하지 않으며, 직접 개발하여 사용하셔야 합니다.





우체국 새 우편번호 

http://www.epost.go.kr/search/zipcode/cmzcd002k01.jsp

'Developer > PHP' 카테고리의 다른 글

php 가드 v2.0  (0) 2014.10.08
PHP의 php.ini 설정에서 register_globals = on/off 차이  (0) 2014.09.29