우편번호 검색 api 는 인터넷 우체국사업자 홈페이지에서 회원가입없이 무료로 받을 수 있다.
http://biz.epost.go.kr/eportal/custom/custom_9.jsp?subGubun=sub_3&subGubun_1=cum_17&gubun=m07
아래는 간단하게 만든 우편번호 검색 메소드이다.
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.StringReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Map;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.xml.sax.InputSource;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
public ArrayList<String[]> getPostAndAddress(String name){
final String apiurl = "http://biz.epost.go.kr/KpostPortal/openapi";
String myApi = "발급받은 api 입력"
ArrayList<String[]> addressInfo = new ArrayList<String[]>();
HttpURLConnection conn = null;
try{
StringBuffer sb = new StringBuffer(3);
sb.append(apiurl);
sb.append("?regkey="+myApi+"&target=post&query=");
sb.append(URLEncoder.encode(name,"EUC-KR"));
String query = sb.toString();
URL url = new URL(query);
conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("accept-language","ko");
DocumentBuilder docBuilder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
byte[] bytes = new byte[4096];
InputStream in = conn.getInputStream();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while(true){
int red = in.read(bytes);
if(red < 0)
break;
baos.write(bytes, 0, red);
}
String xmlData = baos.toString("euc-kr");
baos.close();
in.close();
conn.disconnect();
Document doc = docBuilder.parse(new InputSource(new StringReader(xmlData)));
Element el = (Element)doc.getElementsByTagName("itemlist").item(0);
for(int i=0; i<el.getChildNodes().getLength(); i++){
Node node = el.getChildNodes().item(i);
if(!node.getNodeName().equals("item")){
continue;
}
String address = node.getChildNodes().item(1).getFirstChild().getNodeValue();
String post = node.getChildNodes().item(3).getFirstChild().getNodeValue();
addressInfo.add(new String[]{post.substring(0, 3), post.substring(4), address});
}
}catch(Exception e){
e.printStackTrace();
}finally{
try{if(conn != null) conn.disconnect(); } catch(Exception e){}
}
return addressInfo;
}
itemlist 태그의 자식노드들을 검색할때 자식노드가 item 인 경우만 체크해서 루프를 돌렸는데 왜냐하면 태그와 태그사이에 화이트문자(개행문자, 탭, 공백문자등) 이 있을 수 있기 때문이다. 이 문자들이 있으면 Text 타입의 노드로 인식을 하기 때문에 이런경우는 걸러내었다.
이런 절차가 번거로우면 다음과 같이 화이트문자를 제거하고 파싱할 수 있다.
기본값은 false 이다.
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
factory.setIgnoringElementContentWhitespace(true);
위의 URL로 우편번호를 요청하게 되면 대략 다음과 같은 결과값을 가져온다.
<?xml version="1.0" encoding="euc-kr" ?>
<post>
<itemlist>
<item>
<address><![CDATA[서울시 성동구 구의1동 1]]></address>
<postcd>111111</postcd>
</item>
<item>
<address><![CDATA[서울시 성동구 구의1동 2]]></address>
<postcd>111112</postcd>
</item>
<item>
<address><![CDATA[서울시 성동구 구의1동 3]]></address>
<postcd>111113</postcd>
</item>
</itemlist>
</post>
XML을 파싱해서 우편번호는 분리하고 주소값과 함께 문자열 배열에 넣는다. String[3]
그리고 문자열 배열을 ArrayList 에 다시 넣는다.
이 값은 JSP 에서 EL을 이용하여 쉽게 사용할 수 있다.
소스가 완전하지는 않지만 이정도면 수정하여 사용가능할 듯 ㅋ