2015년 8월 1일부터 우편번호가 5자리로 변경이 됩니다

다행히 우정사업본부에서 OpenAPI를 제공하고 있습니다

금번 제공되는 OpenAPI는 기존 제공API보다 한단계 발전된 형태로 제공하네요

기존에는 시도선택 구군선택을 해야만 했고

지번주소인지 건물명인지 도로명인지를 선택하고

건물번호나 번지수를 입력해야 했는데

금번 제공되는 것은 도로명을 넣든 동명을 넣든 건물명을 넣든 다 검색을 해주네요

또한 검색 후 총 검색 갯수와 페이징까지 정보를 보내줍니다

또한 초기 검색시 가져올 갯수까지지정이 가능하고

검색시 현재 페이지를 넘겨주면 해당페이지에 해당하는 검색리스트를 리턴해줍니다

 

그럼 간단히 살펴볼까요

 

먼저 data.go.kr에 가셔서 회원가입을 하고 5자리 우편번호 OpenAPI사용신청을 하셔야 합니다

그러면 인증키를 발급받을수 있습니다

그런 후

http://openapi.epost.go.kr/postal/retrieveNewAdressAreaCdSearchAllService/retrieveNewAdressAreaCdSearchAllService/getNewAddressListAreaCdSearchAll?currentPage=현재페이지&srchwrd=검색어&countPerPage=페이지당 갯수&serviceKey=발급받은 인증키

 

이렇게 호출하면 XML로 데이타를 리턴해줍니다

 

리턴된 데이타를 살펴보면 (소공로로 검색해봤습니다)

 

<NewAddressListResponse>
<cmmMsgHeader>
<requestMsgId/>
<responseMsgId/>
<responseTime>20150715:102013227</responseTime>
<successYN>Y</successYN>
<returnCode>00</returnCode>
<errMsg/>
<totalCount>173</totalCount>
<countPerPage>10</countPerPage>
<totalPage>18</totalPage>
<currentPage>1</currentPage>
</cmmMsgHeader>
<newAddressListAreaCdSearchAll>
<zipNo>04633</zipNo>
<lnmAdres>서울특별시 중구 소공로 25 (회현동2가)</lnmAdres>
<rnAdres>서울특별시 중구 회현동2가 59</rnAdres>
</newAddressListAreaCdSearchAll>

.

.

.

 

</NewAddressListResponse> 

 

이런 XML을 보내줍니다

 

살펴보면

cmmMsgHeader 부분에는 전체적인 정보를 보내줍니다

검색 성공여부, 에러메세지, 전체검색갯수, 페이지당 갯수, 총페이지수, 현재페이지 정보를 보내줍니다

newAddressListAreaCdSearchAll 이부분에서 해당 내용을

우편번호, 도로명주소, 지번주소를 같이 보내줍니다

 

이것을 XML파싱을 해서 사용하시면 됩니다

 

도움이 되었으면 합니다

 

 

 

top


간만에 블로그에 글을 쓰는 것 같네요

올 8월 부터 우편번호가 5자리로 변경이 된다고 합니다

업체들 모두 걱정이 많은 것 같습니다

 

기존 6자리를 사용했는데 문제는 앞 3자리와 뒤 3자리로 구분하여 저장한 경우 골치가 아픈 것 같습니다

혼용해서 쓴다고 해도 DB 변경이 필요하구요

 

한가지 다행스러운 점은 http://data.go.kr을 통해 우정 사업본부에서 제공하는 OpenAPI를 이용해서 손쉽게 만들 수 있다는 점입니다

 

기존보다 좋아진 점은 속도도 빠르지만

검색이 매우 간결하게 바뀌었습니다

 

검색어만 가지고도 검색이 되도록 한 것입니다

 

기존처럼 지역선택이나 도로명인지 지번인지 구분하지 않아도 되고

검색어에 도로명, 건물명, 동명 등 어떤 것을 사용해서 검색을 해도 된다는 것입니다

 

이번만큼은 많이 신경을 쓴것 같습니다

하루 10000쿼리만 제공하는 점이 문제지만

이것도 운영신청으로 하면 어느 정도 해결될 것 같습니다

 

소스는 정리가 되는 대로 신청을 해주시면 메일로 보내드리겠습니다

 

