상세 컨텐츠

본문 제목

ASP.NET 새주소(도로명주소) api 사용하기

Programming/asp.net

by luckey 2014. 8. 19. 13:00

본문

다음에서 우편번호검색 서비스 api가 무료로 공개되었습니다.

 

새주소(도로명주소) api - 다음(Daum)

 

아래 내용은 참고사항으로만~~~ ^^;;;;

 

http://www.songtory.com/zipcode

http://mytory.net/archives/12185

http://freegunkng.blog.me/90185878085

http://blog.naver.com/oralol?Redirect=Log&logNo=100199100708

 

위의 링크들을 참고하여 개발된 자료입니다.

 

새주소(도로명주소)를 등록할 수 있게 하는 방법으로는 기존 작업하던 방식대로 DB안에 우편번호 Data를 넣고 검색하는 방법과 공공데이터포털에서 제공하는 api를 사용하는 방법이 있다.

 

기존작업방식으로 할 경우 다양한 검색방법을 제공할 수 있는데(직접 만들면 되니...) Data용량이 1G가 넘기 때문에 호스팅을 쓰거나 공간이 부족한 경우에는 사용이 조금 어려울 수 있겠다.

 

공공데이터포털을 사용하게되면 용량걱정을 줄어드나 도로명주소를 검색하기 위해서는 건물번호까지 알아야한다.

주소를 알고 있고 우편번호만 검색하기에는 좋은 기능이나 도로명까지만 알 경우에는 검색이 되지 않는다는 단점이 있다.

 

기존작업방식은 사용해보지 않아서 기존 우편번호 DB가 포함되어 있는지 모르겠지만 공공데이터포털을 이용하는 경우 기존주소(동명)으로는 검색이 불가능하다.

 

도로명주소와 기존주소를 병행해서 사용하고자 할 경우에는 공공데이터포털의 도로명주소 api와 기존 우편번호DB 를 그대로 사용하는 방법밖에 없을 듯 하다.

 

 

1. 공공데이터포털 가입 및 인증키 생성

 

먼저 공공데이터포털(www.data.go.kr) 사이트에 회원가입을 하고 검색어에 도로명주소를 검색하면 OPEN API가 1건이 나온다. 도로명주소 조회서비스 활용신청 버튼이나 제목을 클릭하면 상세페이지로 이동되며 활용신청을 한다.

 

 

 

OPEN API 활용신청은 간단하게 진행되며 자동승인이기 때문에 신청과 동시에 승인이 된다.

하지만 1시간 정도 지나야 활성이 된다고들 하니 신청하고 개발작업하고 1시간 정도 후에 테스트를 진행하도록 하자.

 

활용신청을 한 후 마이페이지의 OPEN API > 개발계정에 들어가 보면 신청해서 바로 승인된 도로명주소조회서비스 API 목록이 보이게 되고 클릭하면 인증키를 받을 수 있다.

 

 

 

 

페이지 상의 인증키 발급프로그램 링크를 클릭하게 되면 프로그램을 하나 다운로드 받게 되는데.. 이게 JAVA 프로그램이라 JRE가 설치되어 있어야 한다. 그것도 무려 1.6버전이... 만약 상위버전이 깔려있으면 실행이 되지 않는다.

 

공공데이터포털에서 답변으로 작성된 자바 1.6다운로드 URL(회원가입을해야 받을 수 있다.)

http://www.oracle.com/technetwork/java/javasebusiness/downloads/java-archive-downloads-javase6-419409.html#jre-6u45-oth-JPR

 

만약 상위버전이 깔려있을경우 자바를 설치해야한다고 창이뜨고 확인을 클릭하면 다운로드 페이지로 이동은 하지만 1.6버전 다운로드가 아니라 최신버전 다운로드 페이지로 이동한다. 이건 빨리고쳐져야 할듯...

 

인증키 발급 프로세스는 다운받은 인증키발급프로그램 압축파일안에 있는 readMe.doc 파일을 참고하도록 한다.

 

인증키 생성이 완료되었으면 해당 인증키를 잘 복사해두거나 공공데이터포털 사이트의 마이페이지 > OPEN API >  인증키 발급현황에서도 볼 수 있으니 일단 생성만!!  해두도록 한다.

 

 

