API신청(원격 정보제공 서비스)

별도의 데이터 구축없이 최신 도로명주소를 쉽고 간편하게 검색 할 수 있습니다.

검색API

API정보

검색 API정보
호출방식 요청 URL 출력결과
POST
GET
https://business.juso.go.kr/addrlink/addrLinkApiJsonp.do
(※ JAVA 1.6이상버전, TLS1.2 사용가능 이외 환경 http:// 사용)
JSONP(xml, json)
POST
GET
https://business.juso.go.kr/addrlink/addrLinkApi.do
(※ JAVA 1.6이상버전, TLS1.2 사용가능 이외 환경 http:// 사용)
xml, json

요청변수

검색 API 요청변수
요청변수명 타입 필수여부 기본값 설명
confmKey String Y - 신청시 발급받은 승인키
currentPage Integer Y 1 현재 페이지 번호
countPerPage Integer Y 10 페이지당 출력할 결과 Row 수
keyword String Y - 주소 검색어
resultType String N xml 검색결과형식 설정(xml, json)
hstryYn String N N * 2020년12월8일 추가된 항목
변동된 주소정보 포함 여부
firstSort String N none * 2020년12월8일 추가된 항목
정확도순 정렬(none), 우선정렬(road: 도로명 포함, location: 지번 포함)
※ keyword(검색어)가 우선정렬 항목에 포함된 결과 우선 표출
addInfoYn String N N * 2020년12월8일 추가된 항목
출력결과에 추가된 항목(hstryYn, relJibun, hemdNm) 제공여부
※ 해당 옵션으로 추가제공되는 항목의 경우, 추후 특정항목이 제거되거나 추가될 수 있으니 적용 시 고려해주시기 바랍니다.

출력결과

검색 API 출력결과
출력변수명 타입 필수여부 설명
common totalCount String Y 총 검색 데이터수
currentPage Integer Y 페이지 번호
countPerPage Integer Y 페이지당 출력할 결과 Row 수
errorCode String Y 에러 코드
errorMessage String Y 에러 메시지
juso roadAddr String Y 전체 도로명주소
roadAddrPart1 String Y 도로명주소(참고항목 제외)
roadAddrPart2 String N 도로명주소 참고항목
jibunAddr String Y 지번주소
engAddr String Y 도로명주소(영문)
zipNo String Y 우편번호
admCd String Y 행정구역코드
rnMgtSn String Y 도로명코드
bdMgtSn String Y 건물관리번호
detBdNmList String N 상세건물명
bdNm String N 건물명
bdKdcd String Y 공동주택여부(1 : 공동주택, 0 : 비공동주택)
siNm String Y 시도명
sggNm String Y 시군구명
emdNm String Y 읍면동명
liNm String N 법정리명
rn String Y 도로명
udrtYn String Y 지하여부(0 : 지상, 1 : 지하)
buldMnnm Number Y 건물본번
buldSlno Number Y 건물부번
mtYn String Y 산여부(0 : 대지, 1 : 산)
lnbrMnnm Number Y 지번본번(번지)
lnbrSlno Number Y 지번부번(호)
emdNo String Y 읍면동일련번호
hstryYn String Y * 2020년12월8일 추가된 항목
변동이력여부(0: 현행 주소정보, 1: 요청변수의 keyword(검색어)가 변동된 주소정보에서 검색된 정보)
relJibun String N * 2020년12월8일 추가된 항목
관련지번
hemdNm String N * 2020년12월8일 추가된 항목
관할주민센터
※ 참고정보이며, 실제와 다를 수 있습니다.

오류코드

검색 API 오류코드
오류코드 오류메세지 조치방법
0 정상
-999 시스템에러 도로명주소 도움센터로 문의하시기 바랍니다.
E0001 승인되지 않은 KEY 입니다. 정확한 승인키를 입력하세요.(팝업API 승인키 사용불가)
E0005 검색어가 입력되지 않았습니다. 검색어를 입력해주세요.
E0006 주소를 상세히 입력해 주시기 바랍니다. 시도명으로는 검색이 불가합니다.
E0008 검색어는 두글자 이상 입력되어야 합니다. 한 글자만으로는 검색이 불가합니다.
E0009 검색어는 문자와 숫자 같이 입력되어야 합니다. 숫자만으로는 검색이 불가합니다.
E0010 검색어가 너무 깁니다. (한글40자, 영문,숫자 80자 이하) 80글자를 초과한 검색어는 검색이 불가합니다.
E0011 검색어에 너무 긴 숫자가 포함되어 있습니다. (숫자10자 이하) 10자리를 초과하는 숫자가 포함된 검색어는 검색이 불가합니다.
E0012 특수문자+숫자만으로는 검색이 불가능 합니다. 특수문자와 숫자만으로 이루어진 검색어는 검색이 불가합니다.
E0013 SQL 예약어 또는 특수문자( %,=,>,<,[,] )는 검색이 불가능 합니다. SQL예약어 또는 특수문자를 제거 후 검색합니다.
E0014 개발승인키 기간이 만료되어 서비스를 이용하실 수 없습니다. 개발승인키를 다시 발급받아 API서비스를 호출합니다.
E0015 검색 범위를 초과하였습니다. 검색결과가 9천건이 초과하는 검색은 불가합니다.
가이드 및 소스 다운로드
웹 호출 (XML) 소스
						
/*
 파일명 : apiSampleXML.jsp
 내  용 : 웹 ↔ 도로명주소 검색API 방식(검색결과형식 XML)
 비  고 : 크로스도메인으로 인한 jsonp 이용
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddr(){
	// 적용예 (api 호출 전에 검색어 체크) 	
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}
	
	$.ajax({
		 url :"https://business.juso.go.kr/addrlink/addrLinkApiJsonp.do"  //인터넷망
		,type:"post"
		,data:$("#form").serialize()
		,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;
			}
			$("#list").html("");
			var errCode = $(xmlData).find("errorCode").text();
			var errDesc = $(xmlData).find("errorMessage").text();
			if(errCode != "0"){
				alert(errCode+"="+errDesc);
			}else{
				if(xmlStr != null){
					makeList(xmlData);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeList(xmlStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(xmlStr).find("juso").each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+$(this).find('roadAddr').text()+"</td>";
		htmlStr += "<td>"+$(this).find('roadAddrPart1').text()+"</td>";
		htmlStr += "<td>"+$(this).find('roadAddrPart2').text()+"</td>";
		htmlStr += "<td>"+$(this).find('jibunAddr').text()+"</td>";
		htmlStr += "<td>"+$(this).find('engAddr').text()+"</td>";
		htmlStr += "<td>"+$(this).find('zipNo').text()+"</td>";
		htmlStr += "<td>"+$(this).find('admCd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rnMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('bdMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('detBdNmList').text()+"</td>";
		/** API 서비스 제공항목 확대 (2017.02) **/
		htmlStr += "<td>"+$(this).find('bdNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('bdKdcd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('siNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('sggNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('emdNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('liNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('udrtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('mtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('lnbrMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('lnbrSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('emdNo').text()+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}

//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}

function enterSearch() {
	var evt_code = (window.netscape) ? ev.which : event.keyCode;
	if (evt_code == 13) {    
		event.keyCode = 0;  
		getAddr(); //jsonp사용시 enter검색 
	} 
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form" method="post">
	<input type="text" name="currentPage" value="1"/> <!-- 요청 변수 설정 (현재 페이지. currentPage : n > 0) -->
	<input type="text" name="countPerPage" value="10"/><!-- 요청 변수 설정 (페이지당 출력 개수. countPerPage 범위 : 0 < n <= 100) --> 
	<input type="text" name="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="keyword" value="" onkeydown="enterSearch();"/><!-- 요청 변수 설정 (키워드) -->
	<input type="button" onClick="getAddr();" value="주소검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 
						
					
웹 호출 (JSON) 소스
						
/*
 파일명 : apiSampleJSON.jsp
 내  용 : 웹 ↔ 도로명주소 검색API 방식(검색결과형식 JSON)
 비  고 : 크로스도메인으로 인한 jsonp 이용, 검색결과형식 JSON 추가(2016.10.14)
           검색결과형식을 XML로 받는 경우, 웹 호출 소스보기(XML)을 참고하시길 바랍니다. 
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddr(){
	// 적용예 (api 호출 전에 검색어 체크) 	
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}

	$.ajax({
		 url :"https://business.juso.go.kr/addrlink/addrLinkApiJsonp.do"  //인터넷망
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"jsonp"
		,crossDomain:true
		,success:function(jsonStr){
			$("#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);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeListJson(jsonStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(jsonStr.results.juso).each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+this.roadAddr+"</td>";
		htmlStr += "<td>"+this.roadAddrPart1+"</td>";
		htmlStr += "<td>"+this.roadAddrPart2+"</td>";
		htmlStr += "<td>"+this.jibunAddr+"</td>";
		htmlStr += "<td>"+this.engAddr+"</td>";
		htmlStr += "<td>"+this.zipNo+"</td>";
		htmlStr += "<td>"+this.admCd+"</td>";
		htmlStr += "<td>"+this.rnMgtSn+"</td>";
		htmlStr += "<td>"+this.bdMgtSn+"</td>";
		htmlStr += "<td>"+this.detBdNmList+"</td>";
		/** API 서비스 제공항목 확대 (2017.02) **/
		htmlStr += "<td>"+this.bdNm+"</td>";
		htmlStr += "<td>"+this.bdKdcd+"</td>";
		htmlStr += "<td>"+this.siNm+"</td>";
		htmlStr += "<td>"+this.sggNm+"</td>";
		htmlStr += "<td>"+this.emdNm+"</td>";
		htmlStr += "<td>"+this.liNm+"</td>";
		htmlStr += "<td>"+this.rn+"</td>";
		htmlStr += "<td>"+this.udrtYn+"</td>";
		htmlStr += "<td>"+this.buldMnnm+"</td>";
		htmlStr += "<td>"+this.buldSlno+"</td>";
		htmlStr += "<td>"+this.mtYn+"</td>";
		htmlStr += "<td>"+this.lnbrMnnm+"</td>";
		htmlStr += "<td>"+this.lnbrSlno+"</td>";
		htmlStr += "<td>"+this.emdNo+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}

//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}

function enterSearch() {
	var evt_code = (window.netscape) ? ev.which : event.keyCode;
	if (evt_code == 13) {    
		event.keyCode = 0;  
		getAddr(); //jsonp사용시 enter검색 
	} 
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form" method="post">
	<input type="text" name="currentPage" value="1"/> <-- 요청 변수 설정 (현재 페이지. currentPage : n > 0) -->
	<input type="text" name="countPerPage" value="10"/><!-- 요청 변수 설정 (페이지당 출력 개수. countPerPage 범위 : 0 < n <= 100) -->
	<input type="text" name="resultType" value="json"/> <-- 요청 변수 설정 (검색결과형식 설정, json) --> 
	<input type="text" name="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="keyword" value="" onkeydown="enterSearch();"/><!-- 요청 변수 설정 (키워드) -->
	<input type="button" onClick="getAddr();" value="주소검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html>
						
					
어플리케이션 호출 (XML) 소스
						
/*
 파일명 : apiSampleApplicationXML.jsp
 내  용 : 웹 ↔ Java Controller ↔ 도로명주소 검색API 방식(검색결과형식 XML)
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddrLoc(){
	// 적용예 (api 호출 전에 검색어 체크) 	
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}

	$.ajax({
		 url :"/sample/getAddrApi.do"
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"xml"
		,success:function(xmlStr){
			$("#list").html("");
			var errCode = $(xmlStr).find("errorCode").text();
			var errDesc = $(xmlStr).find("errorMessage").text();
			if(errCode != "0"){
				alert(errCode+"="+errDesc);
			}else{
				if(xmlStr != null){
					makeList(xmlStr);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeList(xmlStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(xmlStr).find("juso").each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+$(this).find('roadAddr').text()+"</td>";
		htmlStr += "<td>"+$(this).find('roadAddrPart1').text()+"</td>";
		htmlStr += "<td>"+$(this).find('roadAddrPart2').text()+"</td>";
		htmlStr += "<td>"+$(this).find('jibunAddr').text()+"</td>";
		htmlStr += "<td>"+$(this).find('engAddr').text()+"</td>";
		htmlStr += "<td>"+$(this).find('zipNo').text()+"</td>";
		htmlStr += "<td>"+$(this).find('admCd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rnMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('bdMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('detBdNmList').text()+"</td>";
		/** API 서비스 제공항목 확대 (2017.02) **/
		htmlStr += "<td>"+$(this).find('bdNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('bdKdcd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('siNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('sggNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('emdNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('liNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('udrtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('mtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('lnbrMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('lnbrSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('emdNo').text()+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}

//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}

function enterSearch() {
	var evt_code = (window.netscape) ? ev.which : event.keyCode;
	if (evt_code == 13) {    
		event.keyCode = 0;  
		getAddrLoc(); 
	} 
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form"method="post">
<input type="text" name="currentPage" value="1"/> <!-- 요청 변수 설정 (현재 페이지. currentPage : n > 0) -->
<input type="text" name="countPerPage" value="10"/><!-- 요청 변수 설정 (페이지당 출력 개수. countPerPage 범위 : 0 < n <= 100) --> 
<input type="text" name="confmKey" id="confmKey" style="width:250px;display:none" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
<input type="text" name="keyword" value="" onkeydown="enterSearch();"/><!-- 요청 변수 설정 (키워드) -->
<input type="button" onClick="getAddrLoc();" value="주소검색하기"/>
<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 	


/*
 파일명 : apiSampleXMLController.java
 내  용 : 웹 ↔ Java Controller ↔ 도로명주소 검색API 방식(검색결과형식 XML)
*/
import 	 java.io.BufferedReader;
import 	 java.io.InputStream;
import 	 java.io.InputStreamReader;
import 	 java.net.MalformedURLException;
import 	 java.net.URL;
import 	 java.net.URLConnection;
import 	 java.net.URLEncoder;
import 	 java.util.List;
import 	 javax.annotation.Resource;
import 	 javax.servlet.http.HttpServletRequest;
import 	 javax.servlet.http.HttpServletResponse;
import 	 org.springframework.stereotype.Controller;
import 	 org.springframework.ui.Model;
import 	 org.springframework.ui.ModelMap;
import 	 org.springframework.validation.BindingResult;
import 	 org.springframework.web.bind.annotation.ModelAttribute;
import 	 org.springframework.web.bind.annotation.RequestMapping;
import 	 org.springframework.web.bind.annotation.RequestParam;
import 	 org.springframework.web.bind.annotation.SessionAttributes;
import 	 org.springframework.web.bind.support.SessionStatus;
import 	 org.springmodules.validation.commons.DefaultBeanValidator;

@Controller
@SessionAttributes(types=SampleVO.class)
public class  EgovSampleController {	

   @Resource(name = "sampleService")
   private  EgovSampleService sampleService;    

   @Resource(name = "propertiesService")
   protected  EgovPropertyService propertiesService;

   @Resource(name = "beanValidator")
   protected  DefaultBeanValidator beanValidator;

   @RequestMapping(value="/sample/getAddrApi.do")
   public void  getAddrApi(@ModelAttribute("searchVO") SampleDefaultVO searchVO, 
                          HttpServletRequest req, ModelMap model, HttpServletResponse response) throws Exception {

   	String currentPage = req.getParameter("currentPage");
	String countPerPage = req.getParameter("countPerPage");
	String confmKey = req.getParameter("confmKey");
	String keyword = req.getParameter("keyword");
	String apiUrl = "https://business.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());
    }
}
						
					
어플리케이션 호출 (JSON) 소스
						
/*
 파일명 : apiSampleApplicationJSON.jsp
 내  용 : 웹 ↔ Java Controller ↔ 도로명주소 검색API 방식(검색결과형식 JSON)
 비  고 : 검색결과형식 JSON 추가(2016.10.14)
            검색결과형식을 XML로 받는 경우, 어플리케이션 호출 소스보기(XML)을 참고하시길 바랍니다.
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddrLoc(){
	// 적용예 (api 호출 전에 검색어 체크) 	
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}

	$.ajax({
		 url :"/sample/getAddrApi.do"
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"json"
		,success:function(jsonStr){
			$("#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);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeListJson(jsonStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(jsonStr.results.juso).each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+this.roadAddr+"</td>";
		htmlStr += "<td>"+this.roadAddrPart1+"</td>";
		htmlStr += "<td>"+this.roadAddrPart2+"</td>";
		htmlStr += "<td>"+this.jibunAddr+"</td>";
		htmlStr += "<td>"+this.engAddr+"</td>";
		htmlStr += "<td>"+this.zipNo+"</td>";
		htmlStr += "<td>"+this.admCd+"</td>";
		htmlStr += "<td>"+this.rnMgtSn+"</td>";
		htmlStr += "<td>"+this.bdMgtSn+"</td>";
		htmlStr += "<td>"+this.detBdNmList+"</td>";
		/** API 서비스 제공항목 확대 (2017.02) **/
		htmlStr += "<td>"+this.bdNm+"</td>";
		htmlStr += "<td>"+this.bdKdcd+"</td>";
		htmlStr += "<td>"+this.siNm+"</td>";
		htmlStr += "<td>"+this.sggNm+"</td>";
		htmlStr += "<td>"+this.emdNm+"</td>";
		htmlStr += "<td>"+this.liNm+"</td>";
		htmlStr += "<td>"+this.rn+"</td>";
		htmlStr += "<td>"+this.udrtYn+"</td>";
		htmlStr += "<td>"+this.buldMnnm+"</td>";
		htmlStr += "<td>"+this.buldSlno+"</td>";
		htmlStr += "<td>"+this.mtYn+"</td>";
		htmlStr += "<td>"+this.lnbrMnnm+"</td>";
		htmlStr += "<td>"+this.lnbrSlno+"</td>";
		htmlStr += "<td>"+this.emdNo+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
	
//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}

function enterSearch() {
	var evt_code = (window.netscape) ? ev.which : event.keyCode;
	if (evt_code == 13) {    
		event.keyCode = 0;  
		getAddrLoc(); 
	} 
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form"method="post">
<input type="text" name="currentPage" value="1"/> <-- 요청 변수 설정 (현재 페이지. currentPage : n > 0) -->
<input type="text" name="countPerPage" value="10"/><!-- 요청 변수 설정 (페이지당 출력 개수. countPerPage 범위 : 0 < n <= 100) -->
<input type="text" name="resultType" value="json"/> <-- 요청 변수 설정 (검색결과형식 설정, json) --> 
<input type="text" name="confmKey" id="confmKey" style="width:250px;display:none" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
<input type="text" name="keyword" value="" onkeydown="enterSearch();"/><!-- 요청 변수 설정 (키워드) -->
<input type="button" onClick="getAddrLoc();" value="주소검색하기"/>
<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 	


/*
 파일명 : apiSampleJSONController.java
 내  용 : 웹 ↔ Java Controller ↔ 도로명주소 검색API 방식(검색결과형식 JSON)
*/
import 	 java.io.BufferedReader;
import 	 java.io.InputStream;
import 	 java.io.InputStreamReader;
import 	 java.net.MalformedURLException;
import 	 java.net.URL;
import 	 java.net.URLConnection;
import 	 java.net.URLEncoder;
import 	 java.util.List;
import 	 javax.annotation.Resource;
import 	 javax.servlet.http.HttpServletRequest;
import 	 javax.servlet.http.HttpServletResponse;
import 	 org.springframework.stereotype.Controller;
import 	 org.springframework.ui.Model;
import 	 org.springframework.ui.ModelMap;
import 	 org.springframework.validation.BindingResult;
import 	 org.springframework.web.bind.annotation.ModelAttribute;
import 	 org.springframework.web.bind.annotation.RequestMapping;
import 	 org.springframework.web.bind.annotation.RequestParam;
import 	 org.springframework.web.bind.annotation.SessionAttributes;
import 	 org.springframework.web.bind.support.SessionStatus;
import 	 org.springmodules.validation.commons.DefaultBeanValidator;

@Controller
@SessionAttributes(types=SampleVO.class)
public class  EgovSampleController {	

   @Resource(name = "sampleService")
   private  EgovSampleService sampleService;    

   @Resource(name = "propertiesService")
   protected  EgovPropertyService propertiesService;

   @Resource(name = "beanValidator")
   protected  DefaultBeanValidator beanValidator;

   @RequestMapping(value="/sample/getAddrApi.do")
   public void  getAddrApi(@ModelAttribute("searchVO") SampleDefaultVO searchVO, 
                          HttpServletRequest req, ModelMap model, HttpServletResponse response) throws Exception {

   	String currentPage = req.getParameter("currentPage");
	String countPerPage = req.getParameter("countPerPage");
	String resultType = req.getParameter("resultType");
	String confmKey = req.getParameter("confmKey");
	String keyword = req.getParameter("keyword");
	String apiUrl = "https://business.juso.go.kr/addrlink/addrLinkApi.do?currentPage="+currentPage
									+"&countPerPage="+countPerPage+"&keyword="+URLEncoder.encode(keyword,"UTF-8")
									+"&confmKey="+confmKey+"&resultType="+resultType;
   	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("application/json");
    	response.getWriter().write(sb.toString());
    }
}
						
					
검색어필터링 적용 예시
						
<script language="javascript">
/*
모의 해킹 테스트 시 검색API를 호출하시면 IP가 차단 될 수 있습니다. 
주소검색API를 제외하시고 테스트 하시기 바랍니다.
*/
/*도로명주소 API 호출시 검색어에 특수문자 또는 OR, INSERT, UNION 등 SQL예약어가 포함될 경우
보안장비가 SQL INJECTION공격으로 간주하여 해당 IP를 차단시킬 수 있습니다.
사용자분들은 API호출시 검색어 필터링를 적용하여 주시기 바랍니다.*/

//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}

// 적용예 (api 호출 전에 검색어 체크) 
function searchJuso(){
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}
}
</script>	
						
					
페이지 처리 활용 예시
						
<script language="javascript">
//페이지 이동
function goPage(pageNum){
	document.form.currentPage.value=pageNum;
	getAddr();
}
// json타입 페이지 처리 (주소정보 리스트 makeListJson(jsonStr); 다음에서 호출)
/* 
*  json타입으로 페이지 처리시 수정 
*  function pageMake(jsonStr){ 
*  	var total = jsonStr.results.common.totalCount; // 총건수 
*/

// xml타입 페이지 처리 (주소정보 리스트 makeList(xmlData); 다음에서 호출) 
function pageMake(xmlStr){
	var total = $(xmlStr).find("totalCount").text(); // 총건수
	var pageNum = document.form.currentPage.value;// 현재페이지
	var paggingStr = "";
	if(total < 1){
	}else{
		var PAGEBLOCK=parseInt(document.form.countPerPage.value);
		var pageSize=document.form.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 = firstPage-1 + PAGEBLOCK;
		if( lastPage > totalPages ) lastPage = totalPages;		
		var nextPage = lastPage+1 ;
		var prePage = firstPage-5 ;		
		if( firstPage > PAGEBLOCK ){
			paggingStr +=  "<a href='javascript:goPage("+prePage+");'></a>  " ;
		}		
		for( i=firstPage; i<=lastPage; i++ ){
			if( pageNum == i )
				paggingStr += "<a style='font-weight:bold;color:blue;font-size:15px;' href='javascript:goPage("+i+");'>" + i + "</a>  ";
			else
				paggingStr += "<a href='javascript:goPage("+i+");'>" + i + "</a>  ";
		}		
		if( lastPage < totalPages ){
			paggingStr +=  "<a href='javascript:goPage("+nextPage+");'></a>";
		}		
		$("#pageApi").html(paggingStr);
	}	
}
</script>
// html 소스에서 검색결과 리스트 다음에 추가하여 구성하세요!(<div id="list" ></div>)	
<div class="paginate" id="pageApi"></div>
						
					
도로명주소 표기방법
						
* 도로명주소 표기방법
  - 시/도 + 시/군/구 + 읍/면 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 법정동, 공동주택명)

  1) 읍/면이고 공동주택인 경우 : 
     - 시/도 + 시/군/구 + 읍/면 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 공동주택명)
       ex) 경기도 가평군 가평읍 가화로 164, 201동 102호(휴먼시아)
       
  2) 읍/면이고 공동주택이 아닌 경우(단독주택 또는 일반 건축물) : 
     - 시/도 + 시/군/구 + 읍/면 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호)
       ex) 강원도 평창군 대화면 가평로 19-1
       
  3) 동이고 공동주택인 경우 : 
     - 시/도 + 시/군/구 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 법정동, 공동주택명)
       ex) 경기도 고양시 덕양구 화중로 164, 512동 1004호(화정동, 은빛마을5단지아파트)
       
  4) 동이고 공동주택이 아닌 경우(단독주택 또는 일반 건축물) : 
     - 시/도 + 시/군/구 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 법정동)
       ex) 서울특별시 구로구 중앙로 5, 3층(고척동)