문제가 있긴하네요

URL을 호출할때 검색키워드가 생뚱맞으면 스크립트 시간 초과 현상이 나옵니다

결과치를 보내주지 않구요

 

제가 요즘 하는 일이 많다보니 빠른 응대는 힘들것 같습니다

일단 UTF-8로만 만들었습니다

 

참조하시기 바랍니다.

 

지난번 신청건은 어디에 어떻게 사용하는지도 말씀안해주시고

또한 소스를 받음과 동시에 입을 싹 닦아버리지 마시고 ~~

 

그래도 이번에도 뭐 한번 풀어볼려고 합니다.....

최소한 사용용도 및 사용처를 알려주시면 보내드리겠습니다

그리고 신청시에는 EUC-KR버전인지 UTF-8버전인지를 꼭 알려주세요

 

top


우편번호 검색을 위한 자바스크립트 소스다

epost.go.kr의 우편번호 검색에 사용된 자바스크립트 소스를 이용하여 수정을 했다.

 

ASP소스와 자바스크립트 소스만 있으면 기본적으로 우편번호 검색은 끝난다

유용하게 사용하길....

 

/************************************************************************************
' 단위업무명 : 우편번호 검색을 위한 자바스크립트
' 작  성  자 : 가치노을(pobiplus@gmail.com) http://www.newnnow.co.kr
' 작  성  일  : 2011-12-01
' 수  정  자  :
' 수  정  일 :
' 내   용 : epost.go.kr에서 우편번호 검색화면 소스를 차용한것임
' 주의  사항 :
'************************************************************************************/

function eventonblur(img_name){
 var keyvalue = document.getElementById("keyword").value;
 var gubun = document.getElementById('gubun').value;
 if(gubun == "road"){
  img_url="/__cmsimg/zipcode/srch_bg.gif";
 }
 else if(gubun == "dong"){
  img_url="/__cmsimg/zipcode/srch_bg2.gif";
 }
 else if(gubun == "oldpost"){
  img_url="/__cmsimg/zipcode/srch_bg3.gif";
 }
    if((img_name.value == "") && (keyvalue == "")){
        img_name.style.background="url("+img_url+") no-repeat 2px 2px";
        img_name.style.backgroundColor="#fff";
    }
}

function fnInit(val){
 // 라디오 버튼 value 값 조건 비교
 if(val == "road"){
  document.getElementById('notitab3_list').style.display = "";
  document.getElementById('notitab4_list').style.display = "";
  document.getElementById('notitab5_list').style.display = "none";
  document.getElementById('notitab6_list').style.display = "none";
  document.getElementById('gubun').value="road";
  if(document.getElementById("keyword").value.length==0){      
   document.getElementById("keyword").style.background="url(/__cmsimg/zipcode/srch_bg.gif) #fff no-repeat 2px 1px";
  }
 
 }
 else if(val == "dong"){
  document.getElementById('notitab3_list').style.display = "none";
  document.getElementById('notitab4_list').style.display = "none";
  document.getElementById('notitab5_list').style.display = "";
  document.getElementById('notitab6_list').style.display = "none";
  document.getElementById('gubun').value="dong";
  if(document.getElementById("keyword").value.length==0){      
   document.getElementById("keyword").style.background="url(/__cmsimg/zipcode/srch_bg2.gif) #fff no-repeat 2px 1px";
  }
 }
 else if(val == "oldpost"){
  document.getElementById('notitab3_list').style.display = "none";
  document.getElementById('notitab4_list').style.display = "none";
  document.getElementById('notitab5_list').style.display = "none";
  document.getElementById('notitab6_list').style.display = "";
  document.getElementById('gubun').value="oldpost";
  if(document.getElementById("keyword").value.length==0){      
   document.getElementById("keyword").style.background="url(/__cmsimg/zipcode/srch_bg3.gif) #fff no-repeat 2px 1px";
  }
 }
}

