ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 자바 공휴일 API 연동
    Web Programming 2023. 7. 21. 20:50
    728x90
    반응형

    달력 요구사항이 너무 많다..

    이제는 공휴일 표시까지 ㅠㅠ 공휴일 표시가 필요한 달력인지도 모르겠는데..

    뭐 우선 요청사항이니 공공데이터를 통해서 공휴일 정보 표출하는 것부터 해보자 !!

    <%@ page import="java.io.InputStreamReader"%>
    <%@ page import="java.net.HttpURLConnection"%>
    <%@ page import="java.net.URL"%>
    <%@ page import="java.net.URLEncoder"%>
    <%@ page import="java.io.BufferedReader"%>
    <%@ page import="java.io.IOException"%>
    <%@ page import="org.w3c.dom.*"%>
    <%@ page import="javax.xml.parsers.DocumentBuilderFactory"%>
    <%@ page import="javax.xml.parsers.DocumentBuilder"%>
    <%
        // [in] y : 년
        // [in] m : 월
        // [out] v[i*2 +0]=휴일날짜(YYYYMMDD), v[i*2 +1]=휴일 명칭
        // 반환값 : 에러메시지, null == OK
            HttpURLConnection con = null;
            String s = null; // 에러 메시지
           
            try
            {
                URL url = new URL(
                    "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo"
                    + "?ServiceKey=서비스키" // 서비스키
                    + "&solYear=2019"  // 연도
                    + "&solMonth=02"   // 월
                    );
               
                con = (HttpURLConnection)url.openConnection();
                con.setRequestProperty("Accept-language", "ko");
                /* Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(con.getInputStream()); */
                
                DocumentBuilderFactory dof = DocumentBuilderFactory.newInstance();
                
            	// XXE 방지 추가
            	dof.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
            	dof.setFeature("http://xml.org/sax/features/external-general-entities", false);
            	dof.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
            	dof.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
            	dof.setXIncludeAware(false);
            	dof.setExpandEntityReferences(false);
            	// XXE 방지 추가
            	
            	DocumentBuilder db = dof.newDocumentBuilder();
     			Document doc = db.parse(con.getInputStream());
    
                boolean ok = false; // <resultCode>00</resultCode> 획득 여부
               
                Element e;
                NodeList ns = doc.getElementsByTagName("header");
                if (ns.getLength() > 0)
                {
                    e = (Element)ns.item(0);
                    if (e.getElementsByTagName("resultCode").item(0).getTextContent().equals("00"))
                        ok = true; // 성공 여부
                    else // 에러 메시지
                        s = e.getElementsByTagName("resultMsg").item(0).getTextContent();
                }
                   
                if (ok)
                {
                    ns = doc.getElementsByTagName("item");
                    for (int i = 0; i < ns.getLength(); i++)
                    {
                        e = (Element)ns.item(i);
                       /*  v.add(e.getElementsByTagName("locdate").item(0).getTextContent()); // 날짜
                        v.add(e.getElementsByTagName("dateName").item(0).getTextContent()); // 명칭 */
                        
                        out.println(e.getElementsByTagName("locdate").item(0).getTextContent()); // 날짜
                        out.println(e.getElementsByTagName("dateName").item(0).getTextContent()); // 명칭
                    }
                }
            }
            catch (Exception e)
            {
                s = e.getMessage();
            }
           
            if (con != null){
                con.disconnect();
            }
    	
    %>

    표출화면

    우선은 문제없이 잘나온다. 

    적용 자바 버전은 1.7

    추가로 XXE 방지도 같이 해줬다.

    파라미터 정보

    공공데이터 포털

    공공데이터포털 (data.go.kr)

     

    공공데이터 포털

    국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase

    www.data.go.kr

    추가로 함수로 변경해서 사용 예시 !!

    <%@ page import="java.io.InputStreamReader"%>
    <%@ page import="java.net.HttpURLConnection"%>
    <%@ page import="java.net.URL"%>
    <%@ page import="java.net.URLEncoder"%>
    <%@ page import="java.io.BufferedReader"%>
    <%@ page import="java.io.IOException"%>
    <%@ page import="org.w3c.dom.*"%>
    <%@ page import="javax.xml.parsers.DocumentBuilderFactory"%>
    <%@ page import="javax.xml.parsers.DocumentBuilder"%>
    <%@ page import="java.util.ArrayList"%>
    <%@ page import="java.net.MalformedURLException"%>
    <%@ page import="javax.xml.parsers.ParserConfigurationException"%>
    <%@ page import="org.xml.sax.SAXException"%>
    
    public ArrayList<String> getGongHueData(String year, String month){
     // [in] y : 년
     // [in] m : 월
     // [out] v[i*2 +0]=휴일날짜(YYYYMMDD), v[i*2 +1]=휴일 명칭
     // 반환값 : 에러메시지, null == OK
         HttpURLConnection con = null;
         String gongHueDayErrMsg = null; // 에러 메시지
         ArrayList<String> gongHueDayMonList = null;
        
         try
         {
             URL url = new URL(
                 "http://apis.data.go.kr/B090041/openapi/service/SpcdeInfoService/getRestDeInfo"
                 + "?ServiceKey=서비스키" // 서비스키
                 + "&solYear="+year+""  // 연도
                 + "&solMonth="+month+""   // 월
                 );
            
             con = (HttpURLConnection)url.openConnection();
             con.setRequestProperty("Accept-language", "ko");
             
             DocumentBuilderFactory dof = DocumentBuilderFactory.newInstance();
             
         	// XXE 방지 추가
         	dof.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);
         	dof.setFeature("http://xml.org/sax/features/external-general-entities", false);
         	dof.setFeature("http://xml.org/sax/features/external-parameter-entities", false);
         	dof.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);
         	dof.setXIncludeAware(false);
         	dof.setExpandEntityReferences(false);
         	// XXE 방지 추가
         	
         	DocumentBuilder db = dof.newDocumentBuilder();
    		Document doc = db.parse(con.getInputStream());
    
             boolean ok = false; // <resultCode>00</resultCode> 획득 여부
            
             Element e;
             NodeList ns = doc.getElementsByTagName("header");
             if (ns.getLength() > 0)
             {
                 e = (Element)ns.item(0);
                 if (e.getElementsByTagName("resultCode").item(0).getTextContent().equals("00"))
                     ok = true; // 성공 여부
                 else // 에러 메시지
                 	gongHueDayErrMsg = e.getElementsByTagName("resultMsg").item(0).getTextContent();
             }
                
             if (ok)
             {
             	gongHueDayMonList = new ArrayList<>();
             	
                 ns = doc.getElementsByTagName("item");
                 for (int i = 0; i < ns.getLength(); i++)
                 {
                    e = (Element)ns.item(i);
                     
                    gongHueDayMonList.add(e.getElementsByTagName("locdate").item(0).getTextContent().toString()); 
                    
                    /*  
                    v.add(e.getElementsByTagName("locdate").item(0).getTextContent()); // 날짜
                    v.add(e.getElementsByTagName("dateName").item(0).getTextContent()); // 명칭 
                    */
                     
                    /* 
                    out.println(i);
                    out.println(e.getElementsByTagName("locdate").item(0).getTextContent()); // 날짜
                    out.println(e.getElementsByTagName("locdate").item(0).getTextContent().getClass().getName()); // 타입확인 
                    */
                     
                    /* 
                    out.println(e.getElementsByTagName("dateName").item(0).getTextContent()); // 명칭
                    */ 
                 }
                 
             }else{
             	
             	// 에러메세지 로그찍힘
             	System.out.println("GonghueDay func conecnt API"+gongHueDayErrMsg.toString()+"Error");
             }
         }
         catch (MalformedURLException e)
         { 
             System.out.println("GonghueDay func MalformedURL Error");
         }catch (NullPointerException e)
         { 
             System.out.println("GonghueDay func Null Error");
         }catch (IOException e)
         { 
             System.out.println("GonghueDay func IO Error");
         }catch (ParserConfigurationException e)
         { 
             System.out.println("GonghueDay func ParserConfiguration Error");
         }catch (SAXException e)
         { 
             System.out.println("GonghueDay func SAX Error");
         }
         
         if (con != null){
             con.disconnect();
         }
         
         return gongHueDayMonList;
         
    }

     

    728x90
    반응형

    'Web Programming' 카테고리의 다른 글

    자바스크립트 confirm 문구 줄바꿈  (0) 2023.07.25
    오라클 CASE WEHN 간단 예시  (0) 2023.07.21
    오라클 DB 세션 KILL 하기  (0) 2023.07.14
    오라클 컬럼 추가 삭제  (0) 2023.07.11
    오라클 컬럼명 수정  (0) 2023.07.11
Designed by Tistory.