* 검색API 출력결과를 이용한 도로명주소 구성방법
  1) 검색API 이용 시 사용자가 상세주소를 입력하는 부분은 직접 구현하셔야 합니다. (필수)
  
  2) 사용자가 입력한 상세주소가 있는 경우 : 
      도로명주소 = roadAddrPart1(도로명주소-참고항목제외) + ', ' + 사용자입력 상세주소(자체구현) + roadAddrPart2(도로명주소 참고항목)
	 
  3) 사용자가 입력한 상세주소가 없는 경우 : 
      도로명주소 = roadAddr(전체도로명주소) 또는 roadAddrPart1(도로명주소-참고항목제외) + roadAddrPart2(도로명주소 참고항목)
						
					

API정보

영문 검색 API정보
호출방식 요청 URL 출력결과
POST
GET
https://business.juso.go.kr/addrlink/addrEngApiJsonp.do
(※ JAVA 1.6이상버전, TLS1.2 사용가능 이외 환경 http:// 사용)
JSONP(xml, json)
POST
GET
https://business.juso.go.kr/addrlink/addrEngApi.do
(※ JAVA 1.6이상버전, TLS1.2 사용가능 이외 환경 http:// 사용)
xml, json

요청변수

영문 검색 API 요청변수
요청변수명 타입 필수여부 기본값 설명
confmKey String Y - 신청시 발급받은 승인키
currentPage Integer Y 1 현재 페이지 번호
countPerPage Integer Y 10 페이지당 출력할 결과 Row 수
keyword String Y - 주소 검색어
resultType String N xml 검색결과형식 설정(xml, json)

출력결과

영문 검색 API 출력결과
출력변수명 타입 필수여부 설명
common totalCount String Y 총 검색 데이터수
currentPage Integer Y 페이지 번호
countPerPage Integer Y 페이지당 출력할 결과 Row 수
errorCode String Y 에러 코드
errorMessage String Y 에러 메시지
juso roadAddr String Y 영문 도로명주소
jibunAddr String Y 영문 지번주소
zipNo String Y 우편번호
admCd String Y 행정구역코드
rnMgtSn String Y 도로명코드
bdKdcd String Y 공동주택여부(1 : 공동주택, 0 : 비공동주택)
siNm String Y 영문 시도명
sggNm String Y 영문 시군구명
emdNm String Y 영문 읍면동명
liNm String N 영문 법정리명
rn String Y 영문 도로명
udrtYn String Y 지하여부(0 : 지상, 1 : 지하)
buldMnnm Number Y 건물본번
buldSlno Number Y 건물부번
mtYn String Y 산여부(0 : 대지, 1 : 산)
lnbrMnnm Number Y 지번본번(번지)
lnbrSlno Number Y 지번부번(호)
korAddr String Y 도로명주소(한글)

오류코드

영문 검색 API 오류코드
오류코드 오류메세지 조치방법
0 정상
-999 시스템에러 도로명주소 도움센터로 문의하시기 바랍니다.
E0001 승인되지 않은 KEY 입니다. 정확한 승인키를 입력하세요.(팝업API 승인키 사용불가)
E0005 No search word has been entered. 검색어를 입력해주세요.
E0006 Please enter your address in detail. 시도명으로는 검색이 불가합니다.
E0008 Address entered too short. 한 글자만으로는 검색이 불가합니다.
E0009 It is not possible to search by address only number. 숫자만으로는 검색이 불가합니다.
E0010 Address entered too long. 80글자를 초과한 검색어는 검색이 불가합니다.
E0011 Long numbers are included. 10자리를 초과하는 숫자가 포함된 검색어는 검색이 불가합니다.
E0012 Can not search special characters + numbers. 특수문자와 숫자만으로 이루어진 검색어는 검색이 불가합니다.
E0013 Can not search SQL & special characters(%,=,>,<,[,]). SQL예약어 또는 특수문자를 제거 후 검색합니다.
E0014 The authorization key preiod has expired. 개발승인키를 다시 발급받아 API서비스를 호출합니다.
E0015 The search range has been exceeded. 검색결과가 9천건이 초과하는 검색은 불가합니다.
가이드 및 소스 다운로드
웹 호출 (XML) 소스
						
/*
 파일명 : apiSampleXML.jsp
 내  용 : 웹 ↔ 도로명주소 검색API 방식(검색결과형식 XML)
 비  고 : 크로스도메인으로 인한 jsonp 이용
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddr(){
	// 적용예 (api 호출 전에 검색어 체크) 	
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}

	$.ajax({
		 url :"https://business.juso.go.kr/addrlink/addrEngApiJsonp.do"  //인터넷망
		,type:"post"
		,data:$("#form").serialize()
		,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;
			}
			$("#list").html("");
			var errCode = $(xmlData).find("errorCode").text();
			var errDesc = $(xmlData).find("errorMessage").text();
			if(errCode != "0"){
				alert(errCode+"="+errDesc);
			}else{
				if(xmlStr != null){
					makeList(xmlData);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeList(xmlStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(xmlStr).find("juso").each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+$(this).find('roadAddr').text()+"</td>";
		htmlStr += "<td>"+$(this).find('jibunAddr').text()+"</td>";
		htmlStr += "<td>"+$(this).find('zipNo').text()+"</td>";
		htmlStr += "<td>"+$(this).find('admCd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rnMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('bdKdcd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('siNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('sggNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('emdNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('liNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('udrtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('mtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('lnbrMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('lnbrSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('korAddr').text()+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}

//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}

function enterSearch() {
	var evt_code = (window.netscape) ? ev.which : event.keyCode;
	if (evt_code == 13) {    
		event.keyCode = 0;  
		getAddr(); //jsonp사용시 enter검색 
	} 
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form" method="post">
	<input type="text" name="currentPage" value="1"/> <-- 요청 변수 설정 (현재 페이지. currentPage : n > 0) -->
	<input type="text" name="countPerPage" value="10"/><!-- 요청 변수 설정 (페이지당 출력 개수. countPerPage 범위 : 0 < n <= 100) --> 
	<input type="text" name="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="keyword" value="" onkeydown="enterSearch();"/><!-- 요청 변수 설정 (키워드) -->
	<input type="button" onClick="getAddr();" value="주소검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 
						
					
웹 호출 (JSON) 소스
						
/*
 파일명 : apiSampleJSON.jsp
 내  용 : 웹 ↔ 도로명주소 검색API 방식(검색결과형식 JSON)
 비  고 : 크로스도메인으로 인한 jsonp 이용
           검색결과형식을 XML로 받는 경우, 웹 호출 소스보기(XML)을 참고하시길 바랍니다. 
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddr(){
	// 적용예 (api 호출 전에 검색어 체크) 	
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}
	$.ajax({
		 url :"https://business.juso.go.kr/addrlink/addrEngApiJsonp.do"  //인터넷망
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"jsonp"
		,crossDomain:true
		,success:function(jsonStr){
			$("#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);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeListJson(jsonStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(jsonStr.results.juso).each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+this.roadAddr+"</td>";
		htmlStr += "<td>"+this.jibunAddr+"</td>";
		htmlStr += "<td>"+this.zipNo+"</td>";
		htmlStr += "<td>"+this.admCd+"</td>";
		htmlStr += "<td>"+this.rnMgtSn+"</td>";
		htmlStr += "<td>"+this.bdKdcd+"</td>";
		htmlStr += "<td>"+this.siNm+"</td>";
		htmlStr += "<td>"+this.sggNm+"</td>";
		htmlStr += "<td>"+this.emdNm+"</td>";
		htmlStr += "<td>"+this.liNm+"</td>";
		htmlStr += "<td>"+this.rn+"</td>";
		htmlStr += "<td>"+this.udrtYn+"</td>";
		htmlStr += "<td>"+this.buldMnnm+"</td>";
		htmlStr += "<td>"+this.buldSlno+"</td>";
		htmlStr += "<td>"+this.mtYn+"</td>";
		htmlStr += "<td>"+this.lnbrMnnm+"</td>";
		htmlStr += "<td>"+this.lnbrSlno+"</td>";
		htmlStr += "<td>"+this.korAddr+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}
function enterSearch() {
	var evt_code = (window.netscape) ? ev.which : event.keyCode;
	if (evt_code == 13) {    
		event.keyCode = 0;  
		getAddr(); //jsonp사용시 enter검색 
	} 
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form" method="post">
	<input type="text" name="currentPage" value="1"/> <!-- 요청 변수 설정 (현재 페이지. currentPage : n > 0) -->
	<input type="text" name="countPerPage" value="10"/><!-- 요청 변수 설정 (페이지당 출력 개수. countPerPage 범위 : 0 < n <= 100) -->
	<input type="text" name="resultType" value="json"/> <!-- 요청 변수 설정 (검색결과형식 설정, json) --> 
	<input type="text" name="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="keyword" value="" onkeydown="enterSearch();"/><!-- 요청 변수 설정 (키워드) -->
	<input type="button" onClick="getAddr();" value="주소검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 
						
					
어플리케이션 호출 (XML) 소스
						
/*
 파일명 : apiSampleApplicationXML.jsp
 내  용 : 웹 ↔ Java Controller ↔ 도로명주소 검색API 방식(검색결과형식 XML)
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddrLoc(){
	// 적용예 (api 호출 전에 검색어 체크) 	
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}
	
	$.ajax({
		 url :"/sample/getAddrApi.do"
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"xml"
		,success:function(xmlStr){
			$("#list").html("");
			var errCode = $(xmlStr).find("errorCode").text();
			var errDesc = $(xmlStr).find("errorMessage").text();
			if(errCode != "0"){
				alert(errCode+"="+errDesc);
			}else{
				if(xmlStr != null){
					makeList(xmlStr);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeList(xmlStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(xmlStr).find("juso").each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+$(this).find('roadAddr').text()+"</td>";
		htmlStr += "<td>"+$(this).find('jibunAddr').text()+"</td>";
		htmlStr += "<td>"+$(this).find('zipNo').text()+"</td>";
		htmlStr += "<td>"+$(this).find('admCd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rnMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('bdKdcd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('siNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('sggNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('emdNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('liNm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('udrtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('mtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('lnbrMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('lnbrSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('korAddr').text()+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}
function enterSearch() {
	var evt_code = (window.netscape) ? ev.which : event.keyCode;
	if (evt_code == 13) {    
		event.keyCode = 0;  
		getAddrLoc(); 
	} 
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form"method="post">
<input type="text" name="currentPage" value="1"/> <!-- 요청 변수 설정 (현재 페이지. currentPage : n > 0) -->
<input type="text" name="countPerPage" value="10"/><!-- 요청 변수 설정 (페이지당 출력 개수. countPerPage 범위 : 0 < n <= 100) --> 
<input type="text" name="confmKey" id="confmKey" style="width:250px;display:none" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
<input type="text" name="keyword" value="" onkeydown="enterSearch();"/><!-- 요청 변수 설정 (키워드) -->
<input type="button" onClick="getAddrLoc();" value="주소검색하기"/>
<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 	


/*
 파일명 : apiSampleXMLController.java
 내  용 : 웹 ↔ Java Controller ↔ 도로명주소 검색API 방식(검색결과형식 XML)
*/
import 	 java.io.BufferedReader;
import 	 java.io.InputStream;
import 	 java.io.InputStreamReader;
import 	 java.net.MalformedURLException;
import 	 java.net.URL;
import 	 java.net.URLConnection;
import 	 java.net.URLEncoder;
import 	 java.util.List;
import 	 javax.annotation.Resource;
import 	 javax.servlet.http.HttpServletRequest;
import 	 javax.servlet.http.HttpServletResponse;
import 	 org.springframework.stereotype.Controller;
import 	 org.springframework.ui.Model;
import 	 org.springframework.ui.ModelMap;
import 	 org.springframework.validation.BindingResult;
import 	 org.springframework.web.bind.annotation.ModelAttribute;
import 	 org.springframework.web.bind.annotation.RequestMapping;
import 	 org.springframework.web.bind.annotation.RequestParam;
import 	 org.springframework.web.bind.annotation.SessionAttributes;
import 	 org.springframework.web.bind.support.SessionStatus;
import 	 org.springmodules.validation.commons.DefaultBeanValidator;

@Controller
@SessionAttributes(types=SampleVO.class)
public class  EgovSampleController {	

   @Resource(name = "sampleService")
   private  EgovSampleService sampleService;    

   @Resource(name = "propertiesService")
   protected  EgovPropertyService propertiesService;

   @Resource(name = "beanValidator")
   protected  DefaultBeanValidator beanValidator;

   @RequestMapping(value="/sample/getAddrApi.do")
   public void  getAddrApi(@ModelAttribute("searchVO") SampleDefaultVO searchVO, 
                          HttpServletRequest req, ModelMap model, HttpServletResponse response) throws Exception {

   	String currentPage = req.getParameter("currentPage");
	String countPerPage = req.getParameter("countPerPage");
	String confmKey = req.getParameter("confmKey");
	String keyword = req.getParameter("keyword");
	String apiUrl = "https://business.juso.go.kr/addrlink/addrEngApi.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());
    }
}
						
					
어플리케이션 호출 (JSON) 소스
						
/*
 파일명 : apiSampleApplicationJSON.jsp
 내  용 : 웹 ↔ Java Controller ↔ 도로명주소 검색API 방식(검색결과형식 JSON)
 비  고 : 검색결과형식을 XML로 받는 경우, 어플리케이션 호출 소스보기(XML)을 참고하시길 바랍니다.
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddrLoc(){
	// 적용예 (api 호출 전에 검색어 체크) 	
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}

	$.ajax({
		 url :"/sample/getAddrApi.do"
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"json"
		,success:function(jsonStr){
			$("#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);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeListJson(jsonStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(jsonStr.results.juso).each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+this.roadAddr+"</td>";
		htmlStr += "<td>"+this.jibunAddr+"</td>";
		htmlStr += "<td>"+this.zipNo+"</td>";
		htmlStr += "<td>"+this.admCd+"</td>";
		htmlStr += "<td>"+this.rnMgtSn+"</td>";
		htmlStr += "<td>"+this.bdKdcd+"</td>";
		htmlStr += "<td>"+this.siNm+"</td>";
		htmlStr += "<td>"+this.sggNm+"</td>";
		htmlStr += "<td>"+this.emdNm+"</td>";
		htmlStr += "<td>"+this.liNm+"</td>";
		htmlStr += "<td>"+this.rn+"</td>";
		htmlStr += "<td>"+this.udrtYn+"</td>";
		htmlStr += "<td>"+this.buldMnnm+"</td>";
		htmlStr += "<td>"+this.buldSlno+"</td>";
		htmlStr += "<td>"+this.mtYn+"</td>";
		htmlStr += "<td>"+this.lnbrMnnm+"</td>";
		htmlStr += "<td>"+this.lnbrSlno+"</td>";
		htmlStr += "<td>"+this.korAddr+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}
function enterSearch() {
	var evt_code = (window.netscape) ? ev.which : event.keyCode;
	if (evt_code == 13) {    
		event.keyCode = 0;  
		getAddrLoc(); 
	} 
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form"method="post">
<input type="text" name="currentPage" value="1"/> <!-- 요청 변수 설정 (현재 페이지. currentPage : n > 0) -->
<input type="text" name="countPerPage" value="10"/><!-- 요청 변수 설정 (페이지당 출력 개수. countPerPage 범위 : 0 < n <= 100) -->
<input type="text" name="resultType" value="json"/> <!-- 요청 변수 설정 (검색결과형식 설정, json) --> 
<input type="text" name="confmKey" id="confmKey" style="width:250px;display:none" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
<input type="text" name="keyword" value="" onkeydown="enterSearch();"/><!-- 요청 변수 설정 (키워드) -->
<input type="button" onClick="getAddrLoc();" value="주소검색하기"/>
<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 	


/*
 파일명 : apiSampleJSONController.java
 내  용 : 웹 ↔ Java Controller ↔ 도로명주소 검색API 방식(검색결과형식 JSON)
*/
import 	 java.io.BufferedReader;
import 	 java.io.InputStream;
import 	 java.io.InputStreamReader;
import 	 java.net.MalformedURLException;
import 	 java.net.URL;
import 	 java.net.URLConnection;
import 	 java.net.URLEncoder;
import 	 java.util.List;
import 	 javax.annotation.Resource;
import 	 javax.servlet.http.HttpServletRequest;
import 	 javax.servlet.http.HttpServletResponse;
import 	 org.springframework.stereotype.Controller;
import 	 org.springframework.ui.Model;
import 	 org.springframework.ui.ModelMap;
import 	 org.springframework.validation.BindingResult;
import 	 org.springframework.web.bind.annotation.ModelAttribute;
import 	 org.springframework.web.bind.annotation.RequestMapping;
import 	 org.springframework.web.bind.annotation.RequestParam;
import 	 org.springframework.web.bind.annotation.SessionAttributes;
import 	 org.springframework.web.bind.support.SessionStatus;
import 	 org.springmodules.validation.commons.DefaultBeanValidator;

@Controller
@SessionAttributes(types=SampleVO.class)
public class  EgovSampleController {	

   @Resource(name = "sampleService")
   private  EgovSampleService sampleService;    

   @Resource(name = "propertiesService")
   protected  EgovPropertyService propertiesService;

   @Resource(name = "beanValidator")
   protected  DefaultBeanValidator beanValidator;

   @RequestMapping(value="/sample/getAddrApi.do")
   public void  getAddrApi(@ModelAttribute("searchVO") SampleDefaultVO searchVO, 
                          HttpServletRequest req, ModelMap model, HttpServletResponse response) throws Exception {

   	String currentPage = req.getParameter("currentPage");
	String countPerPage = req.getParameter("countPerPage");
	String resultType = req.getParameter("resultType");
	String confmKey = req.getParameter("confmKey");
	String keyword = req.getParameter("keyword");
	String apiUrl = "https://business.juso.go.kr/addrlink/addrEngApi.do?currentPage="+currentPage
									+"&countPerPage="+countPerPage+"&keyword="+URLEncoder.encode(keyword,"UTF-8")
									+"&confmKey="+confmKey+"&resultType="+resultType;
   	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("application/json");
    	response.getWriter().write(sb.toString());
    }
}
						
					
검색어필터링 적용 예시
						
<script language="javascript">
/*
모의 해킹 테스트 시 검색API를 호출하시면 IP가 차단 될 수 있습니다. 
주소검색API를 제외하시고 테스트 하시기 바랍니다.
*/
/*도로명주소 API 호출시 검색어에 특수문자 또는 OR, INSERT, UNION 등 SQL예약어가 포함될 경우
보안장비가 SQL INJECTION공격으로 간주하여 해당 IP를 차단시킬 수 있습니다.
사용자분들은 API호출시 검색어 필터링를 적용하여 주시기 바랍니다.*/

//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}

// 적용예 (api 호출 전에 검색어 체크) 
function searchJuso(){
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}
}
</script>	
						
					
페이지 처리 활용 예시
						
<script language="javascript">
//페이지 이동
function goPage(pageNum){
	document.form.currentPage.value=pageNum;
	getAddr();
}
// json타입 페이지 처리 (주소정보 리스트 makeListJson(jsonStr); 다음에서 호출)
/* 
*  json타입으로 페이지 처리시 수정 
*  function pageMake(jsonStr){ 
*  	var total = jsonStr.results.common.totalCount; // 총건수 
*/

// xml타입 페이지 처리 (주소정보 리스트 makeList(xmlData); 다음에서 호출) 
function pageMake(xmlStr){
	var total = $(xmlStr).find("totalCount").text(); // 총건수
	var pageNum = document.form.currentPage.value;// 현재페이지
	var paggingStr = "";
	if(total < 1){
	}else{
		var PAGEBLOCK=parseInt(document.form.countPerPage.value);
		var pageSize=document.form.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 = firstPage-1 + PAGEBLOCK;
		if( lastPage > totalPages ) lastPage = totalPages;		
		var nextPage = lastPage+1 ;
		var prePage = firstPage-5 ;		
		if( firstPage > PAGEBLOCK ){
			paggingStr +=  "<a href='javascript:goPage("+prePage+");'></a>  " ;
		}		
		for( i=firstPage; i<=lastPage; i++ ){
			if( pageNum == i )
				paggingStr += "<a style='font-weight:bold;color:blue;font-size:15px;' href='javascript:goPage("+i+");'>" + i + "</a>  ";
			else
				paggingStr += "<a href='javascript:goPage("+i+");'>" + i + "</a>  ";
		}		
		if( lastPage < totalPages ){
			paggingStr +=  "<a href='javascript:goPage("+nextPage+");'></a>";
		}		
		$("#pageApi").html(paggingStr);
	}	
}
</script>
// html 소스에서 검색결과 리스트 다음에 추가하여 구성하세요!(<div id="list" ></div>)	
<div class="paginate" id="pageApi"></div>
						
					
도로명주소 표기방법
						
* 도로명주소 표기방법
  - 시/도 + 시/군/구 + 읍/면 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 법정동, 공동주택명)

  1) 읍/면이고 공동주택인 경우 : 
     - 시/도 + 시/군/구 + 읍/면 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 공동주택명)
       ex) 경기도 가평군 가평읍 가화로 164, 201동 102호(휴먼시아)
       
  2) 읍/면이고 공동주택이 아닌 경우(단독주택 또는 일반 건축물) : 
     - 시/도 + 시/군/구 + 읍/면 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호)
       ex) 강원도 평창군 대화면 가평로 19-1
       
  3) 동이고 공동주택인 경우 : 
     - 시/도 + 시/군/구 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 법정동, 공동주택명)
       ex) 경기도 고양시 덕양구 화중로 164, 512동 1004호(화정동, 은빛마을5단지아파트)
       
  4) 동이고 공동주택이 아닌 경우(단독주택 또는 일반 건축물) : 
     - 시/도 + 시/군/구 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 법정동)
       ex) 서울특별시 구로구 중앙로 5, 3층(고척동)

