웹개발

[OpenAPI : Java] - 공공데이터포털 : 식품영양성분DB OPEN API

u_SZero 2023. 11. 22. 16:49

✓ 공공데이터포털접속 : 

※ 공공데이터포털로 접속해서 연결할 수 있는 다양한 데이터가 있지만

   식품영양성분DB 이용은 공공데이터포탈을 통하지 않고 식품의약품안전처에서 바로 이용이 가능한 점 알아두시길 바랍니다.

    → 식품영양성분DB 식품의약품안전처 이용하러 가기

   해당 글 중간 "✓인증키발급 : " 부분부터 보시면 됩니다!!

 

공공데이터포털 사이트 이용하러 가기

 

페이지 접근 후 로그인, 찾고자하는 API 검색

 

 

 

공공 데이터 포탈로 접근 했지만 URL을 통해 '식품의약품 안전처'에서 인증키 요청을 해야 한다

https://www.foodsafetykorea.go.kr/api/openApiInfo.do?menu_grp=MENU_GRP31&menu_no=661&show_cnt=10&start_idx=1&svc_no=I2790&svc_type_cd=API_TYPE06

 

데이터활용서비스

1 D00001 구이류 가자미구이 2019   식약('15) 제3권 200 314 3.5 43.2 14.2 0.4 1331.18 225.55 2.3 0.1 2 D00002 구이류 갈치구이 2019   식약('13) 제2권 250 481.32 0.35 61.99 25.77 0.35 1022.03 198.95 7.35 0.25 3 D00003 구이류 고등

www.foodsafetykorea.go.kr

 

 


 

 

✓ 인증키발급 : 

 

식품의약품안전처 회원가입 후 아래 사진에 보이는 "OPENAPI이용신청" 버튼을 통해 동의 후 인증키를 발급 받을 수 있다.

 


 

 

✓ OPEN API 요청 주소 살펴보기 : 

기본적인 URL은 다음과 같은 형태이고

http://openapi.foodsafetykorea.go.kr/api/인증키/서비스명/요청파일타입/요청시작위치/요청종료위치 

 

해당하는 요청인자 리스트는 다음과 같다.

 

인증키 : 발급받은 자신의 인증키

서비스명 : 샘플 주소에 나와있는 I2790

                 (주의! 여기서 I는 1이 아닌 영문대문자 i 이다 이걸로 안되서 5분 헤매인 사람 나야나...)

요청파일타입 : XML로 받으려면 xml, JSON으로 받으려면 json

요청시작위치 : 얻어낸 데이터 중 어디서 부터 시작해서 받을지

요청종료위치 : 얻어낸 데이터 중 어디까지 종료해서 받을지

                        (EX) 요청시작위치:1 / 요청종료위치:10 -> 1~10까지 10개의 데이터 얻어오기

 

 

이 외에는 추가 파라미터 값인데

예를 들면 DESC_KOR 인자를 이용해서 '브라우니' 를 검색할 수 있는 추가 파라미터들이다.

자신이 얻고자하는 데이터 상황에 맞게 덧붙여서 사용하면 된다.

 

 


 

 

✓ Java 로 JSON 파일 불러오기 : 

Open API를 이용하는 Java 코드를 공공데이터포털 사이트에서 볼 때 친절하게 달아주는 곳도 있었지만 여기 사이트에서는 제공을 해주지 않아서

다른 공공데이터포털에서 제공하는 Java 코드를 기반으로 수정해서 사용하였다.

물론 다른 분들의 블로그도 함께 참고하였다.

 

아래 코드에서 자신이 홈페이지에서 발급받은 인증키를 복사해서 붙여넣고 실행한다.

아래 코드에서는 DESC_KOR 인자를 추가하여 "구이"가 들어간 데이터를 검색하였다.