function fnGubun(obj){
 // 라디오 버튼 value 값 조건 비교
 document.getElementById("keyword").value = "";
 if(obj.value == "road"){
  document.getElementById('notitab3_list').style.display = "";
  document.getElementById('notitab4_list').style.display = "";
  document.getElementById('notitab5_list').style.display = "none";
  document.getElementById('notitab6_list').style.display = "none";
  if(document.getElementById("keyword").value.length==0){      
   document.getElementById("keyword").style.background="url(/__cmsimg/zipcode/srch_bg.gif) #fff no-repeat 2px 1px";
  }
 
 }
 else if(obj.value == "dong"){
  document.getElementById('notitab3_list').style.display = "none";
  document.getElementById('notitab4_list').style.display = "none";
  document.getElementById('notitab5_list').style.display = "";
  document.getElementById('notitab6_list').style.display = "none";
  if(document.getElementById("keyword").value.length==0){      
   document.getElementById("keyword").style.background="url(/__cmsimg/zipcode/srch_bg2.gif) #fff no-repeat 2px 1px";
  }
 }
 else if(obj.value == "oldpost"){
  document.getElementById('notitab3_list').style.display = "none";
  document.getElementById('notitab4_list').style.display = "none";
  document.getElementById('notitab5_list').style.display = "none";
  document.getElementById('notitab6_list').style.display = "";
  if(document.getElementById("keyword").value.length==0){      
   document.getElementById("keyword").style.background="url(/__cmsimg/zipcode/srch_bg3.gif) #fff no-repeat 2px 1px";
  }
 }
}

function fnCheckForm(srcEl)
{
 var gubun, keyword,stitle;
 keyword = fnCheckstring(srcEl.keyword.value);
 stitle = srcEl.keyword.title;
 gubun = srcEl.gubun.value;
 //alert(gubun);
 if(keyword.length == 0){
  if (gubun == "road"){
   alert("도로명+건물번호를 입력하세요!\n\n검색방법 : 도로명(~로,~길)+건물번호\n- 서울시 중구 소공로 70 \n  예) '소공로(도로명) 70(건물번호)'");
  }
  else if (gubun == "dong"){
     alert("동/읍/면/리/명+지번을 입력하십시오!\n\n검색방법 : 동/읍/면/리명+지번\n- 서울시 중구 충무로1가 21-1 \n  예) '중무로1가(동명) 21-1(지번)'");
  }
  else{
     alert("동/읍/면/리/명을 입력하십시오!\n\n검색방법 : 동/읍/면/리명\n-  서울시 중구 충무로1가 \n  예) '충무로1가(동명) 또는 충무로'");
  }
  srcEl.keyword.style.backgroundImage="";
  srcEl.keyword.focus();
  return false;
 }else if(keyword.length < 2){
    alert("검색어를 2글자이상으로입력하세요!");
    srcEl.keyword.style.backgroundImage="";
    srcEl.keyword.focus();
    return false;
 }

  if (gubun == "road"){
      var str = srcEl.keyword.value.split(" ").join("");
      var strlen = str.length;
      var strdiv = "";
      for(var i = strlen-1; i > -1; i--){
          if(IsRoad(str.charAt(i))){
              strdiv = i+1;
              break;
          }
      }
      srcEl.searchKey.value = str.substring(0,strdiv);
      srcEl.MainNo.value = str.substring(strdiv,strlen);
     
      if(srcEl.searchKey.value == "시장북로"){
        alert("\"시장북로\"는 지번주소(법정동) 입니다.");
        return false;
      }
     
      if ((gubun == "road")&&((srcEl.searchKey.value == "")||(srcEl.MainNo.value == ""))) {
          alert("도로명+건물번호를 입력하세요!\n\n검색방법 : 도로명(~로,~길)+건물번호\n- 서울시 중구 소공로 70 \n  예) '소공로(도로명) 70(건물번호)'");
          return false;
      }
     
      var Temp    = srcEl.MainNo.value.split("-");
      srcEl.MainNo.value   = Temp[0];
      srcEl.SubNo.value = "";
      for (var i = 1; i < Temp.length; i++) {
          srcEl.SubNo.value = Temp[i];
          break;
      }
     
      srcEl.SubNo.value = srcEl.SubNo.value.replace(" ", "");
     
      if (srcEl.SubNo.value.length == 0) {
          srcEl.SubNo.value = "";
      }

      if ( (gubun == "road")&&(!IsNumeric(srcEl.MainNo.value) || !IsNumeric(srcEl.SubNo.value)) ) {
          alert("건물번호는 반드시 숫자만 입력하세요!");
          return false;
      }
      else{
       srcEl.MainNo.value = escape(srcEl.MainNo.value);
      }                  

  }
  //2007.11.02 동명 검색 추가 (천우관)
  else if (gubun == "dong"){
      var str = srcEl.keyword.value.split(" ").join("");
      var strlen = str.length;
      var strdiv = "";
      for(var i = strlen-1; i > -1; i--){
          if(IsDong(str.charAt(i))){
              strdiv = i+1;
              break;
          }
      }
      srcEl.searchKey.value = str.substring(0,strdiv);
      srcEl.MainNo.value = str.substring(strdiv,strlen); 

      if ((gubun == "dong")&&((srcEl.searchKey.value == "")||(srcEl.MainNo.value == ""))) {
          alert("동/읍/면/리/명+지번을 입력하십시오!\n\n검색방법 : 동/읍/면/리명+지번\n-  서울시 중구 충무로1가 21-1 \n  예) '충무로1가(동명) 21-1(지번)'");
          return false;
      }
     
      srcEl.MainNo.value = srcEl.MainNo.value.replace("산", "");
      var Temp     = srcEl.MainNo.value.split("-");
 
      srcEl.MainNo.value  = Temp[0];
      srcEl.SubNo.value = "";
 
      for (var i = 1; i < Temp.length; i++) {
          srcEl.SubNo.value = Temp[i];
          break;
      }
     
      srcEl.SubNo.value = srcEl.SubNo.value.replace(" ", "");
     
      if (srcEl.SubNo.value.length == 0) {
          srcEl.SubNo.value = "";
      }
     
      if ( (gubun == "dong")&&(!IsNumeric(srcEl.MainNo.value) || !IsNumeric(srcEl.SubNo.value)) ) {
          alert("번지는 반드시 숫자만 입력하세요!");
          return false;
      }                  
      else{
       srcEl.MainNo.value = escape(srcEl.MainNo.value);
      }                  

  }
  else if (gubun == "oldpost"){
  
      if(srcEl.keyword.value==""){
          alert("검색어를 입력하세요!");
          srcEl.keyword.focus();
          return false;
      }else if(srcEl.keyword.value.length<2){
          alert("검색어를 2글자이상으로입력하세요!");
          srcEl.keyword.focus();
          return false;
      }
      srcEl.searchKey.value = srcEl.keyword.value;
  }

  return true;
 
}