* 검색API 출력결과를 이용한 도로명주소 구성방법
  1) 검색API 이용 시 사용자가 상세주소를 입력하는 부분은 직접 구현하셔야 합니다. (필수)
  
  2) 사용자가 입력한 상세주소가 있는 경우 : 
      도로명주소 = roadAddrPart1(도로명주소-참고항목제외) + ', ' + 사용자입력 상세주소(자체구현) + roadAddrPart2(도로명주소 참고항목)
	 
  3) 사용자가 입력한 상세주소가 없는 경우 : 
      도로명주소 = roadAddr(전체도로명주소) 또는 roadAddrPart1(도로명주소-참고항목제외) + roadAddrPart2(도로명주소 참고항목)
						
					

API정보

좌표 검색 API정보
호출방식 요청 URL 출력결과
POST
GET
https://business.juso.go.kr/addrlink/addrCoordApiJsonp.do
(※ JAVA 1.6이상버전, TLS1.2 사용가능 이외 환경 http:// 사용)
JSONP(xml, json)
POST
GET
https://business.juso.go.kr/addrlink/addrCoordApi.do
(※ JAVA 1.6이상버전, TLS1.2 사용가능 이외 환경 http:// 사용)
xml, json

요청변수

좌표 검색 API 요청변수
요청변수명 타입 필수여부 기본값 설명
confmKey String Y - 신청시 발급받은 승인키
admCd String Y - 행정구역코드
rnMgtSn String Y - 도로명코드
udrtYn String Y - 지하여부(0:지상, 1:지하)
buldMnnm Number Y - 건물본번
buldSlno Number Y - 건물부번
resultType String N xml 검색결과형식 설정(xml, json)

출력결과

좌표 검색 API 출력결과
출력변수명 타입 필수여부 설명
common totalCount String Y 총 검색 데이터수
errorCode String Y 에러 코드
errorMessage String Y 에러 메시지
juso admCd String Y 행정구역코드
rnMgtSn String Y 도로명코드
bdMgtSn String Y 건물관리번호
udrtYn String Y 지하여부(0 : 지상, 1 : 지하)
buldMnnm Number Y 건물본번
buldSlno Number Y 건물부번
entX String Y X좌표
entY String Y Y좌표
bdNm String N 건물명

오류코드

좌표 검색 API 오류코드
오류코드 오류메세지 조치방법
0 정상
-999 시스템에러 도로명주소 도움센터로 문의하시기 바랍니다.
E0001 승인되지 않은 KEY 입니다. 정확한 승인키를 입력하세요.(팝업API 승인키 사용불가)
E0002 행정구역코드(admCd)의 요청항목이 없습니다. 요청변수 중 행정구역코드(admCd)를 다시 확인하세요.
E0003 도로명코드(rnMgtSn)의 요청항목이 없습니다. 요청변수 중 도로명코드(rnMgtSn)를 다시 확인하세요.
E0004 지하여부(udrtYn)의 요청항목이 없습니다. 요청변수 중 지하여부(udrtYn)를 다시 확인하세요.
E0005 건물본번(buldMnnm)의 요청항목이 없습니다. 요청변수 중 건물본번(buldMnnm)을 다시 확인하세요.
E0006 건물부번(buldSlno)의 요청항목이 없습니다. 요청변수 중 건물부번(buldSlno)을 다시 확인하세요.
E0007 짦은 시간동안 다량의 주소검색 요청이 있습니다.
잠시 후 이용하시길 바랍니다.
비정상적인 연속된 호출을 삼가하세요.
가이드 및 소스 다운로드
웹 호출 (XML) 소스
						
/*
 파일명 : apiSampleXML.jsp
 내  용 : 웹 ↔ 좌표API방식(검색결과형식 XML)
 비  고 : 크로스도메인으로 인한 jsonp 이용
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddr(){
	$.ajax({
		 url :"https://business.juso.go.kr/addrlink/addrCoordApiJsonp.do"  //인터넷망
		,type:"post"
		,data:$("#form").serialize()
		,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;
			}
			$("#list").html("");
			var errCode = $(xmlData).find("errorCode").text();
			var errDesc = $(xmlData).find("errorMessage").text();
			if(errCode != "0"){
				alert(errCode+"="+errDesc);
			}else{
				if(xmlStr != null){
					makeList(xmlData);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeList(xmlStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(xmlStr).find("juso").each(function(){
		htmlStr += "<tr>";
		htmlStr += " <td>"+$(this).find('admCd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rnMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('bdMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('udrtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('entX').text()+"</td>";
		htmlStr += "<td>"+$(this).find('entY').text()+"</td>";
		htmlStr += "<td>"+$(this).find('bdNm').text()+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form" method="post">
	<input type="text" name="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="admCd" value=""/> <!-- 요청 변수 설정 (행정구역코드) -->
	<input type="text" name="rnMgtSn" value=""/><!-- 요청 변수 설정 (도로명코드) --> 
	<input type="text" name="udrtYn" value=""/> <!-- 요청 변수 설정 (지하여부) -->
	<input type="text" name="buldMnnm" value=""/><!-- 요청 변수 설정 (건물본번) --> 
	<input type="text" name="buldSlno" value=""/><!-- 요청 변수 설정 (건물부번) --> 
	<input type="button" onClick="getAddr();" value="좌표검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 
						
					
웹 호출 (JSON) 소스
						
/*
 파일명 : apiSampleJSON.jsp
 내  용 : 웹 ↔ 좌표API방식(검색결과형식 JSON)
 비  고 : 크로스도메인으로 인한 jsonp 이용
           검색결과형식을 XML로 받는 경우, 웹 호출 소스보기(XML)을 참고하시길 바랍니다. 
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddr(){
	$.ajax({
		 url :"https://business.juso.go.kr/addrlink/addrCoordApiJsonp.do"  //인터넷망
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"jsonp"
		,crossDomain:true
		,success:function(jsonStr){
			$("#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);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeListJson(jsonStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(jsonStr.results.juso).each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+this.admCd+"</td>";
		htmlStr += "<td>"+this.rnMgtSn+"</td>";
		htmlStr += "<td>"+this.bdMgtSn+"</td>";
		htmlStr += "<td>"+this.udrtYn+"</td>";
		htmlStr += "<td>"+this.buldMnnm+"</td>";
		htmlStr += "<td>"+this.buldSlno+"</td>";
		htmlStr += "<td>"+this.entX+"</td>";
		htmlStr += "<td>"+this.entY+"</td>";
		htmlStr += "<td>"+this.bdNm+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form" method="post">
	<input type="text" name="resultType" value="json"/> <!-- 요청 변수 설정 (검색결과형식 설정, json) --> 
	<input type="text" name="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="admCd" value=""/> <!-- 요청 변수 설정 (행정구역코드) -->
	<input type="text" name="rnMgtSn" value=""/><!-- 요청 변수 설정 (도로명코드) --> 
	<input type="text" name="udrtYn" value=""/> <!-- 요청 변수 설정 (지하여부) -->
	<input type="text" name="buldMnnm" value=""/><!-- 요청 변수 설정 (건물본번) --> 
	<input type="text" name="buldSlno" value=""/><!-- 요청 변수 설정 (건물부번) -->
	<input type="button" onClick="getAddr();" value="좌표검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 
						
					
어플리케이션 호출 (XML) 소스
						
/*
 파일명 : apiSampleApplicationXML.jsp
 내  용 : 웹 ↔ Java Controller ↔ 좌표API방식(검색결과형식 XML)
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddrLoc(){
	$.ajax({
		 url :"/sample/getAddrApi.do"
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"xml"
		,success:function(xmlStr){
			$("#list").html("");
			var errCode = $(xmlStr).find("errorCode").text();
			var errDesc = $(xmlStr).find("errorMessage").text();
			if(errCode != "0"){
				alert(errCode+"="+errDesc);
			}else{
				if(xmlStr != null){
					makeList(xmlStr);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeList(xmlStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(xmlStr).find("juso").each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+$(this).find('admCd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rnMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('bdMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('udrtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('entX').text()+"</td>";
		htmlStr += "<td>"+$(this).find('entY').text()+"</td>";
		htmlStr += "<td>"+$(this).find('bdNm').text()+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form"method="post">
	<input type="text" name="confmKey" id="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="admCd" value=""/> <!-- 요청 변수 설정 (행정구역코드) -->
	<input type="text" name="rnMgtSn" value=""/><!-- 요청 변수 설정 (도로명코드) --> 
	<input type="text" name="udrtYn" value=""/> <!-- 요청 변수 설정 (지하여부) -->
	<input type="text" name="buldMnnm" value=""/><!-- 요청 변수 설정 (건물본번) --> 
	<input type="text" name="buldSlno" value=""/><!-- 요청 변수 설정 (건물부번) -->
	<input type="button" onClick="getAddrLoc();" value="좌표검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 	

/*
 파일명 : apiSampleXMLController.java
 내  용 : 웹 ↔ Java Controller ↔ 좌표API방식(검색결과형식 XML)
*/
import 	 java.io.BufferedReader;
import 	 java.io.InputStream;
import 	 java.io.InputStreamReader;
import 	 java.net.MalformedURLException;
import 	 java.net.URL;
import 	 java.net.URLConnection;
import 	 java.net.URLEncoder;
import 	 java.util.List;
import 	 javax.annotation.Resource;
import 	 javax.servlet.http.HttpServletRequest;
import 	 javax.servlet.http.HttpServletResponse;
import 	 org.springframework.stereotype.Controller;
import 	 org.springframework.ui.Model;
import 	 org.springframework.ui.ModelMap;
import 	 org.springframework.validation.BindingResult;
import 	 org.springframework.web.bind.annotation.ModelAttribute;
import 	 org.springframework.web.bind.annotation.RequestMapping;
import 	 org.springframework.web.bind.annotation.RequestParam;
import 	 org.springframework.web.bind.annotation.SessionAttributes;
import 	 org.springframework.web.bind.support.SessionStatus;
import 	 org.springmodules.validation.commons.DefaultBeanValidator;

@Controller
@SessionAttributes(types=SampleVO.class)
public class  EgovSampleController {	

   @Resource(name = "sampleService")
   private  EgovSampleService sampleService;    

   @Resource(name = "propertiesService")
   protected  EgovPropertyService propertiesService;

   @Resource(name = "beanValidator")
   protected  DefaultBeanValidator beanValidator;

   @RequestMapping(value="/sample/getAddrApi.do")
   public void  getAddrApi(@ModelAttribute("searchVO") SampleDefaultVO searchVO, 
                          HttpServletRequest req, ModelMap model, HttpServletResponse response) throws Exception {

   	String admCd = req.getParameter("admCd");
	String rnMgtSn = req.getParameter("rnMgtSn");
	String udrtYn = req.getParameter("udrtYn");
   	String buldMnnm = req.getParameter("buldMnnm");
	String buldSlno = req.getParameter("buldSlno");
	String confmKey = req.getParameter("confmKey");
	String apiUrl = "https://business.juso.go.kr/addrlink/addrCoordApi.do?admCd="+admCd
									+"&rnMgtSn="+rnMgtSn+"&udrtYn="+udrtYn+"&buldMnnm="+buldMnnm
									+"&buldSlno="+buldSlno+"&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());
    }
}
						
					
어플리케이션 호출 (JSON) 소스
						
/*
 파일명 : apiSampleApplicationJSON.jsp
 내  용 : 웹 ↔ Java Controller ↔ 좌표API방식(검색결과형식 JSON)
 비  고 : 검색결과형식을 XML로 받는 경우, 어플리케이션 호출 소스보기(XML)을 참고하시길 바랍니다.
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getAddrLoc(){
	$.ajax({
		 url :"/sample/getAddrApi.do"
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"json"
		,success:function(jsonStr){
			$("#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);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeListJson(jsonStr){
	var htmlStr = "";
	htmlStr += "<table>";
	$(jsonStr.results.juso).each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+this.admCd+"</td>";
		htmlStr += "<td>"+this.rnMgtSn+"</td>";
		htmlStr += "<td>"+this.bdMgtSn+"</td>";
		htmlStr += "<td>"+this.udrtYn+"</td>";
		htmlStr += "<td>"+this.buldMnnm+"</td>";
		htmlStr += "<td>"+this.buldSlno+"</td>";
		htmlStr += "<td>"+this.entX+"</td>";
		htmlStr += "<td>"+this.entY+"</td>";
		htmlStr += "<td>"+this.bdNm+"</td>";
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form"method="post">
	<input type="text" name="resultType" value="json"/> <!-- 요청 변수 설정 (검색결과형식 설정, json) -->
	<input type="text" name="confmKey" id="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="admCd" value=""/> <!-- 요청 변수 설정 (행정구역코드) -->
	<input type="text" name="rnMgtSn" value=""/><!-- 요청 변수 설정 (도로명코드) --> 
	<input type="text" name="udrtYn" value=""/> <!-- 요청 변수 설정 (지하여부) -->
	<input type="text" name="buldMnnm" value=""/><!-- 요청 변수 설정 (건물본번) --> 
	<input type="text" name="buldSlno" value=""/><!-- 요청 변수 설정 (건물부번) -->
	<input type="button" onClick="getAddrLoc();" value="좌표검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 	

/*
 파일명 : apiSampleJSONController.java
 내  용 : 웹 ↔ Java Controller ↔ 좌표API방식(검색결과형식 JSON)
*/
import 	 java.io.BufferedReader;
import 	 java.io.InputStream;
import 	 java.io.InputStreamReader;
import 	 java.net.MalformedURLException;
import 	 java.net.URL;
import 	 java.net.URLConnection;
import 	 java.net.URLEncoder;
import 	 java.util.List;
import 	 javax.annotation.Resource;
import 	 javax.servlet.http.HttpServletRequest;
import 	 javax.servlet.http.HttpServletResponse;
import 	 org.springframework.stereotype.Controller;
import 	 org.springframework.ui.Model;
import 	 org.springframework.ui.ModelMap;
import 	 org.springframework.validation.BindingResult;
import 	 org.springframework.web.bind.annotation.ModelAttribute;
import 	 org.springframework.web.bind.annotation.RequestMapping;
import 	 org.springframework.web.bind.annotation.RequestParam;
import 	 org.springframework.web.bind.annotation.SessionAttributes;
import 	 org.springframework.web.bind.support.SessionStatus;
import 	 org.springmodules.validation.commons.DefaultBeanValidator;

@Controller
@SessionAttributes(types=SampleVO.class)
public class  EgovSampleController {	

   @Resource(name = "sampleService")
   private  EgovSampleService sampleService;    

   @Resource(name = "propertiesService")
   protected  EgovPropertyService propertiesService;

   @Resource(name = "beanValidator")
   protected  DefaultBeanValidator beanValidator;

   @RequestMapping(value="/sample/getAddrApi.do")
   public void  getAddrApi(@ModelAttribute("searchVO") SampleDefaultVO searchVO, 
                          HttpServletRequest req, ModelMap model, HttpServletResponse response) throws Exception {

	String admCd = req.getParameter("admCd");
	String rnMgtSn = req.getParameter("rnMgtSn");
	String udrtYn = req.getParameter("udrtYn");
   	String buldMnnm = req.getParameter("buldMnnm");
	String buldSlno = req.getParameter("buldSlno");
	String confmKey = req.getParameter("confmKey");
	String resultType = req.getParameter("resultType");
	String apiUrl = "https://business.juso.go.kr/addrlink/addrCoordApi.do?admCd="+admCd
									+"&rnMgtSn="+rnMgtSn+"&udrtYn="+udrtYn+"&buldMnnm="+buldMnnm
									+"&buldSlno="+buldSlno+"&confmKey="+confmKey+"&resultType="+resultType;
   	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("application/json");
    	response.getWriter().write(sb.toString());
    }
}
						
					
검색어필터링 적용 예시
						
<script language="javascript">
/*
모의 해킹 테스트 시 검색API를 호출하시면 IP가 차단 될 수 있습니다. 
주소검색API를 제외하시고 테스트 하시기 바랍니다.
*/
/*도로명주소 API 호출시 검색어에 특수문자 또는 OR, INSERT, UNION 등 SQL예약어가 포함될 경우
보안장비가 SQL INJECTION공격으로 간주하여 해당 IP를 차단시킬 수 있습니다.
사용자분들은 API호출시 검색어 필터링를 적용하여 주시기 바랍니다.*/

//특수문자, 특정문자열(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(
			//sql 예약어
			"OR", "SELECT", "INSERT", "DELETE", "UPDATE", "CREATE", "DROP", "EXEC",
             		 "UNION",  "FETCH", "DECLARE", "TRUNCATE" 
		);
		
		var regex;
		for(var i=0; i<sqlArray.length; i++){
			regex = new RegExp( sqlArray[i] ,"gi") ;
			
			if (regex.test(obj.value) ) {
			    alert("\"" + sqlArray[i]+"\"와(과) 같은 특정문자로 검색할 수 없습니다.");
				obj.value =obj.value.replace(regex, "");
				return false;
			}
		}
	}
	return true ;
}

