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 |
요청변수
요청변수명 | 타입 | 필수여부 | 기본값 | 설명 |
---|---|---|---|---|
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) 제공여부 ※ 해당 옵션으로 추가제공되는 항목의 경우, 추후 특정항목이 제거되거나 추가될 수 있으니 적용 시 고려해주시기 바랍니다. |
출력결과
출력변수명 | 타입 | 필수여부 | 설명 | |
---|---|---|---|---|
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일 추가된 항목 관할주민센터 ※ 참고정보이며, 실제와 다를 수 있습니다. |
오류코드
오류코드 | 오류메세지 | 조치방법 |
---|---|---|
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정보
호출방식 | 요청 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 |
요청변수
요청변수명 | 타입 | 필수여부 | 기본값 | 설명 |
---|---|---|---|---|
confmKey | String | Y | - | 신청시 발급받은 승인키 |
currentPage | Integer | Y | 1 | 현재 페이지 번호 |
countPerPage | Integer | Y | 10 | 페이지당 출력할 결과 Row 수 |
keyword | String | Y | - | 주소 검색어 |
resultType | String | N | xml | 검색결과형식 설정(xml, json) |
출력결과
출력변수명 | 타입 | 필수여부 | 설명 | |
---|---|---|---|---|
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 | 도로명주소(한글) |
오류코드
오류코드 | 오류메세지 | 조치방법 |
---|---|---|
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정보
호출방식 | 요청 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 |
요청변수
요청변수명 | 타입 | 필수여부 | 기본값 | 설명 |
---|---|---|---|---|
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) |
출력결과
출력변수명 | 타입 | 필수여부 | 설명 | |
---|---|---|---|---|
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 | 건물명 |
오류코드
오류코드 | 오류메세지 | 조치방법 |
---|---|---|
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정보
호출방식 | 요청 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 |
요청변수
요청변수명 | 타입 | 필수여부 | 기본값 | 설명 |
---|---|---|---|---|
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) |
출력결과
출력변수명 | 타입 | 필수여부 | 설명 | |
---|---|---|---|---|
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 | 호 정보 |
오류코드
오류코드 | 오류메세지 | 조치방법 |
---|---|---|
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)정보를 통하여 해당 주소의 상세정보 및 위치표기를 제공합니다.
자세한 적용방법은 가이드를 참고하시기 바랍니다.