미세먼지는 아픈 손가락이에요 ..
포스팅을 할 때 A와 B로 Back과 Front로 계획했습니다만, 미세먼지는 좀 더 복잡하여 한 파트 더 글 작성을 하겠습니다.
제일 중요한 부분만 보여드리겠습니다.
package com.project.airquality;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
//import java.util.List;
//
//import javax.xml.parsers.DocumentBuilderFactory;
//
//import org.json.simple.JSONObject;
//import org.json.simple.parser.JSONParser;
//
//import com.project.dust.dustDTO;
import java.util.List;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.stereotype.Service;
import java.io.BufferedReader;
import java.io.IOException;
//시도별 실시간 측정정보 조회
//https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15073861
//요청주소 http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty
//서비스URL http://apis.data.go.kr/B552584/ArpltnInforInqireSvc
@Service
public class AirqualityAPIPull {
public String GetAPIDataDust() throws IOException {
StringBuilder urlBuilder = new StringBuilder(
"http://apis.data.go.kr/B552584/ArpltnInforInqireSvc/getCtprvnRltmMesureDnsty"); /* URL */
urlBuilder.append("?" + URLEncoder.encode("serviceKey", "UTF-8")
+ "=serviceKey"); /*
* 서비스
*/
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("sidoName", "UTF-8") + "=" + URLEncoder.encode("제주",
"UTF-8")); /*
* 시도 이름(전국, 서울, 부산, 대구, 인천, 광주, 대전, 울산, 경기, 강원, 충북, 충남, 전북, 전남, 경북, 경남, 제주, 세종)
*/
urlBuilder.append(
"&" + URLEncoder.encode("ver", "UTF-8") + "=" + URLEncoder.encode("1.0", "UTF-8")); /* 버전별 상세 결과 참고 */
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
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 sb = new StringBuilder();
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
rd.close();
conn.disconnect();
return sb.toString();
}
public List<AirqualityDTO> DataSaveDust(String result) {
// Json parser를 만들어 만들어진 문자열 데이터를 객체화
List<AirqualityDTO> dustList = new ArrayList<AirqualityDTO>();
JSONParser parser = new JSONParser();
JSONObject obj;
try {
obj = (JSONObject) parser.parse(result);
// response 키를 가지고 데이터를 파싱
JSONObject parse_response = (JSONObject) obj.get("response");
// response 로 부터 body 찾기
JSONObject parse_body = (JSONObject) parse_response.get("body");
// body 로 부터 items 찾기
JSONArray parse_items = (JSONArray) parse_body.get("items");
String category;
JSONObject data; // parse_item은 배열형태이기 때문에 하나씩 데이터를 하나씩 가져올때 사용
// 카테고리와 값만 받아오기
String dataTime = ((JSONObject) parse_items.get(0)).get("dataTime").toString();
for (int i = 0; i < parse_items.size(); i++) {
AirqualityDTO dust = new AirqualityDTO();
data = (JSONObject) parse_items.get(i);
Object pm10Value = data.get("pm10Value");
Object pm25Value = data.get("pm25Value");
Object stationName = data.get("stationName");
dust.setPm10value((String) pm10Value);
dust.setPm25value((String) pm25Value);
dust.setStationname((String) stationName);
dust.setDatatime(dataTime);
dustList.add(dust);
}
} catch (ParseException e) {
e.printStackTrace();
}
return dustList;
}
}
공공데이터에 있는 코드에서 수정해서 사용했고 xml은 손대기 번거로워서 json으로 받아올 수 있게 작업하였습니다.
https://www.data.go.kr/tcs/dss/selectApiDataDetailView.do?publicDataPk=15073861
한국환경공단_에어코리아_대기오염정보
각 측정소별 대기오염정보를 조회하기 위한 서비스로 기간별, 시도별 대기오염 정보와 통합대기환경지수 나쁨 이상 측정소 내역, 대기질(미세먼지/오존) 예보 통보 내역 등을 조회할 수 있다.
www.data.go.kr
밑에 있는 건 검색해도 정보 없어서 위에 있는 걸로 다시 사용했고, 여기서 '시도별 측정정보조회'로 봤습니다.
시를 '제주'로 설정하여, 제주도에 있는 13곳의 미세먼지 측정소 값을 가져오게 하였습니다.
측정소명 / 업데이트 시간 (미세먼지 API는 1시간에 한 번씩 받을 수 있습니다) / 미세먼지 / 초미세먼지 순입니다.
이렇게 가져온 가져온 데이터를 가공하여 사이트에 뿌릴 수 있게 하였는데요,
https://www.jejudatahub.net/data/view/data/895
제주데이터허브
www.jejudatahub.net
제주데이터허브를 통해서 측정소의 정보를 가져왔습니다만,
실제로 API로 받아오는 측정소 값은 총 13개, 하지만 제주데이터허브에서는 9개 ..
수기로 미세먼지 측정소의 위치를 찾는 작업을 하였고, 구글 맵을 통해서 측정소의 위치를 경도와 위도로 바꿨습니다만,
제주도는 .. 가로가 더 긴 섬이잖아요 .. ?
그래서 경도와 위도를 x와 y로 바꾸는 작업도 하였습니다 .. (흘러내리는 눈물)
밑작업은 이 정도 했고 목요일엔 좀 더 상세한 미세먼지 API Back 작업 부분을 보여드리겠습니다 ~! (. ❛ ᴗ ❛.)
'coding > Java' 카테고리의 다른 글
웹서비스 백엔드 개발자 과정 수료 후기 - 8 (API/미세먼지C) (0) | 2023.02.10 |
---|---|
웹서비스 백엔드 개발자 과정 수료 후기 - 7 (API/미세먼지B) (0) | 2023.02.09 |
웹서비스 백엔드 개발자 과정 수료 후기 - 5 (게시판/FAQ B) (0) | 2023.02.05 |
웹서비스 백엔드 개발자 과정 수료 후기 - 4 (게시판/FAQ A) (0) | 2023.02.04 |
웹서비스 백엔드 개발자 과정 수료 후기 - 3 (게시판/공지사항B) (0) | 2023.02.03 |