public class ApiExplorer {
    public static void main(String[] args) throws IOException, ParseException {
    	// URL을 만들기 위한 StringBuilder. 객체 선언 및 초기화
        StringBuilder urlBuilder = new StringBuilder("http://openapi.foodsafetykorea.go.kr/api"); /*URL*/
        // 오픈 API의요청 규격에 맞는 파라미터 생성
        urlBuilder.append("/" + URLEncoder.encode("발급받은인증키복붙하기", "UTF-8")); /*발급받은 인증키*/
        urlBuilder.append("/" + URLEncoder.encode("I2790","UTF-8")); /*서비스 명*/
        urlBuilder.append("/" + URLEncoder.encode("json","UTF-8")); /*파일 타입*/
        urlBuilder.append("/" + URLEncoder.encode("1", "UTF-8")); /*요청시작위치*/
        urlBuilder.append("/" + URLEncoder.encode("10", "UTF-8")); /*요청종료위치*/
        urlBuilder.append("/" + URLEncoder.encode("DESC_KOR", "UTF-8") + "=" + URLEncoder.encode("구이", "UTF-8")); /*검색어*/
        // URL 객체 생성.
        URL url = new URL(urlBuilder.toString());
        // 요청하고자 하는 URL과 통신하기 위한 Connection 객체 생성.
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        // 통신을 위한 메소드 SET.
        conn.setRequestMethod("GET");
        // 통신을 위한 Content-type SET. 
        conn.setRequestProperty("Content-type", "application/json");
        // 통신 응답 코드 확인.
        System.out.println("Response code: " + conn.getResponseCode());
        // 전달받은 데이터를 BufferedReader 객체로 저장.
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        // 저장된 데이터를 라인별로 읽어 StringBuilder 객체로 저장.
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        // 객체 해제.
        rd.close();
        conn.disconnect();
        // 전달받은 데이터 확인.
        System.out.println(sb.toString());
    }
}

 

실행하면 다음과 같은 결과가 출력된다.

 

콘솔에 출력된 두번째 줄을 메모장에 옮겨서 살펴보면

 

...중략...

 

다음과 같은 형태의 Json 데이터를 얻을 수 있다.

 

{"서비스명" :

    {

        "전체데이터수" : 10,

        "행" : [ {데이터1}, {데이터2}, {데이터3}, .... {데이터10}],

        "실행상태결과" : {"실행상태메시지" : "정상처리되었습니다.", "실행메시지코드" : "INFO-000"}

    }

}

 

실행 메세지코드와 설명도 홈페이지에서 볼 수 있다.

 

 


 

 

✓ Java 로 JSON 파일 Parsing 하기 : 

이제 얻어낸 Json 파일을 개발에 사용하기 위해서는 Json 형식의 데이터를 다룰 줄 알아야하는데

Java에서 Json을 parsing 하기 위해서는 jar파일이 필요했다.

 

아래 링크에 접속하여

https://code.google.com/archive/p/json-simple/downloads

 

Google Code Archive - Long-term storage for Google Code Project Hosting.

 

code.google.com

 

json_simple-1.1.1.jar 파일을 받아서 eclipse에 추가해주었다.

 

방법은 실행하고자하는 현재 프로젝트 우클릭 -> Build Path -> Configure Build Path 클릭해서 들어간 후

창이 뜨면 "Add External JARs..." 를 클릭하여 다운받은 json_simple-1.1.1.jar파일을 추가해준다.

 

 

 

앞서 작성한 Json 파일 출력하는 코드에 이어서 작성해주었다.

        // 문자열 형태의 JSON을 파싱하기 위한 JSONParser 객체 생성.
        JSONParser parser = new JSONParser();
        // 문자열을 JSON 형태로 JSONObject 객체에 저장. 	
        JSONObject obj = (JSONObject)parser.parse(sb.toString());
      
        JSONObject iObj = (JSONObject) obj.get("I2790");
        JSONArray dataArr = (JSONArray) iObj.get("row");
        
        StringBuilder sb2 = new StringBuilder();
        for(int i=0; i<dataArr.size(); i++)
        {
        	JSONObject tObj = (JSONObject) dataArr.get(i);
        	String content = (String) tObj.get("DESC_KOR");
        	sb2.append(content + " / ");
        }
        System.out.println(sb2.toString());

 

Json parsing 하여 JSONObject 객체에 저장하였으면

{"I2790" :

    {

        "total_count" : "10",

        "row" : [ {데이터1}, {데이터2}, {데이터3}, .... {데이터10}],

        "RESULT" : {"MSG" : "정상처리되었습니다.", "CODE" : "INFO-000"}

    }

}

 

구조를 생각하면서 "I2790" 안에 있는 "row"를 가져오고 -> JSONObject iObj = (JSONObject) obj.get("I2790");

"row"에 매칭되어있는 배열을 JSONArray 객체로 가져오자 -> JSONArray dataArr = (JSONArray) iObj.get("row");

 

가져온 JSONArray 객체를 for문을 이용해서 각 데이터에 접근해서 필요한 데이터인 "DESC_KOR"만 얻어오자

->

StringBuilder sb2 = new StringBuilder();

for(int i=0; i<dataArr.size(); i++)
{
    JSONObject tObj = (JSONObject) dataArr.get(i);
    String content = (String) tObj.get("DESC_KOR");
    sb2.append(content + " / ");
}

 

System.out.println(sb2.toString()); 하면

다음과 같은 결과를 얻을 수 있다.

 

 

 

어느 정도 익숙해졌으니 이제 앞으로의 프로젝트에 적용해서 응용 해봐야겠다!