[JAVA] 동네예보 조회서비스 API 사용 방법

동네예보 조회서비스

동네예보 정보를 조회하기 위해 공공데이터 포털 사이트의 동네예보 조회서비스 API 사용 방법에 대해 알아보겠습니다.

Open API 활용 방법

  • 동네예보 조회서비스 사이트에서 활용신청을 하고 Service Key를 발급받는다.
  • 오픈 API 활용 가이드를 다운로드하여 조회 조건 및 결과 데이터를 이해한다.

동네예보 데이터 조회

1
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 형식)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
{
"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
}
}
}

1) Respone Domain 생성

기본적으로 결과가 JSON 형식이므로 그에 맞게 도메인을 생성하였다.
조회 서비스 마다 결과 데이터의 items 부분이 다르므로 기본 구조 도메인과 Item 도메인을 분리해서 생성하였다.

1
2
3
4
5
6
7
8
import lombok.Data;

@Data
public class ApiData {

private Response response;

}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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;
}
}
}

2) 데이터 조회

데이터 조회 시 주의해야 할 점은 시간을 3시간 단위로 설정해야 한다. 오전 02시부터 3시간 단위로 증가해서 시간을 설정한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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();
}
}

3) 결과 확인

정상적으로 동네예보 데이터들이 조회되면 데이터들을 가공해서 사용하도록 한다.

Share