본문으로 바로가기

도로명 API 사용예제

category 언어/Spring 2020. 1. 2. 10:28

http://www.juso.go.kr/ 접속 후 우측 상단 개발자 센터를 클릭합니다.

주요 서비스 API 신청하기 후 키 발급 받기

img

img

가이드 및 소스 다운받기

sch_zipcode.jsp

<%@ page contentType="text/html; charset=utf-8" pageEncoding="utf-8"%>
<%@ taglib prefix="c"      uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="form"   uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="ui"     uri="http://egovframework.gov/ctl/ui"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags"%>		
<!-- 우편번호검색 -->
<!-- <head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>     
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js"></script>
<script type="text/javascript" src="/common/script/util.js"></script> -->
<script type="text/javaScript" defer="defer">
//페이지 이동
function goPage(pageNum){  
	document.zipform.currentPage.value=pageNum;
	getAddr();
}
// 페이지 처리 (주소정보 리스트 makeList(xmlData); 다음에서 호출) 
function pageMake(jsonStr){
	
	var total = jsonStr.results.common.totalCount;
	
	//var total = $(jsonStr.results.juso).find("totalCount").text(); // 총건수
	var pageNum = document.zipform.currentPage.value;// 현재페이지
	var paggingStr = "";
	var totStr = "";
	if(total < 1){
		$("#pageApi").html("검색결과가 없습니다.");
	}else{
		var PAGEBLOCK=document.zipform.countPerPage.value;;//'${currentPage }';//
		var pageSize=document.zipform.countPerPage.value;;
		var totalPages = Math.floor((total-1)/pageSize) + 1;
		var firstPage = Math.floor((pageNum-1)/PAGEBLOCK) * PAGEBLOCK + 1;		
		if( firstPage <= 0 ) firstPage = 1;		
		var lastPage = parseInt(firstPage)-1 + parseInt(PAGEBLOCK);
		if( parseInt(lastPage) > parseInt(totalPages) ) lastPage = parseInt(totalPages);		
		var nextPage = parseInt(lastPage)+1 ;
		var prePage = parseInt(firstPage)-5 ;
		
		totStr +="검색결과 : "+total + " 건";

		if( firstPage > PAGEBLOCK ){
			paggingStr +=  "<a style='cursor:pointer' onclick='javascript:goPage("+prePage+");'>◁</a>" ;
		}		
		for( i=firstPage; i<=lastPage; i++ ){
			if( pageNum == i )
				paggingStr += "<a style='font-weight:bold;color:blue;cursor:pointer;' onclick='javascript:goPage("+i+");'>" + i + "</a>";
			else
				paggingStr += "<a style='cursor:pointer' onclick='javascript:goPage("+i+");'>" + i + "</a>";
		}		
		if( lastPage < totalPages ){
			paggingStr +=  "<a style='cursor:pointer' onclick='javascript:goPage("+nextPage+");'>▷</a>";  
		}		
		$("#pageApi").html(paggingStr); 
		$("#tot").html(totStr);
	}	
}  
 
	function getAddrLoc(){ 
		$.ajax({
			 url :"/zipcode_list.do"
			,type:"post"
			,data:$("#zipform").serialize()
			,dataType:"xml"
			,success:function(xmlStr){
				$("#list").html("");
				var errCode = $(xmlStr).find("errorCode").text();
				var errDesc = $(xmlStr).find("errorMessage").text();
				if(errCode != "0"){
					var htmlStr = "";
					htmlStr += "<tr>";
					htmlStr += "<td colspan='2'>"+errDesc+"</td>";
					htmlStr += "</tr>";
					$("#list").html(htmlStr);
				}else{
					if(xmlStr != null){
						makeList(xmlStr);
						pageMake(xmlStr);
					}
				}
			}
		    ,error: function(xhr,status, error){
		    	alert("다시시도하세요.");
		    }
		});
	}

	function makeList(xmlStr){
		var htmlStr = "";
	$(xmlStr).find("juso").each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td style='width:90%'><a id='roadAddr' href='javascript:setAddr()'>"+$(this).find('roadAddr').text()+"</a></td>";
		htmlStr += "<td rowspan='2' style='width:10%'><a id='zipNo' href='javascript:setAddr()'>"+$(this).find('zipNo').text()+"</a></td></tr>";
		htmlStr += "<tr><td class='wp_90'><a id='jibunAddr' href='javascript:setAddr()'>"+$(this).find('jibunAddr').text()+"</a></td>";
		htmlStr += "</tr>";
	});
		$("#list").html(htmlStr);
	}
	//엔터키 적용
	function enterSearch() {
		var evt_code = (window.netscape) ? ev.which : event.keyCode;
		if (evt_code == 13) {    
			event.keyCode = 0;
			getAddr();
		} 
	}
	
	//특수문자, 특정문자열(sql예약어의 앞뒤공백포함) 제거
	function checkSearchedWord(obj){
		if(obj.value.length >0){
			//특수문자 제거
			var expText = /[%=><]/ ;
			if(expText.test(obj.value) == true){
				alert("특수문자를 입력 할수 없습니다.") ;
				obj.value = obj.value.split(expText).join(""); 
				return false;
			}
			
			//특정문자열(sql예약어의 앞뒤공백포함) 제거
			var sqlArray = new Array(
				"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
	             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
			);
			
			var regex ;
			var regex_plus ;
			for(var i=0; i<sqlArray.length; i++){
				regex = new RegExp("\\s" + sqlArray[i] + "\\s","gi") ;
				if (regex.test(obj.value)) {
				    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
					obj.value =obj.value.replace(regex, "");
					return false;
				}
				
				regex_plus = new RegExp( "\\+" + sqlArray[i] + "\\+","gi") ;
				if (regex_plus.test(obj.value)) {
				    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
					obj.value =obj.value.replace(regex_plus, "");
					return false;
				}
			}
		}
		return true ;
	}

	// 적용예 (api 호출 전에 검색어 체크) 
	function searchJuso(){
		if (!checkSearchedWord(document.zipform.keyword)) {
			return ;
		}
	}
	
    // 불러온 도로주소 값 셋팅
	function setAddr(){
		var road = document.getElementById("roadAddr").innerHTML;
		var zipno = document.getElementById("zipNo").innerHTML;
		var jibun = document.getElementById("jibunAddr").innerHTML;
		
		var f_name = $("#form_name").val();
		var in_addr = $("#set_addr").val();
		var in_detail = $("#set_detail").val();
		var in_zip = $("#set_zipno").val();
		
		if($("#"+f_name+" #"+in_addr).length>0){
			$("#"+f_name+" #"+in_addr).val(road);
		}else{
			$(".zipcode").each(function(){
				if($(this).attr("data-focus") == 'Y'){   
  					$(this).parent().find("input[name=\'"+in_addr+"\']").val(road) ;       
					
				}     
			}) 
		}  
		if($("#"+f_name+" #"+in_zip).length>0){  
			$("#"+f_name+" #"+in_zip).val(zipno);  
		}else{
			$(".zipcode").each(function(){
				if($(this).attr("data-focus") == 'Y'){   
  					$(this).parent().find("input[name=\'"+in_zip+"\']").val(zipno) ;       
				}     
			}) 
		} 
		
		jboxClose();    $(".zipcode").prevAll().find("#"+in_addr).focus();    
		
	} 
	
    //결과 가져오기
	function getAddr(){
		// AJAX 주소 검색 요청
		$.ajax({
			url:"https://www.juso.go.kr/addrlink/addrLinkApiJsonp.do"	// 주소검색 OPEN API URL
			,type:"post"
			,data:$("#zipform").serialize() 								// 요청 변수 설정
			,dataType:"jsonp"											// 크로스도메인으로 인한 jsonp 이용, 검색결과형식 JSON 
			,crossDomain:true
			,success:function(jsonStr){									// jsonStr : 주소 검색 결과 JSON 데이터			
				$("#list").html("");									// 결과 출력 영역 초기화
				var errCode = jsonStr.results.common.errorCode;
				var errDesc = jsonStr.results.common.errorMessage;
				if(errCode != "0"){ 
					alert(errCode+"="+errDesc);
				}else{
					if(jsonStr!= null){
						makeListJson(jsonStr);							// 결과 JSON 데이터 파싱 및 출력
						pageMake(jsonStr);								//페이징 셋팅
					}
				}
			}
			,error: function(xhr,status, error){
				alert("에러발생");	
				
				alert("status :: " + status);
				alert("error :: " + error)
				
				// AJAX 호출 에러
			}
		});
	}
	
	
	function makeListJson(jsonStr){
		var htmlStr = "";
		// jquery를 이용한 JSON 결과 데이터 파싱
		
		$(jsonStr.results.juso).each(function(){
			
			htmlStr += "<tr>";
			htmlStr += "<td style='width:90%'><a id='roadAddr' href='javascript:setAddr()'>"+this.roadAddr+"</a></td>";
			htmlStr += "<td rowspan='2' style='width:10%'><a id='zipNo' href='javascript:setAddr()'>"+this.zipNo+"</a></td></tr>";
			htmlStr += "<tr><td class='wp_90'><a id='jibunAddr' href='javascript:setAddr()'>"+this.jibunAddr+"</a></td>";
			htmlStr += "</tr>";
			
		});
		// 결과 HTML을 FORM의 결과 출력 DIV에 삽입
		$("#list").html(htmlStr);
	}	
	
	
	
	</script>
	<style>
    /*페이지에 대한 이미지를 적용하다*/    
	#pageApi{margin:0 auto; text-align:center; padding:5px;}
	#pageApi a{margin:3px; padding: 5px 10px; font-size:20px;}
	
	#pageApi ul{width:100%; height:30px; margin:0 auto;}
	#pageApi ul li{float:left; list-style:none; padding:5px; cursor:pointer;}
	
	</style>

	
