공공01_데이터 가져오기

charl hi·2022년 2월 9일
0

공공서비스

목록 보기
1/3

공공데이터 포털

중요 요소?

  • api 종류 : 예) REST

요청주소


샘플코드



활용신청

  • 활용신청 버튼 누르고

->



살펴보기

->

  • 인코딩 일반 인증키 쓰고, 안되면 디코딩 일반 인증키 쓰기

미리보기, url 분석


URL을 살펴보면

http://apis.data.go.kr/B552584/UlfptcaAlarmInqireSvc/getUlfptcaAlarmInfo
?
serviceKey=A3nhXM%2B8eD%2FtaKtnnZ8jh1RhBRIPv%2BIwyplaq9oBZ3KUp5z3Kkung0s77hMg2GX2DRP7K5u108sc5oBE%2F6YQ1A%3D%3D
&returnType=xml
&numOfRows=100
&pageNo=1
&year=2020
&itemCode=PM10




자바 프로젝트

설정

  • 자바 프로젝트 만들고

  • 상세설명>샘플코드의 위를 복사하여 main함수에 넣기

  • 컨트롤+시프트+o 해서 임포트

  • 예외 던지기

  • 실행해서 ✨Response code: 200이 뜨면 성공


서비스키

  • 위 인증키를 복사

  • "=서비스키" -> "="+"MY_KEY"

		//인증키
		final String MY_KEY = "A3nhXM%2B8eD%2FtaKtnnZ8jh1RhBRIPv%2BIwyplaq9oBZ3KUp5z3Kkung0s77hMg2GX2DRP7K5u108sc5oBE%2F6YQ1A%3D%3D";



코드+하나씩 살펴보자

샘플코드

package main;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class Main {

	public static void main(String[] args) throws Exception {
		
		//인증키
		final String MY_KEY = "A3nhXM%2B8eD%2FtaKtnnZ8jh1RhBRIPv%2BIwyplaq9oBZ3KUp5z3Kkung0s77hMg2GX2DRP7K5u108sc5oBE%2F6YQ1A%3D%3D";
		
		//<자바에서 웹으로 요청하는 방법>
		//1. URL 세팅(요청주소 + 파라미터들 세팅)
		StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/B552584/UlfptcaAlarmInqireSvc/getUlfptcaAlarmInfo"); /*URL*/
        urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + MY_KEY); /*Service Key*/
        urlBuilder.append("&" + URLEncoder.encode("returnType","UTF-8") + "=" + URLEncoder.encode("xml", "UTF-8")); /*xml 또는 json*/
        urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("100", "UTF-8")); /*한 페이지 결과 수*/
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
        urlBuilder.append("&" + URLEncoder.encode("year","UTF-8") + "=" + URLEncoder.encode("2020", "UTF-8")); /*측정 연도*/
        urlBuilder.append("&" + URLEncoder.encode("itemCode","UTF-8") + "=" + URLEncoder.encode("PM10", "UTF-8")); /*미세먼지 항목 구분(PM10, PM25), PM10/PM25 모두 조회할 경우 파라미터 생략*/
       
        //URLEncoder.encode : 한글은 URLEncoding 작업을 해줘야 URL에서 정상적으로 전달이 됨

        //2. URL 객체 생성(urlBuilder을 이용해서)
        URL url = new URL(urlBuilder.toString());
       
        //3. URL 을 이용해서 connection 가져오기
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
      
        //4. request의 요청방식(method)랑 header 설정
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");
      
        //conn.getResponseCode() : connection을 이용해서 응답코드(response code) 확인 가능
        System.out.println("Response code: " + conn.getResponseCode());
       
        //5. 커넥션에서 inputStream 가져옴 -> BufferdReader로 변환
        //응답코드에 따른 처리(conn.getInputStream())
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
       
        //6. 5에서 가져온 스트림으로 데이터 한줄씩 읽기(누적시키기)
        //그 rd를 한줄씩 읽어서 line에 누적해서 넣기
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
       
        //7. 사용한 자원(스트림, 커넥션) 정리 : rd 자원 반납, 웹사이트랑 연결도 끊기
        rd.close();
        conn.disconnect();
       
        //8. 6에서 누적한 결과 확인
        System.out.println(sb.toString());
	}
}


