728x90
📰 공공 데이터
데이터베이스, 전자화된 파일 등으로
공공기관에서 사용할 목적으로 처리된 자료 또는 정보이다.
공공기관에서의 일상적 업무수행의 결과물로 생성 또는 수집/취득한
다양한 형태(텍스트, 이미지, 동영상 등)의 모든 자료이다.
📰 공공 데이터 이용을 위한 세팅 방법
https://www.data.go.kr/
회원가입 후 로그인 → 오픈API 검색 후 활용신청 → 마이페이지 →
인증키 발급현황 → 활용신청 상세기능정보 → 요청정보 세팅 후 미리보기
공공 데이터를 사용하기 위해 발급받은 나만의 인증키이다! (다른사람한테 노출되면 안되니 노출 하지 마시길!)
요청 변수에서 return Type이 xml / json에 따라 다르게 보인다.
📂 OPEN API. 이론
📚 Spring
📗 Air.java
package com.kh.opendata.model.vo;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Getter
@Setter
@ToString
public class Air {
//필드
private String stationName; //측정소명
private String dataTime; //측정일시
private String khaiValue; //통합대기환경수치
private String pm10Value; //미세먼지농도
private String so2Value; //아황산가스농도
private String coValue;//일산화탄소농도
private String no2Value;//이산화질소농도
private String o3Value;//오존농도
}
📗 AirPollutionJavaAppRun.java
package com.kh.opendata.run;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
public class AirPollutionJavaAppRun {
// 발급 받은 인증키 변수 처리
public static final String SERVICEKEY= 나의 인증키;
public static void main(String[] args) throws IOException { // UnsupportedEncodingException의 부모로 예외처리
// OpenAPI 서버로 요청하고자 하는 url 작성
String url ="http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty"; //
url += "?serviceKey="+SERVICEKEY; // 서비스키가 제대로 부여되지 않았을 경우 => SERVICE_KEY_IS_NOT_REGISTERED_ERROR
url += "&sidoName="+URLEncoder.encode("서울","UTF-8");
url += "&returnType=xml";
System.out.println(url);
}
}
📍 발급받은 인증키 변수 처리
📍 OpenAPI 서버로 요청하고자 하는 url 작성
🔮 출력화면
상기 캡쳐 이미지처럼 보인다면 우리는 값을 가져와서 활용할 수 없다.
아래와 같이 한줄로 얻어와야지 활용할 수 있다.
Air(stationName=영등포구, dataTime=2023-08-25 11:00,
khaiValue=62, pm10Value=19, so2Value=0.003, coValue=0.2, no2Value=0.015, o3Value=0.045)
❗ HttpUrlConnection 객체 활용해서 OpenAPI 요청 절차 ❗
1. 요청할 주소를 전달해서 java.net.URL 객체 생성하기
2. 생성된 URL 객체를가지고 HttpUrlConnection 객체 얻어내기
3. 요청 시 필요한 Header 설정하기
4. 해당 OpenAPI 서버로 요청 보낸 후 입력 스트림을 통해 응답데이터 받기
5. 다 사용한 스트림 객체 반납하기
// ** HttpUrlConnection 객체 활용해서 OpenAPI 요청 절차 **
// 1. 요청할 주소를 전달해서 java.net.URL 객체 생성하기
URL requestUrl = new URL(url);
// 2. 생성된 URL 객체를가지고 HttpUrlConnection 객체 얻어내기
HttpURLConnection urlConn = (HttpURLConnection) requestUrl.openConnection();
// 3. 요청 시 필요한 Header 설정하기
urlConn.setRequestMethod("GET");
// 4. 해당 OpenAPI 서버로 요청 보낸 후 입력 스트림을 통해 응답데이터 받기
BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
String responseText = "";
String line;
while ((line = br.readLine()) != null) { // 한줄씩 읽어올 데이터가 있는 동안 반복
// System.out.println(line);
responseText += line;
}
// System.out.println(responseText);
/*
{
"response":
{
"body":
{
"totalCount":40,
"items":
[
{
"so2Grade":"1",
"coFlag":null,
"khaiValue":"52",
"so2Value":"0.003",
"coValue":"0.5",
"pm10Flag":null,
"o3Grade":"1",
"pm10Value":"15",
"khaiGrade":"2",
"sidoName":"서울",
"no2Flag":null,
"no2Grade":"2",
"o3Flag":null,
"so2Flag":null,
"dataTime":"2023-08-23 14:00",
"coGrade":"1",
"no2Value":"0.032",
"stationName":"정릉로",
"pm10Grade":"1",
"o3Value":"0.029"
},
{
"so2Grade":"1",
"coFlag":null,
"khaiValue":"-",
"so2Value":"0.002",
"coValue":"0.5",
"pm10Flag":null,
"o3Grade":"2",
"pm10Value":"3",
"khaiGrade":null,
"sidoName":"서울",
"no2Flag":null,
"no2Grade":"1",
"o3Flag":null,
"so2Flag":null,
"dataTime":"2023-08-23 14:00",
"coGrade":"1",
"no2Value":"0.013",
"stationName":"도봉구",
"pm10Grade":"1",
"o3Value":"0.039"
}, ...
]
}
}
}
*/
// JsonObject,JsonArry이용해서 파싱 할 수 있음(gson 라이브러리)
// Json 데이터를 원하는 데이터만 추출하여 vo에 담기
// 응답데이터 text를 JsonObject화 시키는 작업(파싱)
JsonObject totalObj = JsonParser.parseString(responseText).getAsJsonObject();
// System.out.println(totalObj);
// response 속성 접근
JsonObject responseObj = totalObj.getAsJsonObject("response");
System.out.println("response : " + responseObj);
// body 속성 접근
JsonObject bodyObj = responseObj.getAsJsonObject("body");
System.out.println("body : " + bodyObj);
// totalCount 속성 접근
int totalCount = bodyObj.get("totalCount").getAsInt();
System.out.println("totalCount : " + totalCount);
// items (JsonArry 형태) 속성 접근
JsonArray itemArr = bodyObj.getAsJsonArray("items");
System.out.println("items : " + itemArr);
ArrayList<Air> list = new ArrayList<>();
// items에 담겨 있는 item 객체 하나씩 추출
for (int i = 0; i < itemArr.size(); i++) {
JsonObject item = itemArr.get(i).getAsJsonObject();
System.out.println(item);
Air air = new Air();
air.setStationName(item.get("stationName").getAsString());
air.setDataTime(item.get("dataTime").getAsString());
air.setKhaiValue(item.get("khaiValue").getAsString());
air.setPm10Value(item.get("pm10Value").getAsString());
air.setSo2Value(item.get("so2Value").getAsString());
air.setCoValue(item.get("coValue").getAsString());
air.setNo2Value(item.get("no2Value").getAsString());
air.setO3Value(item.get("o3Value").getAsString());
list.add(air);
}
System.out.println("list:"+list);
// list에 담긴 VO객체 확인
for(Air a : list) {
System.out.println(a);
}
// 5. 다 사용한 스트림 객체 반납하기
br.close();
urlConn.disconnect();
그렇다면 실제 spring을 이용해서 웹에 데이터를 뿌려보자 !
@Controller
public class OpenAPIController {
// 발급 받은 인증키 변수 처리
public static final String SERVICEKEY = "나의 인증키";
// json 형식으로 대기오염 OpenAPI 활용하기
@RequestMapping(value ="air", produces = "application/json; charset=UTF-8")
@ResponseBody
public String airMethod(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 += "&returnType=json"; // 리턴 타입
//url += "&numOfRows="+2;
// 1. 작성된 url 정보를 넣어 URL 객체 생성
URL requestUrl = new URL(url);
// 2. 생성된 URL 객체로 URLConnection 생성
HttpURLConnection urlConn = (HttpURLConnection)requestUrl.openConnection();
// 3. 요청 시 필요한 Header 설정
urlConn.setRequestMethod("GET");
// 4. 해당 OpenAPI 서버로 요청 후 입력 스트림을 통해서 응답데이터 읽어오기
BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
String responseText="";
String line;
while((line= br.readLine())!=null){
responseText+= line;
}
//5. 다사용한 스트림 반납 및 연결 해제
br.close();
urlConn.disconnect();
return responseText;
}
}
📚 Spring
📗 OpenAPIController.java
@Controller
public class OpenAPIController {
// 발급 받은 인증키 변수 처리
public static final String SERVICEKEY = "YJjCL4Rla2nG3z5KHzMBU6fT9ah%2BwAk%2BMCSSotsMaPziDNy2zv4vf%2FnZerx9%2FAKVSTbEtcgQNSoeyDB2l0lF0Q%3D%3D";
// json 형식으로 대기오염 OpenAPI 활용하기
@RequestMapping(value ="air", produces = "application/json; charset=UTF-8")
@ResponseBody
public String airMethod(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 += "&returnType=json"; // 리턴 타입
//url += "&numOfRows="+2;
// 1. 작성된 url 정보를 넣어 URL 객체 생성
URL requestUrl = new URL(url);
// 2. 생성된 URL 객체로 URLConnection 생성
HttpURLConnection urlConn = (HttpURLConnection)requestUrl.openConnection();
// 3. 요청 시 필요한 Header 설정
urlConn.setRequestMethod("GET");
// 4. 해당 OpenAPI 서버로 요청 후 입력 스트림을 통해서 응답데이터 읽어오기
BufferedReader br = new BufferedReader(new InputStreamReader(urlConn.getInputStream()));
String responseText="";
String line;
while((line= br.readLine())!=null){
responseText+= line;
}
//5. 다사용한 스트림 반납 및 연결 해제
br.close();
urlConn.disconnect();
return responseText;
}
}
📗 index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- jQuery $ 쓸 수 잇땅! -->
<script src="https://code.jquery.com/jquery-3.7.0.min.js" integrity="sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g=" crossorigin="anonymous"></script>
<title>대기오염 공공 데이터</title>
</head>
<body>
<h1>실시간 대기 오염 정보</h1>
<br>
<br>
<select id="location">
<option>서울</option>
<option>부산</option>
<option>대전</option>
</select>
<button id="btn1">해당 지역 대기 오염 정보</button>
<br>
<br>
<table border="1" id="result1">
<thead>
<tr>
<th>측정소명</th>
<th>측정일시</th>
<th>통합대기환경수치</th>
<th>미세먼지농도</th>
<th>아황산가스농도</th>
<th>일산화탄소농도</th>
<th>이산화탄소농도</th>
<th>오존농도</th>
</tr>
</thead>
<tbody></tbody>
</table>
<script>
$(function(){
$("#btn1").click(function(){
$.ajax({
url : "air",
data : {location : $("#location").val()},
success : function (data) {
//console.log(data);
//console.log(data.response.body.items)
const itemArr = data.response.body.items;
let value ="";
for(let item of itemArr){
//console.log(item)
value+="<tr>"
+"<td>"+item.stationName +"</td>"
+"<td>"+item.dataTime +"</td>"
+"<td>"+item.khaiValue +"</td>"
+"<td>"+item.pm10Value +"</td>"
+"<td>"+item.so2Value +"</td>"
+"<td>"+item.coValue +"</td>"
+"<td>"+item.no2Value +"</td>"
+"<td>"+item.o3Value +"</td>"
+"</tr>"
}
$("#result1 > tbody").html(value);
}, error : function () {
console.log("통신 실패");
}
})
})
})
</script>
</body>
</html>
728x90
'ON > spring' 카테고리의 다른 글
[ Spring ] 게시글 수정 ⑫ (0) | 2023.08.29 |
---|---|
[ Spring ] 게시글 작성(제목+내용+사진) ⑪ (0) | 2023.08.28 |
[ Spring ] 프로필 이미지 추가 | 변경 | 삭제 ⑨ (1) | 2023.08.24 |
[ Spring ] 게시글 상세 좋아요 | 조회수 ⑧ (0) | 2023.08.23 |
[ Spring ] 게시글 상세 조회 ⑦ (1) | 2023.08.22 |