고래씌

[Open API] 1-1. 대기오염정보 공공데이터를 이용한 실습 본문

공공데이터 활용/Open API

[Open API] 1-1. 대기오염정보 공공데이터를 이용한 실습

고래씌 2024. 2. 1. 12:30

1. 대기오염정보 공공데이터를 이용한 실습

 

 

=> 우리는 이 데이터를 이용하여 실습할 예정이다.

 

 

 

=> 활용신청 클릭하여 활용신청하기

 

1) 마이페이지 들어가서 개인 API에 있는 인증키 복사 클릭(Encoding) 

 

=> 인증키는 앞으로 많이 사용할 예정이다!

 

 

=> 대기질 예보통보 조회를 볼경우 저 getMinDustFrcstDspth로 요청을 보내야하고 목록마다 다 요청주소가 다르다!

=> 우선 url로 요청한다! 

=> 요청주소를 복사하여 ?serviceKey=인증키   를 치면 데이터를 불러오는 것을 확인할 수 있다

=> 이것은 브라우저상에서 요청을 보내는 방법이라서 우리는 자바로 보내도록 할 것이다

=> 뒤에 ?retunrType=json 을 붙이면 JSON형식으로 받을 수 있다.

 

 

 

=> index.jsp 파일 생성

 

 

▶ index.jsp

- EL 표현식을 사용하지 않을 것이기 때문에 추가

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8" isELIgnored="true"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
	<h2>실시간 대기오염정보</h2>
	
	지역 : 
	<select id="location">
		<option>서울</option>
		<option>부산</option>
		<option>대전</option>
		<option>대구</option>
		<option>경기</option>
	</select>
	
	<button id="btn1">실시간 대기오염정보 확인</button>
	
	<button id="btn2">실시간 대기오염정보 확인(xml방식)</button>
	
	<table id="result1" border="1" align="center">
		<thead>
			<tr>
				<th>측정소명</th>
				<th>측정시간</th>
				<th>통합대기환경수치</th>
				<th>미세먼지농도</th>
				<th>일산화탄소농도</th>
				<th>이산화질소농도</th>
				<th>아황산가스농도</th>
				<th>오존농도</th>
			</tr>
		</thead>
		<tbody>
		
		</tbody>
		
	</table>


</body>
</html>

 

 

 

 

- AirVo.java class 파일 생성

 

 

 

▶ AirVo.java

 

=> 여기에 출력결과에 나오는 키값이 모두 일치해야한다!!

 

package com.kh.opendata.model.vo;

public class AirVo {
	
	private String stationName;   // 측정소명
	private String dataTime;      // 측정일시
	private String khaiValue;    // 통합대기환경수치
	
	private String pm10Value; // 미세먼지(10pm) 농도
	private String so2Value;  // 아황산가스 농도
	private String coValue;  // 일산화탄소 농도
	private String no2Value;  // 이산화질소 농도
	private String o3Value;  // 오존 농도
	
	public AirVo() {
		
	}

	public AirVo(String stationName, String dataTime, String khaiValue, String pm10Value, String so2Value,
			String coValue, String no2Value, String o3Value) {
		super();
		this.stationName = stationName;
		this.dataTime = dataTime;
		this.khaiValue = khaiValue;
		this.pm10Value = pm10Value;
		this.so2Value = so2Value;
		this.coValue = coValue;
		this.no2Value = no2Value;
		this.o3Value = o3Value;
	}

	public String getStationName() {
		return stationName;
	}

	public void setStationName(String stationName) {
		this.stationName = stationName;
	}

	public String getDataTime() {
		return dataTime;
	}

	public void setDataTime(String dataTime) {
		this.dataTime = dataTime;
	}

	public String getKhaiValue() {
		return khaiValue;
	}

	public void setKhaiValue(String khaiValue) {
		this.khaiValue = khaiValue;
	}

	public String getPm10Value() {
		return pm10Value;
	}

	public void setPm10Value(String pm10Value) {
		this.pm10Value = pm10Value;
	}

	public String getSo2Value() {
		return so2Value;
	}

	public void setSo2Value(String so2Value) {
		this.so2Value = so2Value;
	}

	public String getCoValue() {
		return coValue;
	}

	public void setCoValue(String coValue) {
		this.coValue = coValue;
	}

	public String getNo2Value() {
		return no2Value;
	}

	public void setNo2Value(String no2Value) {
		this.no2Value = no2Value;
	}

	public String getO3Value() {
		return o3Value;
	}

	public void setO3Value(String o3Value) {
		this.o3Value = o3Value;
	}

	@Override
	public String toString() {
		return "AirVo [stationName=" + stationName + ", dataTime=" + dataTime + ", khaiValue=" + khaiValue
				+ ", pm10Value=" + pm10Value + ", so2Value=" + so2Value + ", coValue=" + coValue + ", no2Value="
				+ no2Value + ", o3Value=" + o3Value + "]";
	}
	
}

 

 

