[JAVA] 동네예보 조회서비스 API 사용 방법Language/Java2022. 9. 12. 21:51
Table of Contents
반응형
동네예보 조회서비스
동네예보 정보를 조회하기 위해 공공데이터 포털 사이트의 동네예보 조회서비스 API 사용 방법에 대해 알아보겠습니다.
Open API 활용 방법
- 동네예보 조회서비스 사이트에서 활용신청을 하고 Service Key를 발급받습니다.
- 오픈 API 활용 가이드를 다운로드하여 조회 조건 및 결과 데이터를 이해합니다.
동네예보 데이터 조회
http://apis.data.go.kr/1360000/VilageFcstInfoService/getVilageFcst?ServiceKey={발급받은 Service Key}&pageNo=1&numOfRows=10&dataType=JSON&base_date={현재날짜}&base_time={현재시간}&nx={지점 X 좌표값}&ny={지점 Y 좌표값}
결과 데이터(JSON 형식)
{
"response": {
"header": {
"resultCode": "00",
"resultMsg": "NORMAL_SERVICE"
},
"body": {
"dataType": "JSON",
"items": {
"item": [
{
"baseDate": "20200807",
"baseTime": "0800",
"category": "POP",
"fcstDate": "20200807",
"fcstTime": "1200",
"fcstValue": "80",
"nx": 76,
"ny": 122
},
{
"baseDate": "20200807",
"baseTime": "0800",
"category": "PTY",
"fcstDate": "20200807",
"fcstTime": "1200",
"fcstValue": "1",
"nx": 76,
"ny": 122
},
{
"baseDate": "20200807",
"baseTime": "0800",
"category": "R06",
"fcstDate": "20200807",
"fcstTime": "1200",
"fcstValue": "9",
"nx": 76,
"ny": 122
},
{
"baseDate": "20200807",
"baseTime": "0800",
"category": "REH",
"fcstDate": "20200807",
"fcstTime": "1200",
"fcstValue": "85",
"nx": 76,
"ny": 122
},
{
"baseDate": "20200807",
"baseTime": "0800",
"category": "S06",
"fcstDate": "20200807",
"fcstTime": "1200",
"fcstValue": "0",
"nx": 76,
"ny": 122
},
{
"baseDate": "20200807",
"baseTime": "0800",
"category": "SKY",
"fcstDate": "20200807",
"fcstTime": "1200",
"fcstValue": "4",
"nx": 76,
"ny": 122
},
{
"baseDate": "20200807",
"baseTime": "0800",
"category": "T3H",
"fcstDate": "20200807",
"fcstTime": "1200",
"fcstValue": "24",
"nx": 76,
"ny": 122
},
{
"baseDate": "20200807",
"baseTime": "0800",
"category": "UUU",
"fcstDate": "20200807",
"fcstTime": "1200",
"fcstValue": "-1.1",
"nx": 76,
"ny": 122
},
{
"baseDate": "20200807",
"baseTime": "0800",
"category": "VEC",
"fcstDate": "20200807",
"fcstTime": "1200",
"fcstValue": "127",
"nx": 76,
"ny": 122
},
{
"baseDate": "20200807",
"baseTime": "0800",
"category": "VVV",
"fcstDate": "20200807",
"fcstTime": "1200",
"fcstValue": "0.9",
"nx": 76,
"ny": 122
}
]
},
"pageNo": 1,
"numOfRows": 10,
"totalCount": 216
}
}
}
Respone Domain 생성
기본적으로 결과가 JSON 형식이므로 그에 맞게 도메인을 생성하였습니다.
조회 서비스 마다 결과 데이터의 items 부분이 다르므로 기본 구조 도메인과 Item 도메인을 분리해서 생성하였습니다.
import lombok.Data;
@Data
public class ApiData {
private Response response;
}
import java.util.List;
import lombok.Data;
@Data
public class Response {
private Header header;
private Body body;
@Data
public static class Header {
private int resultCode;
private String resultMsg;
}
@Data
public static class Body {
/** 데이터 타입 */
private String dataType;
/** 한 페이지 결과 수 */
private int numOfRows;
/** 페이지 번호 */
private int pageNo;
/** 전체 결과 수 */
private int totalCount;
private Items items;
}
@Data
public static class Items {
private List<VilageFcst> item;
}
}
import lombok.Data;
/**
* 동네예보 서비스 도메인
* @author hgko
*
*/
@Data
public class VilageFcst {
/** 발표일자 */
private String baseDate;
/** 발표시각 */
private String baseTime;
/** 예보일자 */
private String fcstDate;
/** 예보시각 */
private String fcstTime;
/** 자료구분문자 */
private CategoryType category;
/** 예보 값 */
private float fcstValue;
/** 예보지점 X 좌표 */
private float nx;
/** 예보지점 Y 좌표 */
private float ny;
/**
* 코드값 정보
*/
@Getter
public enum CategoryType {
POP("강수확률", "강수확률"),
R06("6시간 강수량", "범주 (1 mm)"),
S06("6시간 신적설", "범주 (1 cm)"),
SKY("하늘상태", "코드값"),
T3H("3시간 기온", "℃"),
TMN("아침 최저기온", "℃"),
TMX("낮 최저기온", "℃"),
WAV("파고", "M"),
T1H("기온", "℃"),
RN1("1시간 강수량", "mm"),
UUU("동서바람성분", "m/s"),
VVV("남북바람성분", "m/s"),
REH("습도", "%"),
PTY("강수형태", "코드값"),
VEC("풍향", "m/s"),
WSD("풍속", "1");
private String name;
private String unit;
private CategoryType(String name, String unit) {
this.name = name;
this.unit = unit;
}
}
}
데이터 조회
데이터 조회 시 주의해야 할 점은 시간을 3시간 단위로 설정해야 합니다. 오전 02시부터 3시간 단위로 증가해서 시간을 설정합니다.
private final String BASE_URL = "http://apis.data.go.kr/1360000/VilageFcstInfoService/getVilageFcst";
private final String serviceKey = ""; /*공공데이터포털에서 받은 인증키*/
public void getVilageFcst() {
try {
StringBuilder urlBuilder = new StringBuilder(BASE_URL);
urlBuilder.append("?" + URLEncoder.encode("ServiceKey", "UTF-8") + "=" + serviceKey);
urlBuilder.append("&" + URLEncoder.encode("pageNo", "UTF-8") + "=" + URLEncoder.encode("1", "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("numOfRows", "UTF-8") + "=" + URLEncoder.encode("10", "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("dataType", "UTF-8") + "=" + URLEncoder.encode("JSON", "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("base_date", "UTF-8") + "=" + URLEncoder.encode("20200807", "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("base_time", "UTF-8") + "=" + URLEncoder.encode("1100", "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("nx", "UTF-8") + "=" + URLEncoder.encode("76", "UTF-8"));
urlBuilder.append("&" + URLEncoder.encode("ny", "UTF-8") + "=" + URLEncoder.encode("122", "UTF-8"));
URL url = new URL(urlBuilder.toString());
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
conn.setRequestProperty("Content-type", "application/json");
System.out.println("Response code: " + conn.getResponseCode());
if (conn.getResponseCode() >= 200 && conn.getResponseCode() <= 300) {
StringBuilder sb = new StringBuilder();
BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
in.lines().forEach(line -> {
sb.append(line);
});
in.close();
conn.disconnect();
System.out.println(sb.toString());
setWeatherInfo(sb.toString());
}
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 동네예보 데이터 파싱
* @param json
*/
private void setWeatherInfo(String json) {
try {
ObjectMapper objectMapper = new ObjectMapper();
ApiData data = objectMapper.readValue(json, ApiData.class);
Items items = data.getResponse().getBody().getItems();
for (VilageFcst item : items.getItem()) {
if (item.getCategory() == CategoryType.T3H) {
} else if (item.getCategory() == CategoryType.REH) {
} else if (item.getCategory() == CategoryType.SKY) {
} else if (item.getCategory() == CategoryType.PTY) {
}
}
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (JsonProcessingException e) {
e.printStackTrace();
}
}
결과 확인
정상적으로 동네예보 데이터들이 조회되면 데이터들을 가공해서 사용하도록 합니다.
반응형
'Language > Java' 카테고리의 다른 글
[JAVA] 날짜 비교 (0) | 2022.09.23 |
---|---|
[JAVA] String형 Bytes length 구하기 (0) | 2022.09.22 |
[JAVA] 농업기상정보 서비스 API 사용 방법 (0) | 2022.09.11 |
[JAVA] OpenWeather API 사용 방법 (0) | 2022.09.11 |
[JAVA] proj4 투형 변환 (0) | 2022.09.11 |
@고지니어스 :: 규니의 개발 블로그
IT 기술과 개발 내용을 포스팅하는 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!