String vs. StringBuilder vs. StringBuffer

저장

  • String - String pool로 리터럴로
  • StringBuilder, StringBuffer : 힙메모리에 저장

문자열의 변경 유무

  • String : 변경 ㄴㄴ
  • StringBuilder, StringBuffer : 변경 자주 ㅇㅇ

쓰레드 안전성

  • StringBuilder : safe ㄴㄴ
  • String, StringBuffer : safe ㅇㅇ



스프링프젝에서 해보자

OpenApiContorller

  • returnType=json으로 해보자
package com.kh.app26;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("data")
public class OpenApiContorller {

	@GetMapping("micro")
	public String micro() throws Exception{
		
		String result = callMicro();
		
		System.out.println(result);
		
		return "data/micro";
	}
	
	private String callMicro() throws Exception{
		
		
		//인증키
		final String MY_KEY = "A3nhXM%2B8eD%2FtaKtnnZ8jh1RhBRIPv%2BIwyplaq9oBZ3KUp5z3Kkung0s77hMg2GX2DRP7K5u108sc5oBE%2F6YQ1A%3D%3D";
		
		//<자바에서 웹으로 요청하는 방법>
		//1. URL 세팅(요청주소 + 파라미터들 세팅)
		StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/B552584/UlfptcaAlarmInqireSvc/getUlfptcaAlarmInfo"); /*URL*/
		
        urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + MY_KEY); /*Service Key*/
        urlBuilder.append("&" + URLEncoder.encode("returnType","UTF-8") + "=" + URLEncoder.encode("json", "UTF-8")); /*xml 또는 json*/
        urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("100", "UTF-8")); /*한 페이지 결과 수*/
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
        urlBuilder.append("&" + URLEncoder.encode("year","UTF-8") + "=" + URLEncoder.encode("2020", "UTF-8")); /*측정 연도*/
        urlBuilder.append("&" + URLEncoder.encode("itemCode","UTF-8") + "=" + URLEncoder.encode("PM10", "UTF-8")); /*미세먼지 항목 구분(PM10, PM25), PM10/PM25 모두 조회할 경우 파라미터 생략*/
        //URLEncoder.encode : 한글은 URLEncoding 작업을 해줘야 URL에서 정상적으로 전달이 됨       
        
        //2. URL 객체 생성(urlBuilder을 이용해서)
        URL url = new URL(urlBuilder.toString());
        
        //3. URL 을 이용해서 connection 가져오기
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        
        //4. request의 요청방식(method)랑 header 설정
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");
        
        //conn.getResponseCode() : connection을 이용해서 응답코드(response code) 확인 가능
        System.out.println("Response code: " + conn.getResponseCode());
        
        //5. 커넥션에서 inputStream 가져옴 -> BufferdReader로 변환
        //응답코드에 따른 처리(conn.getInputStream())
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        
        //6. 5에서 가져온 스트림으로 데이터 한줄씩 읽기(누적시키기)
        //그 rd를 한줄씩 읽어서 line에 누적해서 넣기
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        
        //7. 사용한 자원(스트림, 커넥션) 정리 : rd 자원 반납, 웹사이트랑 연결도 끊기
        rd.close();
        conn.disconnect();
        
        //8. 6에서 누적한 결과 확인
//        System.out.println(sb.toString());
        
        return sb.toString();
	}
}


파싱 : gson

pom.xml

		<dependency>
		    <groupId>com.google.code.gson</groupId>
		    <artifactId>gson</artifactId>
		    <version>2.8.6</version>
		</dependency>


2) ✨✨✨

package com.kh.app26;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;

@Controller
@RequestMapping("data")
public class OpenApiContorller {