- AirPollutionTest.java 파일 생성

 

 

 AirPollutionTest.java

 

=> serviceKey와 sidoName이 필수로 들어가야하기 때문에 추가해야한다!

 

 

package com.kh.opendata.model.run;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;

import org.junit.Test;

import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.kh.opendata.model.vo.AirVo;

public class AirPollutionTest {
		
	// 한국환경공단_에어코리아_대기오염정보중 시도정보
	public static final String serviceKey = "인증키"; // 본인의 인증키 복붙
	
	
	public String[] locations = {"전국","서울","부산","대구","인천","광주","대전","울산","경기","강원","충북",
            "충남","전북","전남","경북","경남","제주","세종"};
	
	@Test  // 이것을 사용하면 테스트 해볼 수 있다!
	public void locationTestRun() throws IOException{
		for(String location : locations) {
			testRun(location); // 각 지역별로 요청을 보냄
		}
	}
	
	public void testRun(String location) throws IOException{
		
		// OPENAPI서버로 요청할 URL주소 설정
		// 요청주소 복사하여 붙여놓기
		String url = "http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty";
		
		url += "?serviceKey="+ serviceKey;
		url += "&sidoName="+ URLEncoder.encode(location, "UTF-8");  // 이게 url상에서는 깨져서 url방식으로 인코딩해주어야한다.
		url += "&returnType=json"; // JSON 형식으로 받고싶다면
		url += "&numOfRows=50";  // 반환받는 결과값 개수
		
		
		// URL 객체정보
		// 1. 요청하고자하는 url주소를 매개변수로 전달하면서 URL 객체 생성
		URL requestUrl = new URL(url); 
		
		// 2. 생성된 URL을 통해 httpUrlConnection객체 생성
		HttpURLConnection urlConnection = (HttpURLConnection) requestUrl.openConnection();
		
		// 3. 전송방식설정   // 자바에서 직접 요청을 보낼경우 header정보를 직접설정해서 보내야함!
		urlConnection.setRequestMethod("GET");
		
		// 4. 요청주소에 적힌 openAPI서버로 요청 보내기
		// 값을 얻을수있는 stream을 새로 얻어옴
		BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));  // 읽기, 출력 향상 목적으로 만들어진 보조스트림
		
		String responseText = "";
		
		String line;
		
		while((line = br.readLine()) != null) {
			System.out.println(line);  // 현재 입력받은 line값 출력
			responseText += line;
		}
		
//		System.out.println(responseText);
		
		
		// responseText에서 원하는 데이터만 추출하여 vo클래스로 전환
		// responseText에서 원하는 데이터만 추출해서 json으로 담아주는 코드
		JsonObject totalObj = JsonParser.parseString(responseText).getAsJsonObject(); // 문자열로 된 데이터를 파싱해서 JsonObject로 만듦
		
		JsonObject response = totalObj.getAsJsonObject("response");  // jsonOjbect에서 response 해당하는 객체값을 얻어옴
		
		JsonObject body = response.getAsJsonObject("body"); // body에 해당하는 값을 담겨옴 -> JsonObject로 반환이 됨
		
		int totalCount = body.get("totalCount").getAsInt();  // 문자열 형태로 가져오고 int자료형으로 꺼내옴
		
		JsonArray items =body.getAsJsonArray("items");  // body 내에서 items라는 키값을 찾아서 꺼내옴.(JsonArray로)
		
		ArrayList<AirVo> list = new ArrayList(); 
		
		if(items != null) {
			for(int i=0; i<items.size(); i++) {   // JsonArray를 값 하나하나 꺼내면서 
				JsonObject obj = items.get(i).getAsJsonObject();
//				System.out.println(obj);
				
				AirVo air = new AirVo();
				
				air.setStationName(obj.get("stationName").getAsString()); // 문자열 형태로 얻어옴
				
				if(!obj.get("dataTime").isJsonNull()) { // null값이 있는 경우 오류가 발생해서 묶어줌
					air.setDataTime(obj.get("dataTime").getAsString()); 
					
					air.setCoValue(obj.get("coValue").getAsString());
					air.setKhaiValue(obj.get("khaiValue").getAsString());
					air.setPm10Value(obj.get("pm10Value").getAsString());
					air.setSo2Value(obj.get("so2Value").getAsString());
					air.setNo2Value(obj.get("no2Value").getAsString());
					air.setO3Value(obj.get("o3Value").getAsString());
				}
				
				list.add(air);
			}
		}
		
		for(AirVo a : list) {
			System.out.println(a);
		}
		
		br.close();
		urlConnection.disconnect(); // 연결종료
	}
}

 

 

- ctrl+F11눌러서 JUnit Test를 클릭하여 실행! 에러가 안나는지 확인해본다.

 

 

 

=> 값이 정상적으로 출력되는 것을 확인

=> 이코드는 실제 자바에 소스코드를 추가하면 된다!