function IsNumeric(sText){
    var ValidChars = "0123456789";
    var IsNumber=true;
    var Char;

    for (i = 0; i < sText.length && IsNumber == true; i++) {
        Char = sText.charAt(i);
        if (ValidChars.indexOf(Char) == -1){
            IsNumber = false;
        }
    }
    return IsNumber;
}

function IsRoad(sText){
    var ValidChars = "개길도로리";
    var IsRoad=true;
   
    if (ValidChars.indexOf(sText) == -1){
        IsRoad = false;
    }
    return IsRoad;
}

function IsDong(sText){
    var ValidChars = "읍면동리로가";
    var IsDong=true;

    if (ValidChars.indexOf(sText) == -1){
        IsDong = false;
    }
    return IsDong;
}

function fnCheckstring(str)
{
 var index, len
 while(true) {
  index = str.indexOf(" ")
  if (index == -1) break
  len = str.length
  str = str.substring(0, index) + str.substring((index+1),len)
 }
 str = escape(str)
 while(true) {
  index = str.indexOf("%0D%0A")
  if (index == -1) break
  len = str.length
  str = str.substring(0, index) + str.substring((index+6),len)
 }
 str = unescape(str)

 return str
}

// 우편번호 검색결과 반영
function use_post(zipcode, road_address){
 post = zipcode.split("-");

 opener.parent.document.getElementById("post1").value = post[0];
 opener.parent.document.getElementById("post2").value = post[1];
 opener.parent.document.getElementById("addr").value = road_address;
 opener.parent.document.getElementById("addr2").focus();
 self.close();
}

 

혹시 소스가 파일로 필요하신분들은 메일(본문 내용을 살피면 있다)이나 댓글로 남겨주면 보내드리겠습니다

 

top