2. 우편번호검색 페이지 개발

 

참고로 사용언어는 asp.net 2.0으로 구현하였으며 되도록 많은 페이지를 거치지 않도록 한페이지 안에서 처리가 되도록 하였다. 페이지 처리 프로세스는 다음과 같다.

 

우편번호를 입력할 페이지에서 우편번호찾기를 클릭하면 우편번호 검색창이 생성된다.

우편번호 검색창에서는 신주소(도로명 + 건물번호)와 구주소(동,읍/면/리)를 선택할 수 있는 select box와 검색어를 입력할 수 있는 input box가 있다.

 

우편번호 검색창에서는 form값으로 데이터를 넘기지 않고 일반 Button 으로 클릭발생시 스크립트로 오류체크하고 location으로 현재페이지로 다시 이동하도록 처리하였다.

 

특별한 이유는 없고 위의 주소를 참고하여 샘플로 만들다 보니 그렇게 된듯.. form으로 받아서 처리해도 된다.

 

 

우편번호를 등록받을 페이지와 우편번호 검색창을 만들면 된다.

 

우편번호 검색창 script 

    <script type="text/javascript" src="zipcode_find.js"></script>
    <script type="text/javascript">
        $(function() {
            if ($('#gubun_ret').val().replace(/\s/g, "") != '') {
                $("#gubun").val($('#gubun_ret').val()).attr("selected", "selected");
            }

            if ($('#keyword_ret').val().replace(/\s/g, "") != '') {
                $('#keyword').val($('#keyword_ret').val());
            }

            //검색버튼(id : schBtn)을 클릭하면 zipcode_find.js의 zipcodeFind 함수를 호출합니다.

            $('#schBtn').click(function() {
                var gubun = $('#gubun').val();
                var dong = $('#keyword').val().replace(/\s/g, "");
                fnObj.zipcodeFind(gubun, dong);
            });

        });
    </script>

 

zpicode_find.js

var fnObj = {
    zipcodeFind: function(gubun, keyword) {
        if (keyword.length == 0) {
            if (gubun == "road") {
                alert("도로명+건물번호를 입력하세요!\n\n검색방법 : 도로명(~로,~길)+건물번호\n- 서울시 중구 소공로 70 \n  예) '소공로(도로명) 70(건물번호)'");
            } else {
                alert("동/읍/면/리/명을 입력하십시오!\n\n검색방법 : 동/읍/면/리명\n-  서울시 중구 충무로1가 \n  예) '충무로1가(동명) 또는 충무로'");
            }

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

       

        //신주소(도로명주소)가 선택되었을 경우 처리되는 함수

        if (gubun == "road") {
            fnObj.roadSearch(keyword);
        }

        location.href = "검색페이지주소.aspx?gubun=" + gubun + "&keyword=" + keyword;
    },
    roadSearch: function(keyword) {
        var str = keyword.split(" ").join("");
        var strlen = str.length;
        var strdiv = 0;
        var searchKey = "";
        var searchNo = "";
        for (var i = strlen - 1; i > -1; i--) {
            if (IsRoad(str.charAt(i))) {
                strdiv = i + 1;
                break;
            }
        }

        searchKey = str.substring(0, strdiv);
        searchNo = str.substring(strdiv, strlen);

 

        if (searchKey == "시장북로") {
            alert("\"시장북로\"는 지번주소(법정동) 입니다.");
            return false;
        }

        if ((searchKey == "") || (searchNo == "")) {
            alert("도로명+건물번호를 입력하세요!\n\n검색방법 : 도로명(~로,~길)+건물번호\n- 서울시 중구 소공로 70 \n  예) '소공로(도로명) 70(건물번호)'");
            return false;
        }

        var subNo = "";
        var Temp = searchNo.split("-");
        searchNo = Temp[0];

        for (var i = 1; i < Temp.length; i++) {
            subNo = Temp[i];
            break;
        }

        subNo = subNo.replace(" ", "");

        if (subNo.length == 0) {
            subNo = "";
        }

        if (!IsNumeric(searchNo) || !IsNumeric(subNo)) {
            alert("건물번호는 반드시 숫자만 입력해 주세요");
            return false;
        }
    }
}

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, address) {
    var post = zipcode.split("-");

    opener.parent.document.getElementById("post1").value = post[0];
    opener.parent.document.getElementById("post2").value = post[1];
    opener.parent.document.getElementById("address1").value = address;
    opener.parent.document.getElementById("address2").focus();

    self.close();
}

 

