Postcodify 매뉴얼

인덱서 구동

개요

인덱서(indexer)는 PHP로 구현된 쉘 스크립트입니다. 도로명주소, 우편번호, 사서함 등의 데이터 파일을 분석하고 검색어를 추출하여 MySQL DB에 입력하는 역할을 합니다. 데이터 파일을 다운로드한 후 인덱서를 실행하여 검색 DB를 구축하시기 바랍니다.

1단계 : 구동 환경 확인

최소한의 구동 환경은 아래와 같습니다.

  • 리눅스 또는 유닉스 계열 운영체제
  • PHP 5.3 이상
  • MySQL 5.1 이상 (MariaDB도 사용 가능)

아래의 운영체제에서 정상 작동이 확인되었습니다.

  • Arch Linux
  • CentOS 6.x, 7.x
  • Debian 6.x, 7.x
  • Ubuntu 10.04, 12.04, 14.04

PHP는 웹서버가 아닌 터미널(CLI)에서 실행할 수 있어야 하며, json, mbstring pdo_mysql, readline, zip 모듈이 필요합니다. MySQL의 저장 엔진은 InnoDB를 사용합니다. InnoDB 엔진을 지원하지 않는 경우 DB 생성에 매우 긴 시간이 걸리거나 DB가 손상될 수 있습니다. MySQL의 innodb_buffer_pool_size 설정을 최소 128MB, 가능하면 1GB 이상으로 설정하시기 바랍니다.

최근 버전의 Debian 및 Ubuntu에서 인덱서 스크립트를 실행할 환경을 구축하려면 아래와 같은 명령을 사용하시면 됩니다. (버전에 따라 php5-json, php5-readline 패키지가 존재하지 않을 수도 있습니다. 이 경우에는 그냥 무시하시면 됩니다.)

apt-get update
apt-get install mysql-server mysql-client php5-cli php5-json php5-mysql php5-readline

최근 버전의 CentOS에서는 아래와 같은 명령을 사용하십시오.

yum install mysql-server php-cli php-common php-mbstring php-mysql php-pdo
service mysqld start
/usr/bin/mysql_secure_installation

인덱서는 속도 향상을 위해 PHP 자체의 멀티쓰레딩 기능을 사용하므로 pcntl_fork 및 관련 함수들이 컴파일되지 않았거나 php.ini에서 사용을 금지해 둔 경우에는 오류가 발생합니다. 일부 리눅스 배포판은 pcntl_fork 함수 사용을 php.ini에서 금지해 둔 경우도 있으니, 반드시 금지를 해제하고 사용하시기 바랍니다.

Debian 및 Ubuntu에서는 아래의 명령으로 함수 사용 금지를 해제할 수 있습니다. CentOS에서는 해제가 필요하지 않습니다.

sed -i -r 's/^disable_functions/;disable_functions/' /etc/php5/cli/php.ini

2단계 : 설정

lib 폴더 내의 config-example.php 파일을 config.php로 복사하여 DB 접속 정보를 입력하시기 바랍니다.

define('POSTCODIFY_DB_DRIVER', 'mysql');
define('POSTCODIFY_DB_DBNAME', 'DB이름');
define('POSTCODIFY_DB_HOST', 'localhost');
define('POSTCODIFY_DB_PORT', 3306);
define('POSTCODIFY_DB_USER', '아이디');
define('POSTCODIFY_DB_PASS', '암호');

3단계 : DB 생성 스크립트 실행

lib 폴더로 이동한 후, 터미널에서 php indexer.php createdb 명령을 실행합니다. 서버 사양에 따라 20분에서 3시간 정도가 걸릴 수 있습니다. 실행되는 동안에는 아래와 같은 메시지가 출력됩니다.

user@hostname:~/postcodify/lib$ php indexer.php createdb

Postcodify Indexer 3.0.0
테이블을 생성하는 중...                               [ OK ]
기본 정보를 로딩하는 중...                            [ OK ]
도로명코드 목록을 로딩하는 중...             352,268  [ OK ]
영문 행정구역명을 로딩하는 중...              14,147  [ OK ]
건물정보 데이터를 로딩하는 중...          10,608,640  [ OK ]
중간 인덱스를 생성하는 중...                       3  [ OK ]
관련지번 데이터를 로딩하는 중...           1,944,576  [ OK ]
사서함 데이터를 로딩하는 중...                   973  [ OK ]
새 우편번호 범위 데이터를 로딩하는 중...     762,835  [ OK ]
구 우편번호 범위 데이터를 로딩하는 중...      52,852  [ OK ]
우편번호가 누락된 데이터를 확인하는 중...          8  [ OK ]
영문 검색 키워드를 저장하는 중...            150,173  [ OK ]
최종 인덱스를 생성하는 중...                      54  [ OK ]
------------------------------------------------------------
작업을 모두 마쳤습니다. 경과 시간 : 27분 43초