<form name="zipform" id="zipform" method="post">
<input type="hidden" name="form_name" id="form_name" value="${form_name }"/>
<input type="hidden" name="set_addr" id="set_addr" value="${set_addr }"/>
<input type="hidden" name="set_detail" id="set_detail" value="${set_detail }"/> 
<input type="hidden" name="set_zipno" id="set_zipno" value="${set_zipno }"/>
<input type="hidden" name="resultType" value="json"/> 			<!-- 요청 변수 설정 (검색결과형식 설정, json) --> 

<input type="hidden" name="currentPage" id="currentPage" value="${currentPage }"/> <!-- 요청 변수 설정 (현재 페이지) -->
<input type="hidden" name="countPerPage" value="5"/><!-- 요청 변수 설정 (페이지당 출력 개수) --> 
<input type="hidden" name="confmKey" id="confmKey" value="NTE4ODc1"/><!-- 요청 변수 설정 (승인키) -->
	<div class="search">
		<div class="search_key">
			<ul>
				<li style="width:100%">
					<input type="text" name="keyword" value="" onkeydown="enterSearch();" style="width:90%;height:30px;"/><!-- 요청 변수 설정 (키워드) --><br/>
					<input type="text" value="" class="dis_non">
					검색어 예 : 도로명(반포대로 58), 건물명(독립기념관), 지번(삼성동 25)
				</li>
			</ul>
		</div>
		<div class="web search_btn center" onClick="getAddr();"><i class="fa fa-search"></i> 검색</div>
		<div class="mobile btn_i center" style="width:95%;" onClick="getAddr();"><i class="fa fa-search"></i> 검색</div>
	</div>
	<div>
		<div><b id="tot"></b></div>
		<table class="tbl tbl_left type_10">
			<thead>
			<tr>
				<th class="wp_90">
					주소
				</th>
				<th class="wp_10">
					우편번호  
				</th>
			</tr>
			</thead>
			<tbody style="width:100%" id="list"></tbody>
		</table>
	</div>
	
	<!-- <div id="list"></div> -->
	<div class="paginate" id="pageApi"></div>	