// 적용예 (api 호출 전에 검색어 체크) 
function searchJuso(){
	if (!checkSearchedWord(document.form.keyword)) {
		return ;
	}
}
</script>	
						
					
페이지 처리 활용 예시
						
<script language="javascript">
//페이지 이동
function goPage(pageNum){
	document.form.currentPage.value=pageNum;
	getAddr();
}
// json타입 페이지 처리 (주소정보 리스트 makeListJson(jsonStr); 다음에서 호출)
/* 
*  json타입으로 페이지 처리시 수정 
*  function pageMake(jsonStr){ 
*  	var total = jsonStr.results.common.totalCount; // 총건수 
*/

// xml타입 페이지 처리 (주소정보 리스트 makeList(xmlData); 다음에서 호출) 
function pageMake(xmlStr){
	var total = $(xmlStr).find("totalCount").text(); // 총건수
	var pageNum = document.form.currentPage.value;// 현재페이지
	var paggingStr = "";
	if(total < 1){
	}else{
		var PAGEBLOCK=parseInt(document.form.countPerPage.value);
		var pageSize=document.form.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 = firstPage-1 + PAGEBLOCK;
		if( lastPage > totalPages ) lastPage = totalPages;		
		var nextPage = lastPage+1 ;
		var prePage = firstPage-5 ;		
		if( firstPage > PAGEBLOCK ){
			paggingStr +=  "<a href='javascript:goPage("+prePage+");'></a>  " ;
		}		
		for( i=firstPage; i<=lastPage; i++ ){
			if( pageNum == i )
				paggingStr += "<a style='font-weight:bold;color:blue;font-size:15px;' href='javascript:goPage("+i+");'>" + i + "</a>  ";
			else
				paggingStr += "<a href='javascript:goPage("+i+");'>" + i + "</a>  ";
		}		
		if( lastPage < totalPages ){
			paggingStr +=  "<a href='javascript:goPage("+nextPage+");'></a>";
		}		
		$("#pageApi").html(paggingStr);
	}	
}
</script>
// html 소스에서 검색결과 리스트 다음에 추가하여 구성하세요!(<div id="list" ></div>)	
<div class="paginate" id="pageApi"></div>
						
					
도로명주소 표기방법
						