우편번호 검색창 cs

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                if (Request.QueryString["gubun"] != null)
                {
                    gubun_ret.Value = Request.QueryString["gubun"];
                }

                if (Request.QueryString["keyword"] != null)
                {
                    keyword_ret.Value = Request.QueryString["keyword"];
                }

                if (gubun_ret.Value.Length > 0 && keyword_ret.Value.Length > 0)
                {
                    if (gubun_ret.Value == "road")
                    {
                        NewAddress();
                    }
                    else
                    {
                        //기존  DataBase 검색방식을 그대로 사용하면 될듯...

                        OldAddress();
                    }
                }
            }
        }

 

        protected void NewAddress()
        {
            string printAddress = "";
            string post = "", addr = "";
            string url = "";
            string successYN = "";

 

//url의 검색어와 인증키는 인코딩을 해서 사용해야 합니다.           

url = "http://openapi.epost.go.kr/postal/retrieveNewAdressService/retrieveNewAdressService/getNewAddressList?searchSe="+gubun_ret.Value+"&srchwrd=" + Utf8Encode(keyword_ret.Value) + "&serviceKey=" + Utf8Encode("인증키");

 

            WebClient client = new WebClient();
            client.Headers["accept-language"] = "ko";

            XmlTextReader reader = new XmlTextReader(client.OpenRead(url));

            while (reader.Read())
            {
                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.Name == "successYN")
                    {
                        successYN = reader.ReadElementString();
                    }

                    if (successYN == "Y")
                    {
                        post = "";
                        addr = "";

                        if (reader.Name == "zipNo")
                        {
                            post = reader.ReadElementString();

                        }

                        if (gubun_ret.Value == "road")
                        {
                            if (reader.Name == "lnmAdres")
                            {
                                addr = reader.ReadElementString();
                            }
                        }
                        else
                        {
                            if (reader.Name == "rnAdres")
                            {
                                addr = reader.ReadElementString();
                            }
                        }

                        if (post.Length > 0 && addr.Length > 0)
                        {
                            printAddress += "<tr><td align=\"center\"><a href=\"javascript:void(0);\" onclick=\"javascript:use_post('" + post + "','" + addr + "');\">" + post + "</a></td>";
                            printAddress += "<td>" + addr + "</td></tr>";
                        }
                    }
                }
            }

            if (printAddress.Length < 10)
            {
                printAddress += "<tr><td colspan=\"2\" style=\"text-align:center; padding:30px 0px;\">검색된 주소가 없습니다.</td></tr>";
            }

            zipCodeSelect.Text = printAddress;
        }

 

 //Utf8Encode는 기존에 만들어져 있던 함수를 그대로 사용한거라... 취향에 맞게 만들어서 사용하면 될듯 

  protected string Utf8Encode(string sParam)
  {
       sTemp2 = String.Empty;
       sTemp1 = sParam;

       if (sParam == String.Empty || sParam == null)
       {
            sTemp2 = "";
            return sTemp2;
       }
   
       UTF8Encoding utf8 = new UTF8Encoding();

       try
       {
            Byte[] encodedBytes = utf8.GetBytes(sTemp1);
            foreach (Byte b in encodedBytes)
            {
                 sTemp2 += String.Format("%{0:X2}", b);
            }
            sTemp2 = sTemp2.ToUpper();
       }
       catch(Exception Ex)
       {
            sTemp2 = "Exception Err |" + Ex.Source.ToString() + "|" + Ex.Message.ToString();
       }
       return sTemp2;
  }

 

asp, php 버전은 많은것 같아서 asp.net 페이지 개발하던중 필요하게 되어서 개발을 하게 되었으며..

필요한건 우편번호가 필요해서 만든것이기 때문에 사용자가 쓰기에는 조금 불편할 수 있음..

관련글 더보기

댓글 영역