4단계: 테스트

작업이 끝나면 아래와 같이 11개의 테이블이 생성됩니다.

  • postcodify_addresses
  • postcodify_buildings
  • postcodify_english
  • postcodify_keywords
  • postcodify_numbers
  • postcodify_pobox
  • postcodify_ranges_jibeon
  • postcodify_ranges_oldcode
  • postcodify_ranges_roads
  • postcodify_roads
  • postcodify_settings

Postcodify 1.8.x 버전까지는 저장 프로시저를 사용하였으나, 2.0 버전부터는 저장 프로시저를 사용하지 않으므로 테이블만 확인하시면 됩니다.

만약 생성된 DB의 구조가 위와 다르거나 용량이 지나치게 적은 경우 (정상 범위: 4~5GB) 데이터 또는 인덱스가 누락되었을 가능성이 높으니 주의하시기 바랍니다. 도로명주소는 데이터 양이 많기 때문에 일부 누락되더라도 찾아내기가 쉽지 않습니다.

DB가 올바르게 생성되었는지 확인하려면 php indexer.php verifydb 명령을 실행해 보시기 바랍니다. 기본적으로 있어야 하는 테이블, 인덱스, 저장 프로시저가 모두 생성되었는지, 그리고 각 테이블의 레코드 갯수가 정상적인 범위 내에 있는지 확인해 주는 기능입니다. 모든 오류를 다 찾아내지는 못하지만, 일반적인 문제들은 이 프로그램으로 충분히 찾아낼 수 있습니다.

user@hostname:~/postcodify/lib$ php indexer.php verifydb

Postcodify Indexer 3.0.0
테이블 확인 중...
인덱스 확인 중...
데이터 확인 중...
DB에 문제가 없습니다.
------------------------------------------------------------
작업을 모두 마쳤습니다. 경과 시간 : 0초

우편번호 누락시 대처 방법

행정자치부에서 종종 우편번호가 누락된 데이터를 게시하는 경우가 있습니다. Postcodify는 우편번호 범위 데이터를 사용하여 누락된 우편번호를 자동으로 찾으려고 노력하지만, 이에 실패한 경우에는 데이터 확인 도중 아래와 같은 오류 메시지가 표시됩니다.

[ERROR] 우편번호(기존번호)가 누락된 레코드가 있습니다.
  #4163856 경상북도 고령군 대가야읍 대가야로 1431

누락된 우편번호를 자동으로 찾지 못한 경우에는 수동으로 검색하여 입력해 주어야 합니다. 우편번호 수동 입력에는 php indexer.php set-postcode 명령을 사용합니다. 첫 번째 인자는 우편번호가 누락된 레코드의 고유번호, 두 번째 인자는 입력할 우편번호입니다. 우편번호를 6자리로 입력할 경우 기존번호, 5자리로 입력할 경우 새우편번호(기초구역번호)로 자동 인식합니다.

user@hostname:~/postcodify/lib$ php indexer.php set-postcode 4163856 717804

Postcodify Indexer 3.0.0
  #4163856 717804 40135 경상북도 고령군 대가야읍 대가야로 1431
------------------------------------------------------------
작업을 모두 마쳤습니다. 경과 시간 : 0초

검색 속도가 느릴 경우

DB를 방금 생성하였거나 백업/복구한 경우 인덱스가 아직 버퍼에 올라오지 않아 검색이 느릴 수 있습니다. 도로명주소, 지번 주소, 건물명 등 다양한 형태의 검색을 몇 번 하시면 버퍼가 채워지면서 검색 속도가 향상됩니다. 여러 번 검색한 후에도 검색 속도가 계속 1초 이상 나오는 경우 아래의 사항을 점검해 보시기 바랍니다.

  • 서버 사양 부족
  • DB 설정 오류 또는 디스크 손상
  • 인덱스 누락