</form>

Controller.java

/*///*
 * 주소검색 controller
 * @Class Name : MemberController.java
 * @Description : MemberController Class
 * @Modification Information
 *
 */
package co.ciec.common.web;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLEncoder;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ZipcodeController {
	
	@RequestMapping(value = "/zipcode.do")
	public String member(ModelMap model, HttpServletRequest request) throws Exception {
		try{
			model.addAttribute("form_name", request.getParameter("form_name"));
			model.addAttribute("set_addr", request.getParameter("addr"));
			model.addAttribute("set_detail", request.getParameter("detail"));
			model.addAttribute("set_zipno", request.getParameter("zipno"));
			model.addAttribute("currentPage","1");
		}catch(Exception e){
			e.printStackTrace();
		}
		return "ajax/sch/sch_zipcode";
	}
	
	@RequestMapping(value = "/zipcode_list.do")
	public void addr( ModelMap model, HttpServletResponse response, HttpServletRequest req) throws Exception {
		model.addAttribute("form_name", req.getParameter("form_name"));
		model.addAttribute("set_addr", req.getParameter("set_addr"));
		model.addAttribute("set_detail", req.getParameter("set_detail"));
		model.addAttribute("set_zipno", req.getParameter("set_zipno"));
		String cp = (req.getParameter("currentPage") != null || !"".equals(req.getParameter("currentPage"))) ? req.getParameter("currentPage") : "1";
		model.addAttribute("currentPage", cp);
		
			String currentPage = req.getParameter("currentPage");
			String countPerPage = req.getParameter("countPerPage");

			String confmKey = req.getParameter("confmKey");
			String keyword = req.getParameter("keyword");
			String apiUrl = "http://www.juso.go.kr/addrlink/addrLinkApi.do?currentPage="+currentPage+
							"&countPerPage="+countPerPage+
							"&keyword="+URLEncoder.encode(keyword,"UTF-8")+"&confmKey="+confmKey;
		   	URL url = new URL(apiUrl);
		   	BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream(),"UTF-8"));
		   	StringBuffer sb = new StringBuffer();
		   	String tempStr = null;
		   	while(true){ 
		    		tempStr = br.readLine();
		    		if(tempStr == null) break;
		    		sb.append(tempStr);
		    	}
		    	br.close();
		    	response.setCharacterEncoding("UTF-8");
		    	response.setContentType("text/xml");
		    	response.getWriter().write(sb.toString());
		    }
		}