본문 바로가기

프로그래밍/기타

[API] 도로명 주소 API를 사용해서 주소 검색을 구현해보자 (검색API호출)

반응형

주소 API를 활용해서 주소 검색 기능을 구현해보자



1. 해당 URL로 접속한다.


https://www.juso.go.kr/CommonPageLink.do?link=/addrlink/devAddrLinkRequestSample




2. 오른쪽에 있는 신청하기 버튼을 클릭한다.







3. 정보 입력 후 API를 신청하면, 승인키가 발급된다. (예제는 팝업 API가 아닌 검색 API로 진행하겠다.)





4. 주소 API를 호출해보자



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
<script type="text/javascript">
 
/* 주소 API 적용 시작 */
 
    // 주소 검색
    function Search_Post_API(PageNo) {
 
        var intPageSize = 10;
        var intTotalPages = 0;
 
        // 검색API URL은 프로토콜(http/https) 맞춰서 설정한다.
        var strUrl = window.location.protocol + "//www.juso.go.kr/addrlink/addrLinkApiJsonp.do";
        
        if (!searchJuso()) {
            try {
                $.ajax({
                    url: strUrl
                    , type: "post"
                    , data: ({ currentPage: PageNo, countPerPage: intPageSize, keyword: $("#txt_SearchText").val(), confmKey: $("#hid_Key").val() })
                    , dataType: "jsonp"
                    , crossDomain: true
                    , success: function (xmlStr) {
 
                        if (navigator.appName.indexOf("Microsoft"> -1) {
                            var xmlData = new ActiveXObject("Microsoft.XMLDOM");
                            xmlData.loadXML(xmlStr.returnXml)
                        } else {
                            var xmlData = xmlStr.returnXml;
                        }
 
                        var errCode = $(xmlData).find("errorCode").text();
                        var errDesc = $(xmlData).find("errorMessage").text();
                        var PostList = "";
 
                        if (errCode == "0") {
                            if (xmlStr != null) {
 
                                PostList += "<p><strong>" + $(xmlData).find("totalCount").text() + "개</strong>의 주소가 검색되었습니다.</p>";
 
                                PostList += "<ul>";
 
                                $(xmlData).find("juso").each(function (i) {
                                    PostList += "<li>";
                                    PostList += "<a href=\"javascript:SetOpenerValue('" + $(xmlData).find("zipNo").eq(i).text() + "', '" + $(xmlData).find("roadAddr").eq(i).text().replace("'"," "+ "');\">";
                                    PostList += "<em>" + $(xmlData).find("zipNo").eq(i).text() + "</em>";
                                    PostList += "<span>" + $(xmlData).find("roadAddr").eq(i).text() + "<br/>" + $(xmlData).find("jibunAddr").eq(i).text() + "</span>";
                                    PostList += "</a>";
                                    PostList += "</li>";
                                });
 
                                PostList += "</ul>";
 
                                $("#dvSearchArea").html(PostList);
 
                                // 페이징
                                if ($(xmlData).find("totalCount").text() != 0) {
                                    intTotalPages = Math.ceil($(xmlData).find("totalCount").text() / intPageSize);
                                    $("#div_paginate").html(PageLink(PageNo, intTotalPages, "Search_Post_API"));
                                }
 
                            }
                        } else if (errCode == "E0005") {
                            alert("검색어를 입력해주세요.");
                        } else if (errCode == "E0006") {
                            alert("주소를 상세히 입력해주세요.");
                        } else { // 에러발생시 주소DB 호출
                            ErrorJuso();
                        }
                    }
                    , error: function (xhr, status, error) {
                        ErrorJuso();
                    }
                });
            } catch (e) {
                ErrorJuso();
            }
        }
        return;
    }
 
    // 검색 API 서비스 오류
    function ErrorJuso() {
        alert("에러발생 시 코드 작성");
    }
 
    // 검색 API 호출 전 검색어 체크
    function searchJuso() {
        if (!checkSearchedWord($("#txt_SearchText").val().toUpperCase())) {
            return true;
        } else {
            return false;
        }
    }
 
    // 특수문자, 특정문자열(sql예약어의 앞뒤공백포함) 제거
    function checkSearchedWord(obj) {
 
        if (obj != null && obj != "") {
 
            //특수문자 제거
            var expText = /[%=><+!^*]/;
            if (expText.test(obj) == true) {
                alert("특수문자를 입력 할수 없습니다.");
                $("#txt_SearchText").val(obj.replace(expText, ""));
                return false;
            }
 
            //특정문자열(sql예약어의 앞뒤공백포함) 제거
            var sqlArray = new Array("AND""OR""SELECT""INSERT""DELETE""UPDATE""CREATE""ALTER""DROP""EXEC""UNION""FETCH""DECLARE""TRUNCATE""SHUTDOWN");
 
            for (var i = 0; i < sqlArray.length; i++) {
                if (obj.match(sqlArray[i])) {
                    alert(sqlArray[i] + "와(과) 같은 특정문자로 검색할 수 없습니다.");
                    $("#txt_SearchText").val(obj.replace(sqlArray[i], ""));
                    return false;
                }
            }
        }
        return true;
    }
 
    // 임시 페이징
    function PageLink(curPage, totalPages, funName) {
 
        pageUrl = "";
 
        var pageLimit = 5;
        var startPage = parseInt((curPage - 1/ pageLimit) * pageLimit + 1;
        var endPage = startPage + pageLimit - 1;
 
        if (totalPages < endPage) {
            endPage = totalPages;
        }
 
        var nextPage = endPage + 1;
 
        if (curPage > && pageLimit < curPage) {
            pageUrl += "<a class='first' href='javascript:" + funName + "(1);'><img src='/images_new/common/2016/btn_paging_first.gif' alt='처음' /></a>";
        }
        if (curPage > pageLimit) {
            pageUrl += " <a class='prev' href='javascript:" + funName + "(" + (startPage == : startPage - 1+ ");'><img src='/images_new/common/2016/btn_paging_prev.gif' alt='이전' /></a>";
        }
 
        for (var i = startPage; i <= endPage; i++) {
            if (i == curPage) {
                pageUrl += " <a href='#'><strong>" + i + "</strong></a>"
            } else {
                pageUrl += " <a href='javascript:" + funName + "(" + i + ");'> " + i + " </a>";
            }
        }
 
        if (nextPage <= totalPages) {
            pageUrl += "<a class='next' href='javascript:" + funName + "(" + (nextPage < totalPages ? nextPage : totalPages) + ");'><img src='/images_new/common/2016/btn_paging_next.gif' alt='다음' /></a>";
        }
        if (curPage < totalPages && nextPage < totalPages) {
            pageUrl += "<a class='last' href='javascript:" + funName + "(" + totalPages + ");'><img src='/images_new/common/2016/btn_paging_last.gif' alt='끝' /></a>";
        }
 
        return pageUrl;
    }
  
    /* 주소 API 적용 끝 */
 
</script>
...
<input type="hidden" id="hid_Key" value="승인키값"/<!-- 검색API Key -->
...
<label for="inptxt3">검색어</label><input type="text" id="txt_SearchText"/>
<img src="/images_new/main/btn_srch.gif" alt="검색" onclick="javascript:Search_Post_API('1');" />
...
<div id="dvSearchArea" class="cresultArea"></div>
<div id="div_paginate" class="paginate"></div>
cs




반응형

'프로그래밍 > 기타' 카테고리의 다른 글

[네트워크] ping, telnet, tracert  (1) 2019.07.24