개발

open api 로 우편번호 검색하기

에드몽단테스 2010. 8. 31. 10:08
우편번호 검색 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을 이용하여 쉽게 사용할 수 있다.

소스가 완전하지는 않지만 이정도면 수정하여 사용가능할 듯 ㅋ
반응형