* 도로명주소 표기방법
  - 시/도 + 시/군/구 + 읍/면 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 법정동, 공동주택명)

  1) 읍/면이고 공동주택인 경우 : 
     - 시/도 + 시/군/구 + 읍/면 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 공동주택명)
       ex) 경기도 가평군 가평읍 가화로 164, 201동 102호(휴먼시아)
       
  2) 읍/면이고 공동주택이 아닌 경우(단독주택 또는 일반 건축물) : 
     - 시/도 + 시/군/구 + 읍/면 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호)
       ex) 강원도 평창군 대화면 가평로 19-1
       
  3) 동이고 공동주택인 경우 : 
     - 시/도 + 시/군/구 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 법정동, 공동주택명)
       ex) 경기도 고양시 덕양구 화중로 164, 512동 1004호(화정동, 은빛마을5단지아파트)
       
  4) 동이고 공동주택이 아닌 경우(단독주택 또는 일반 건축물) : 
     - 시/도 + 시/군/구 + 도로명 + 건물번호(본번-부번) + 상세주소(동/층/호) + (참고항목: 법정동)
       ex) 서울특별시 구로구 중앙로 5, 3층(고척동)

* 검색API 출력결과를 이용한 도로명주소 구성방법
  1) 검색API 이용 시 사용자가 상세주소를 입력하는 부분은 직접 구현하셔야 합니다. (필수)
  
  2) 사용자가 입력한 상세주소가 있는 경우 : 
      도로명주소 = roadAddrPart1(도로명주소-참고항목제외) + ', ' + 사용자입력 상세주소(자체구현) + roadAddrPart2(도로명주소 참고항목)
	 
  3) 사용자가 입력한 상세주소가 없는 경우 : 
      도로명주소 = roadAddr(전체도로명주소) 또는 roadAddrPart1(도로명주소-참고항목제외) + roadAddrPart2(도로명주소 참고항목)
						
					

