ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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을 이용하여 쉽게 사용할 수 있다.

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

    '개발' 카테고리의 다른 글

    플리커 GPS 정보  (0) 2010.10.24
    엑셀함수 RATE()  (0) 2010.10.05
    이미지에 워터마크 넣기  (0) 2010.08.30
    아이폰 웹개발시 팁  (0) 2010.07.29
    클래스 이름을 사용하여 요소찾기  (0) 2010.06.02

    댓글

Designed by Tistory.