	@GetMapping("micro")
	public String micro() throws Exception{
		
		String result = callMicro();
		
		//json 데이터 파싱하기
//		JsonElement jsonElem = JsonParser.parseString(result);
		JsonObject resultObj = JsonParser.parseString(result).getAsJsonObject();
		JsonObject responseObj = resultObj.getAsJsonObject("response");
        //"key"를 넣어주면 "value"를 뱉어낸다.
		
		JsonObject bodyObj = responseObj.getAsJsonObject("body");
		//"items":[{}] -> 배열이므로
		JsonArray items = bodyObj.getAsJsonArray("items");
		
		System.out.println(items);
//		[{"clearVal":"65","sn":"249", ...
		
		//내가 원하는 것만
		for(int i=0; i<items.size(); ++i) {
			System.out.println(items.get(i));
		}
		
		/*
//		System.out.println(result);
//		{"response":{"body":{"totalCount":108, "item":[...."header"...
		
//		System.out.println(responseObj);
//		{"body":{"totalCount":108,"items":[{"clearVal":...."header"...
		
		System.out.println(responseObj.getAsJsonObject("header"));
		System.out.println(responseObj.getAsJsonObject("body"));
//		{"resultMsg":"NORMAL_CODE","resultCode":"00"}
//		{"totalCount":108,"items":[{"clearVal":"....
		 * 
		 */
		
		return "data/micro";
	}
	
	private String callMicro() throws Exception{
		
		
		//인증키
		final String MY_KEY = "A3nhXM%2B8eD%2FtaKtnnZ8jh1RhBRIPv%2BIwyplaq9oBZ3KUp5z3Kkung0s77hMg2GX2DRP7K5u108sc5oBE%2F6YQ1A%3D%3D";
		
		//<자바에서 웹으로 요청하는 방법>
		//1. URL 세팅(요청주소 + 파라미터들 세팅)
		StringBuilder urlBuilder = new StringBuilder("http://apis.data.go.kr/B552584/UlfptcaAlarmInqireSvc/getUlfptcaAlarmInfo"); /*URL*/
		
        urlBuilder.append("?" + URLEncoder.encode("serviceKey","UTF-8") + "=" + MY_KEY); /*Service Key*/
        urlBuilder.append("&" + URLEncoder.encode("returnType","UTF-8") + "=" + URLEncoder.encode("json", "UTF-8")); /*xml 또는 json*/
        urlBuilder.append("&" + URLEncoder.encode("numOfRows","UTF-8") + "=" + URLEncoder.encode("100", "UTF-8")); /*한 페이지 결과 수*/
        urlBuilder.append("&" + URLEncoder.encode("pageNo","UTF-8") + "=" + URLEncoder.encode("1", "UTF-8")); /*페이지번호*/
        urlBuilder.append("&" + URLEncoder.encode("year","UTF-8") + "=" + URLEncoder.encode("2020", "UTF-8")); /*측정 연도*/
        urlBuilder.append("&" + URLEncoder.encode("itemCode","UTF-8") + "=" + URLEncoder.encode("PM10", "UTF-8")); /*미세먼지 항목 구분(PM10, PM25), PM10/PM25 모두 조회할 경우 파라미터 생략*/
        //URLEncoder.encode : 한글은 URLEncoding 작업을 해줘야 URL에서 정상적으로 전달이 됨       
        
        //2. URL 객체 생성(urlBuilder을 이용해서)
        URL url = new URL(urlBuilder.toString());
        
        //3. URL 을 이용해서 connection 가져오기
        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
        
        //4. request의 요청방식(method)랑 header 설정
        conn.setRequestMethod("GET");
        conn.setRequestProperty("Content-type", "application/json");
        
        //conn.getResponseCode() : connection을 이용해서 응답코드(response code) 확인 가능
        System.out.println("Response code: " + conn.getResponseCode());
        
        //5. 커넥션에서 inputStream 가져옴 -> BufferdReader로 변환
        //응답코드에 따른 처리(conn.getInputStream())
        BufferedReader rd;
        if(conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
            rd = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        } else {
            rd = new BufferedReader(new InputStreamReader(conn.getErrorStream()));
        }
        
        //6. 5에서 가져온 스트림으로 데이터 한줄씩 읽기(누적시키기)
        //그 rd를 한줄씩 읽어서 line에 누적해서 넣기
        StringBuilder sb = new StringBuilder();
        String line;
        while ((line = rd.readLine()) != null) {
            sb.append(line);
        }
        
        //7. 사용한 자원(스트림, 커넥션) 정리 : rd 자원 반납, 웹사이트랑 연결도 끊기
        rd.close();
        conn.disconnect();
        
        //8. 6에서 누적한 결과 확인
//        System.out.println(sb.toString());
        
        
        return sb.toString();
	}
}

->

0개의 댓글