API정보

상세주소 검색 API정보
호출방식 요청 URL 출력결과
POST
GET
https://business.juso.go.kr/addrlink/addrDetailApiJsonp.do
(※ JAVA 1.6이상버전, TLS1.2 사용가능 이외 환경 http:// 사용)
JSONP(xml, json)
POST
GET
https://business.juso.go.kr/addrlink/addrDetailApi.do
(※ JAVA 1.6이상버전, TLS1.2 사용가능 이외 환경 http:// 사용)
xml, json

요청변수

상세주소 검색 API 요청변수
요청변수명 타입 필수여부 기본값 설명
confmKey String Y - 신청시 발급받은 승인키
admCd String Y - 행정구역코드
rnMgtSn String Y - 도로명코드
udrtYn String Y - 지하여부(0:지상, 1:지하)
buldMnnm Number Y - 건물본번
buldSlno Number Y - 건물부번
searchType String N dong 동층호 검색유형(dong, floorho)
dongNm String N - 동 (층호 검색 시 입력)
resultType String N xml 검색결과형식 설정(xml, json)

출력결과

상세주소 검색 API 출력결과
출력변수명 타입 필수여부 설명
common totalCount String Y 총 검색 데이터수
errorCode String Y 에러 코드
errorMessage String Y 에러 메시지
juso admCd String Y 행정구역코드
rnMgtSn String Y 도로명코드
udrtYn String Y 지하여부(0 : 지상, 1 : 지하)
buldMnnm Number Y 건물본번
buldSlno Number Y 건물부번
dongNm String N 동 정보
floorNm String N 층 정보
hoNm String N 호 정보

오류코드

상세주소 검색 API 오류코드
오류코드 오류메세지 조치방법
0 정상
-999 시스템에러 도로명주소 도움센터로 문의하시기 바랍니다.
E0001 승인되지 않은 KEY 입니다. 정확한 승인키를 입력하세요.(팝업API 승인키 사용불가)
E0002 행정구역코드(admCd)의 요청항목이 없습니다. 요청변수 중 행정구역코드(admCd)를 다시 확인하세요.
E0003 도로명코드(rnMgtSn)의 요청항목이 없습니다. 요청변수 중 도로명코드(rnMgtSn)를 다시 확인하세요.
E0004 지하여부(udrtYn)의 요청항목이 없습니다. 요청변수 중 지하여부(udrtYn)를 다시 확인하세요.
E0005 건물본번(buldMnnm)의 요청항목이 없습니다. 요청변수 중 건물본번(buldMnnm)을 다시 확인하세요.
E0006 건물부번(buldSlno)의 요청항목이 없습니다. 요청변수 중 건물부번(buldSlno)을 다시 확인하세요.
가이드 및 소스 다운로드
웹 호출 (XML) 소스
						
/*
 파일명 : apiSampleXML.jsp
 내  용 : 웹 ↔ 상세주소API방식(검색결과형식 XML)
 비  고 : 크로스도메인으로 인한 jsonp 이용
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getDetailAddr(){
	$.ajax({
		 url :"https://business.juso.go.kr/addrlink/addrDetailApiJsonp.do"  //인터넷망
		,type:"post"
		,data:$("#form").serialize()
		,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;
			}
			$("#list").html("");
			var errCode = $(xmlData).find("errorCode").text();
			var errDesc = $(xmlData).find("errorMessage").text();
			if(errCode != "0"){
				alert(errCode+"="+errDesc);
			}else{
				if(xmlStr != null){
					makeList(xmlData);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeList(xmlStr){
	var searchType = $("input[name='searchType']").val();
	var htmlStr = "";
	htmlStr += "<table>";
	$(xmlStr).find("juso").each(function(){
		htmlStr += "<tr>";
		htmlStr += " <td>"+$(this).find('admCd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rnMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('udrtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('dongNm').text()+"</td>";
		if(searchType == "floorho"){
			htmlStr += "<td>"+$(this).find('floorNm').text()+"</td>";
			htmlStr += "<td>"+$(this).find('hoNm').text()+"</td>";
		}
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form" method="post">
	<input type="text" name="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="admCd" value=""/> <!-- 요청 변수 설정 (행정구역코드) -->
	<input type="text" name="rnMgtSn" value=""/><!-- 요청 변수 설정 (도로명코드) --> 
	<input type="text" name="udrtYn" value=""/> <!-- 요청 변수 설정 (지하여부) -->
	<input type="text" name="buldMnnm" value=""/><!-- 요청 변수 설정 (건물본번) --> 
	<input type="text" name="buldSlno" value=""/><!-- 요청 변수 설정 (건물부번) --> 
	<input type="text" name="searchType" value=""/><!-- 요청 변수 설정 (동층호 검색유형:dong, floorho) --> 
	<input type="text" name="dongNm" value=""/><!-- 요청 변수 설정 (동) --> 
	<input type="button" onClick="getDetailAddr();" value="상세주소 검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 
						
					
웹 호출 (JSON) 소스
						
/*
 파일명 : apiSampleJSON.jsp
 내  용 : 웹 ↔ 상세주소API방식(검색결과형식 JSON)
 비  고 : 크로스도메인으로 인한 jsonp 이용
           검색결과형식을 XML로 받는 경우, 웹 호출 소스보기(XML)을 참고하시길 바랍니다. 
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getDetailAddr(){
	$.ajax({
		 url :"https://business.juso.go.kr/addrlink/addrDetailApiJsonp.do"  //인터넷망
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"jsonp"
		,crossDomain:true
		,success:function(jsonStr){
			$("#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);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeListJson(jsonStr){
	var searchType = $("input[name='searchType']").val();
	var htmlStr = "";
	htmlStr += "<table>";
	$(jsonStr.results.juso).each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+this.admCd+"</td>";
		htmlStr += "<td>"+this.rnMgtSn+"</td>";
		htmlStr += "<td>"+this.udrtYn+"</td>";
		htmlStr += "<td>"+this.buldMnnm+"</td>";
		htmlStr += "<td>"+this.buldSlno+"</td>";
		htmlStr += "<td>"+this.dongNm+"</td>";
		if(searchType == "floorho"){
			htmlStr += "<td>"+this.floorNm+"</td>";
			htmlStr += "<td>"+this.hoNm+"</td>";
		}
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form" method="post">
	<input type="text" name="resultType" value="json"/> <!-- 요청 변수 설정 (검색결과형식 설정, json) --> 
	<input type="text" name="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="admCd" value=""/> <!-- 요청 변수 설정 (행정구역코드) -->
	<input type="text" name="rnMgtSn" value=""/><!-- 요청 변수 설정 (도로명코드) --> 
	<input type="text" name="udrtYn" value=""/> <!-- 요청 변수 설정 (지하여부) -->
	<input type="text" name="buldMnnm" value=""/><!-- 요청 변수 설정 (건물본번) --> 
	<input type="text" name="buldSlno" value=""/><!-- 요청 변수 설정 (건물부번) -->
	<input type="text" name="searchType" value=""/><!-- 요청 변수 설정 (동층호 검색유형:dong, floorho) -->
	<input type="text" name="dongNm" value=""/><!-- 요청 변수 설정 (동) -->
	<input type="button" onClick="getDetailAddr();" value="상세주소 검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 
						
					
어플리케이션 호출 (XML) 소스
						
/*
 파일명 : apiSampleApplicationXML.jsp
 내  용 : 웹 ↔ Java Controller ↔ 상세주소API방식(검색결과형식 XML)
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getDetailAddr(){
	$.ajax({
		 url :"/sample/getDetailAddrApi.do"
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"xml"
		,success:function(xmlStr){
			$("#list").html("");
			var errCode = $(xmlStr).find("errorCode").text();
			var errDesc = $(xmlStr).find("errorMessage").text();
			if(errCode != "0"){
				alert(errCode+"="+errDesc);
			}else{
				if(xmlStr != null){
					makeList(xmlStr);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeList(xmlStr){
	var searchType = $("input[name='searchType']").val();
	var htmlStr = "";
	htmlStr += "<table>";
	$(xmlStr).find("juso").each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+$(this).find('admCd').text()+"</td>";
		htmlStr += "<td>"+$(this).find('rnMgtSn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('udrtYn').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldMnnm').text()+"</td>";
		htmlStr += "<td>"+$(this).find('buldSlno').text()+"</td>";
		htmlStr += "<td>"+$(this).find('dongNm').text()+"</td>";
		if(searchType == "floorho"){
			htmlStr += "<td>"+$(this).find('floorNm').text()+"</td>";
			htmlStr += "<td>"+$(this).find('hoNm').text()+"</td>";
		}
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form"method="post">
	<input type="text" name="confmKey" id="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="admCd" value=""/> <!-- 요청 변수 설정 (행정구역코드) -->
	<input type="text" name="rnMgtSn" value=""/><!-- 요청 변수 설정 (도로명코드) --> 
	<input type="text" name="udrtYn" value=""/> <!-- 요청 변수 설정 (지하여부) -->
	<input type="text" name="buldMnnm" value=""/><!-- 요청 변수 설정 (건물본번) --> 
	<input type="text" name="buldSlno" value=""/><!-- 요청 변수 설정 (건물부번) -->
	<input type="text" name="searchType" value=""/><!-- 요청 변수 설정 (동층호 검색유형:dong, floorho) -->
	<input type="text" name="dongNm" value=""/><!-- 요청 변수 설정 (동) -->
	<input type="button" onClick="getDetailAddr();" value="상세주소 검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 	

/*
 파일명 : apiSampleXMLController.java
 내  용 : 웹 ↔ Java Controller ↔ 상세주소API방식(검색결과형식 XML)
*/
import 	 java.io.BufferedReader;
import 	 java.io.InputStream;
import 	 java.io.InputStreamReader;
import 	 java.net.MalformedURLException;
import 	 java.net.URL;
import 	 java.net.URLConnection;
import 	 java.net.URLEncoder;
import 	 java.util.List;
import 	 javax.annotation.Resource;
import 	 javax.servlet.http.HttpServletRequest;
import 	 javax.servlet.http.HttpServletResponse;
import 	 org.springframework.stereotype.Controller;
import 	 org.springframework.ui.Model;
import 	 org.springframework.ui.ModelMap;
import 	 org.springframework.validation.BindingResult;
import 	 org.springframework.web.bind.annotation.ModelAttribute;
import 	 org.springframework.web.bind.annotation.RequestMapping;
import 	 org.springframework.web.bind.annotation.RequestParam;
import 	 org.springframework.web.bind.annotation.SessionAttributes;
import 	 org.springframework.web.bind.support.SessionStatus;
import 	 org.springmodules.validation.commons.DefaultBeanValidator;

@Controller
@SessionAttributes(types=SampleVO.class)
public class  EgovSampleController {	

   @Resource(name = "sampleService")
   private  EgovSampleService sampleService;    

   @Resource(name = "propertiesService")
   protected  EgovPropertyService propertiesService;

   @Resource(name = "beanValidator")
   protected  DefaultBeanValidator beanValidator;

   @RequestMapping(value="/sample/getDetailAddrApi.do")
   public void  getDetailAddrApi(@ModelAttribute("searchVO") SampleDefaultVO searchVO, 
                          HttpServletRequest req, ModelMap model, HttpServletResponse response) throws Exception {

   	String admCd = req.getParameter("admCd");
	String rnMgtSn = req.getParameter("rnMgtSn");
	String udrtYn = req.getParameter("udrtYn");
   	String buldMnnm = req.getParameter("buldMnnm");
	String buldSlno = req.getParameter("buldSlno");
	String confmKey = req.getParameter("confmKey");
	String searchType = req.getParameter("searchType");
	String dongNm = req.getParameter("dongNm");
	String apiUrl = "https://business.juso.go.kr/addrlink/addrDetailApi.do?admCd="+admCd
									+"&rnMgtSn="+rnMgtSn+"&udrtYn="+udrtYn+"&buldMnnm="+buldMnnm
									+"&buldSlno="+buldSlno+"&searchType="+searchType
									+"&dongNm="+URLEncoder.encode(dongNm,"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());
    }
}
						
					
어플리케이션 호출 (JSON) 소스
						
/*
 파일명 : apiSampleApplicationJSON.jsp
 내  용 : 웹 ↔ Java Controller ↔ 상세주소API방식(검색결과형식 JSON)
 비  고 : 검색결과형식을 XML로 받는 경우, 어플리케이션 호출 소스보기(XML)을 참고하시길 바랍니다.
*/
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<script type="text/JavaScript" src="/js/jquery-1.8.3.min.js" ></script>

<script language="javascript">
function getDetailAddr(){
	$.ajax({
		 url :"/sample/getDetailAddrApi.do"
		,type:"post"
		,data:$("#form").serialize()
		,dataType:"json"
		,success:function(jsonStr){
			$("#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);
				}
			}
		}
	    ,error: function(xhr,status, error){
	    	alert("에러발생");
	    }
	});
}

function makeListJson(jsonStr){
	var searchType = $("input[name='searchType']").val();
	var htmlStr = "";
	htmlStr += "<table>";
	$(jsonStr.results.juso).each(function(){
		htmlStr += "<tr>";
		htmlStr += "<td>"+this.admCd+"</td>";
		htmlStr += "<td>"+this.rnMgtSn+"</td>";
		htmlStr += "<td>"+this.udrtYn+"</td>";
		htmlStr += "<td>"+this.buldMnnm+"</td>";
		htmlStr += "<td>"+this.buldSlno+"</td>";
		htmlStr += "<td>"+this.dongNm+"</td>";
		if(searchType == "floorho"){
			htmlStr += "<td>"+this.floorNm+"</td>";
			htmlStr += "<td>"+this.hoNm+"</td>";
		}
		htmlStr += "</tr>";
	});
	htmlStr += "</table>";
	$("#list").html(htmlStr);
}
</script>
<title>Insert title here</title>
</head>
<body>
<form name="form" id="form"method="post">
	<input type="text" name="resultType" value="json"/> <!-- 요청 변수 설정 (검색결과형식 설정, json) -->
	<input type="text" name="confmKey" id="confmKey" value="TESTJUSOGOKR"/><!-- 요청 변수 설정 (승인키) -->
	<input type="text" name="admCd" value=""/> <!-- 요청 변수 설정 (행정구역코드) -->
	<input type="text" name="rnMgtSn" value=""/><!-- 요청 변수 설정 (도로명코드) --> 
	<input type="text" name="udrtYn" value=""/> <!-- 요청 변수 설정 (지하여부) -->
	<input type="text" name="buldMnnm" value=""/><!-- 요청 변수 설정 (건물본번) --> 
	<input type="text" name="buldSlno" value=""/><!-- 요청 변수 설정 (건물부번) -->
	<input type="text" name="searchType" value=""/><!-- 요청 변수 설정 (동층호 검색유형:dong, floorho) -->
	<input type="text" name="dongNm" value=""/><!-- 요청 변수 설정 (동) -->
	<input type="button" onClick="getDetailAddr();" value="상세주소 검색하기"/>
	<div id="list" ></div><!-- 검색 결과 리스트 출력 영역 -->
</form>
</body>
</html> 	

/*
 파일명 : apiSampleJSONController.java
 내  용 : 웹 ↔ Java Controller ↔ 상세주소API방식(검색결과형식 JSON)
*/
import 	 java.io.BufferedReader;
import 	 java.io.InputStream;
import 	 java.io.InputStreamReader;
import 	 java.net.MalformedURLException;
import 	 java.net.URL;
import 	 java.net.URLConnection;
import 	 java.net.URLEncoder;
import 	 java.util.List;
import 	 javax.annotation.Resource;
import 	 javax.servlet.http.HttpServletRequest;
import 	 javax.servlet.http.HttpServletResponse;
import 	 org.springframework.stereotype.Controller;
import 	 org.springframework.ui.Model;
import 	 org.springframework.ui.ModelMap;
import 	 org.springframework.validation.BindingResult;
import 	 org.springframework.web.bind.annotation.ModelAttribute;
import 	 org.springframework.web.bind.annotation.RequestMapping;
import 	 org.springframework.web.bind.annotation.RequestParam;
import 	 org.springframework.web.bind.annotation.SessionAttributes;
import 	 org.springframework.web.bind.support.SessionStatus;
import 	 org.springmodules.validation.commons.DefaultBeanValidator;

@Controller
@SessionAttributes(types=SampleVO.class)
public class  EgovSampleController {	

   @Resource(name = "sampleService")
   private  EgovSampleService sampleService;    

   @Resource(name = "propertiesService")
   protected  EgovPropertyService propertiesService;

   @Resource(name = "beanValidator")
   protected  DefaultBeanValidator beanValidator;

   @RequestMapping(value="/sample/getDetailAddrApi.do")
   public void  getDetailAddrApi(@ModelAttribute("searchVO") SampleDefaultVO searchVO, 
                          HttpServletRequest req, ModelMap model, HttpServletResponse response) throws Exception {

	String admCd = req.getParameter("admCd");
	String rnMgtSn = req.getParameter("rnMgtSn");
	String udrtYn = req.getParameter("udrtYn");
   	String buldMnnm = req.getParameter("buldMnnm");
	String buldSlno = req.getParameter("buldSlno");
	String confmKey = req.getParameter("confmKey");
	String searchType = req.getParameter("searchType");
	String dongNm = req.getParameter("dongNm");
	String resultType = req.getParameter("resultType");
	String apiUrl = "https://business.juso.go.kr/addrlink/addrCoordApi.do?admCd="+admCd
									+"&rnMgtSn="+rnMgtSn+"&udrtYn="+udrtYn+"&buldMnnm="+buldMnnm
									+"&buldSlno="+buldSlno+"&searchType="+searchType
									+"&dongNm="+URLEncoder.encode(dongNm,"UTF-8")
									+"&confmKey="+confmKey+"&resultType="+resultType;
   	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("application/json");
    	response.getWriter().write(sb.toString());
    }
}
						
					

다양한 도로명주소 활용을 위하여 사용환경에 맞춰 적용할 수 있도록 4가지 타입의 UI를 지원하며, div태그 형식으로 제공합니다.

검색어, 도로명주소 코드 및 좌표(GRS80)정보를 통하여 해당 주소의 상세정보 및 위치표기를 제공합니다.

자세한 적용방법은 가이드를 참고하시기 바랍니다.


가이드 및 소스 다운로드