개인정보보호위원회에서 제공하는 공공데이터 중 공공기관 개인정보 관리수준 진단결과를 조회하는 기능을 소개해 드리겠습니다.
공공기관 개인정보 관리수준 진단결과는 파일데이터 형식으로 제공되는 공공데이터로, 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
'안드로이드' 카테고리의 다른 글
구글 플레이스토어 또 거절... SMS발송권한과 개인정보정책 (0) | 2023.11.16 |
---|---|
구글플레이 앱스토어 개인정보정책 누락에 의한 등록거절 (0) | 2023.11.15 |
국민권익위원회의 기관별 청렴도 등급 공공데이터 조회 (0) | 2023.11.13 |
뷰페이저를 활용한 안내 배너 전환기능 구현 (2) | 2023.11.10 |
안드로이드앱 동적 버튼 생성과 버튼 파라미터 설정 (1) | 2023.08.31 |