안드로이드

개인정보보호위원회의 공공기관 개인정보관리수준 진단결과 공공데이터 조회

톰이야요 2023. 11. 14. 08:00

개인정보보호위원회에서 제공하는 공공데이터 중 공공기관 개인정보 관리수준 진단결과를 조회하는 기능을 소개해 드리겠습니다. 

공공기관 개인정보 관리수준 진단결과는 파일데이터 형식으로 제공되는 공공데이터로, CSV형태의 파일로 제공이 되고 있었는데, 이제는 API로도 호출하여 데이터를 받을 수 있도록 되어있습니다. 따라서, 호출방법은 API 호출기능과 동일하게 하면 됩니다.

 

public void pipc_manageresult()
    {
        try {
            StringBuilder urlBuilder = new StringBuilder("https://api.odcloud.kr/api/15114706/v1/uddi:0405a812-11a6-47e8-8c2c-cc49f29bd88d"); /*URL*/
            urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + m_context.getText(R.string.servicekey)); /*Service Key*/
            urlBuilder.append("&" + URLEncoder.encode("returnType","UTF-8") + "=" + URLEncoder.encode("XML", "UTF-8")); /* XML 방식의 리턴타입 설정 필요, 기본은 Json */
            urlBuilder.append("&" + URLEncoder.encode("page","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
            urlBuilder.append("&" + URLEncoder.encode("perPage","UTF-8") + "=" + URLEncoder.encode("10000", "UTF-8")); /*한 페이지 결과 수*/
            m_url = new URL(urlBuilder.toString());
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

위와 같이 호출문자열을 만들어 호출을 합니다.

 

 

결과로 받는 XML형식의 데이터는 아래와 같이 파싱하여 데이터구조에 저장합니다.

private void parse_data(String strData)
    {
        boolean bPipc_2017 = false, bPipc_2018 = false, bPipc_2019 = false, bPipc_2020 = false, bPipc_2021 = false;
        boolean bPipc_2021_1 = false, bPipc_2021_2 = false, bPipc_2021_3 = false, bPipc_Gubun = false;
        int nItemCount = 0;

        m_apicode.Init();

        try {
            InputStream isData = new ByteArrayInputStream(strData.getBytes("utf-8"));
            XmlPullParserFactory parserFactory = XmlPullParserFactory.newInstance();
            XmlPullParser parser = parserFactory.newPullParser();

            parser.setInput(isData, null);
            int eventType = parser.getEventType();
            while (eventType != XmlPullParser.END_DOCUMENT) {
                switch (eventType)
                {
                    case XmlPullParser.START_TAG:
                        // XML 데이터 시작
                        String startTag = parser.getName();

                        //XML 구조상, NAME이 col의 요소로 들어가 있음. 따라서, 추가작업 (예시: <col name="CNTRCT_CNCLS_ENDDE">2023-04-05</col>)
                        if (startTag.equals("col")) {String startTagName = parser.getAttributeValue(null, "name"); startTag = startTagName;}

                        if (startTag.equals("2017년")) {bPipc_2017=true;}
                        if (startTag.equals("2018년")) {bPipc_2018=true;}
                        if (startTag.equals("2019년")) {bPipc_2019=true;}
                        if (startTag.equals("2020년")) {bPipc_2020=true;}
                        if (startTag.equals("2021년")) {bPipc_2021=true;}
                        if (startTag.equals("2021년_관리체계")) {bPipc_2021_1=true;}
                        if (startTag.equals("2021년_보호대책")) {bPipc_2021_2=true;}
                        if (startTag.equals("2021년_침해대책")) {bPipc_2021_3=true;}
                        if (startTag.equals("구 분")) {bPipc_Gubun=true;}
                        break;
                    case XmlPullParser.TEXT:
                        if (bPipc_2017) {m_apicode.SetAPIData_WithCheck(parser.getText(), PIPC_MANAGESCORE_2017 + nItemCount*PIPC_MANAGESCORE_GAP); bPipc_2017=false;}
                        if (bPipc_2018) {m_apicode.SetAPIData_WithCheck(parser.getText(), PIPC_MANAGESCORE_2018 + nItemCount*PIPC_MANAGESCORE_GAP); bPipc_2018=false;}
                        if (bPipc_2019) {m_apicode.SetAPIData_WithCheck(parser.getText(), PIPC_MANAGESCORE_2019 + nItemCount*PIPC_MANAGESCORE_GAP); bPipc_2019=false;}
                        if (bPipc_2020) {m_apicode.SetAPIData_WithCheck(parser.getText(), PIPC_MANAGESCORE_2020 + nItemCount*PIPC_MANAGESCORE_GAP); bPipc_2020=false;}
                        if (bPipc_2021) {m_apicode.SetAPIData_WithCheck(parser.getText(), PIPC_MANAGESCORE_2021 + nItemCount*PIPC_MANAGESCORE_GAP); bPipc_2021=false;}
                        if (bPipc_2021_1) {m_apicode.SetAPIData_WithCheck(parser.getText(), PIPC_MANAGESCORE_2021_1 + nItemCount*PIPC_MANAGESCORE_GAP); bPipc_2021_1=false;}
                        if (bPipc_2021_2) {m_apicode.SetAPIData_WithCheck(parser.getText(), PIPC_MANAGESCORE_2021_2 + nItemCount*PIPC_MANAGESCORE_GAP); bPipc_2021_2=false;}
                        if (bPipc_2021_3) {m_apicode.SetAPIData_WithCheck(parser.getText(), PIPC_MANAGESCORE_2021_3 + nItemCount*PIPC_MANAGESCORE_GAP); bPipc_2021_3=false;}
                        if (bPipc_Gubun) {m_apicode.SetAPIData_WithCheck(parser.getText(), PIPC_MANAGESCORE_GUBUN + nItemCount*PIPC_MANAGESCORE_GAP); bPipc_Gubun=false;}
                        break;

                    case XmlPullParser.END_TAG:
                        if (parser.getName().equals("item")) {nItemCount++;}
                        break;
                    default: break;
                }
                eventType = parser.next();
            }
        }
        catch (Exception e) {
            e.printStackTrace() ;
        }
        m_apicode.SetDataCount(nItemCount);
    }

파싱은 위와 같은 방법으로 하고 있습니다. 데이터 파싱하는 부분을 만들때마다 노가다(?)성 작업을 하게 되어서 더 편한 방법이 있을 것 같은데, 아직 찾지 못했습니다. 위와 같은 형식으로 XML형태로 들어온 데이터를 파싱하여, 데이터를 보관하는 구조에 저장하게 됩니다.

 

 

 

 

2017년 부터, 2021년도 까지의 개인정보 관리수준진단 결과를 공공데이터로 제공하고 있습니다. 21년도부터는 관리/보호/침해로 나누어서 결과를 내고있는가 봅니다. 

 

 

콩콩데이터 앱은 아래의 포스팅에 안내되어있습니다.

https://play.google.com/store/apps/details?id=com.main.knh.kong

 

콩콩데이터 - 정부, 공공기관의 실시간 공공데이터 조회 - Google Play 앱

콩콩데이터는 공공데이터를 활용하여 정부부처, 공공기관 등 각 기관의 역할 및 운영 소식을 국민들에게 알기 쉽고 투명하게 제공합니다.

play.google.com