API 연동
Open API를 통해 http 통신을 하는 솔루션이 주어졌다. 서버와 네트워킹을 하기 전 API 규약에 대해 알아두어야 할 필요성이 있었기에 해당 과제를 수행하였다.
기상청의 일 기상자료를 조회 서비스의 Open API를 이용하여 어제의 최고 기온, 최저 기온, 평균 기온 등을 받아온 뒤 평균 기온의 구간에 따라 다른 이미지를 출력하는 서비스이다.
(최초의 계획으로는 오늘의 기온을 받아오려고 했지만 해당 서비스를 제공하는 적당한 API가 존재하지 않아 어제의 기온을 받아오는 앱 서비스로 계획을 변경하였다.)
기상청 정보 출력 서비스
1. 데이터 선정 및 상세 정보 확인
가장 먼저 공공 데이터 포털(https://www.data.go.kr/index.do)에서 원하는 데이터를 찾아서 활용 신청을 하였다.
내가 사용한 Open API는 "기상청_지상 일자료 조회 서비스"이다. 해당 서비스에서는 조회조건(지점 번호, 시간)으로 기상관측일자료 데이터(온도, 습도 등)를 조회 가능하다.

2. 데이터 상세 정보 확인
데이터를 활용하기 이전에 사전 단계로 Postman을 사용하여 서비스가 어떤 데이터를 제공하는지 데이터 상세 정보를 확인해 주었다. Open API 활용 가이드를 참고한 뒤 Postman을 이용하여 데이터 출력을 진행하였다.

Postman의 request URL와 요청 메시지에 필요한 파라메타들을 GET 방식으로 작성해 준 뒤, Send 버튼을 통한 쿼리를 돌려 JSON 코드를 얻었다. JSON 코드를 보면 지점 번호(서울로 지정)와 시간(2023년 01월 01일부터 2023년 01월 02일)에 따른 평균기온(avgTa), 최저기온(minTa), 최고기온(maxTa) 등을 확인할 수 있다.
응답 메시지의 더 자세한 정보는 Open API 활용 가이드를 참고하면 된다.

// JSON 코드
{
"response": {
"header": {
"resultCode": "00",
"resultMsg": "NORMAL_SERVICE"
},
"body": {
"dataType": "JSON",
"items": {
"item": [
{
"stnId": "108",
"stnNm": "서울",
"tm": "2023-01-01",
"avgTa": "-0.2",
"minTa": "-4.3",
"minTaHrmt": "2350",
"maxTa": "3.8",
"maxTaHrmt": "1343",
"mi10MaxRn": "",
"mi10MaxRnHrmt": "",
"hr1MaxRn": "",
"hr1MaxRnHrmt": "",
"sumRnDur": "",
"sumRn": "",
"maxInsWs": "8.1",
"maxInsWsWd": "290",
"maxInsWsHrmt": "1406",
"maxWs": "5.3",
"maxWsWd": "320",
"maxWsHrmt": "2135",
"avgWs": "2.7",
"hr24SumRws": "2314",
"maxWd": "270",
"avgTd": "-8.7",
"minRhm": "28",
"minRhmHrmt": "1656",
"avgRhm": "54.5",
"avgPv": "3.3",
"avgPa": "1019.8",
"maxPs": "1033.2",
"maxPsHrmt": "2253",
"minPs": "1028.6",
"minPsHrmt": "0137",
"avgPs": "1030.8",
"ssDur": "9.6",
"sumSsHr": "9.0",
"hr1MaxIcsrHrmt": "1200",
"hr1MaxIcsr": "1.87",
"sumGsr": "10.81",
"ddMefs": "",
"ddMefsHrmt": "",
"ddMes": "",
"ddMesHrmt": "",
"sumDpthFhsc": "",
"avgTca": "1.3",
"avgLmac": "1.1",
"avgTs": "-1.4",
"minTg": "-8.1",
"avgCm5Te": "-0.2",
"avgCm10Te": "-0.5",
"avgCm20Te": "-0.5",
"avgCm30Te": "0.6",
"avgM05Te": "2.8",
"avgM10Te": "6.3",
"avgM15Te": "10.1",
"avgM30Te": "15.9",
"avgM50Te": "18.0",
"sumLrgEv": "",
"sumSmlEv": "",
"n99Rn": "",
"iscs": "{연무}0125-{연무}{강도0}0300-0450. {연무}0550-{연무}{강도0}0600-{연무}{강도0}0900-1030.",
"sumFogDur": ""
},
{
"stnId": "108",
"stnNm": "서울",
"tm": "2023-01-02",
"avgTa": "-4.5",
"minTa": "-7.4",
"minTaHrmt": "0804",
"maxTa": "-0.4",
"maxTaHrmt": "1525",
"mi10MaxRn": "",
"mi10MaxRnHrmt": "",
"hr1MaxRn": "",
"hr1MaxRnHrmt": "",
"sumRnDur": "",
"sumRn": "",
"maxInsWs": "7.4",
"maxInsWsWd": "250",
"maxInsWsHrmt": "1501",
"maxWs": "4.4",
"maxWsWd": "290",
"maxWsHrmt": "1307",
"avgWs": "2.5",
"hr24SumRws": "2176",
"maxWd": "270",
"avgTd": "-14.6",
"minRhm": "32",
"minRhmHrmt": "1543",
"avgRhm": "45.9",
"avgPv": "2.0",
"avgPa": "1021.0",
"maxPs": "1034.0",
"maxPsHrmt": "1005",
"minPs": "1030.3",
"minPsHrmt": "1521",
"avgPs": "1032.2",
"ssDur": "9.6",
"sumSsHr": "9.1",
"hr1MaxIcsrHrmt": "1200",
"hr1MaxIcsr": "1.99",
"sumGsr": "11.63",
"ddMefs": "",
"ddMefsHrmt": "",
"ddMes": "",
"ddMesHrmt": "",
"sumDpthFhsc": "",
"avgTca": "0.0",
"avgLmac": "0.0",
"avgTs": "-4.2",
"minTg": "-13.4",
"avgCm5Te": "-0.9",
"avgCm10Te": "-1.0",
"avgCm20Te": "-0.5",
"avgCm30Te": "0.6",
"avgM05Te": "2.7",
"avgM10Te": "6.2",
"avgM15Te": "9.9",
"avgM30Te": "15.8",
"avgM50Te": "17.9",
"sumLrgEv": "",
"sumSmlEv": "",
"n99Rn": "",
"iscs": "",
"sumFogDur": ""
}
]
},
"pageNo": 1,
"numOfRows": 10,
"totalCount": 2
}
}
}
어려웠던 점
Postman으로 데이터를 가져올 때 요청 메시지에 필요한 파라메타들을 모두 제대로 적어주었는데 이상하게 Internal Server Error(Status 500)가 일어났다.
구글링 해서 찾아본 다른 사람들의 해결 방안을 통해 인증키도 다시 확인해 보고 Headers에 Content-Type으로 application/json도 추가해 주었지만 해결되지 않았다.
알고 보니 request URL에 Call Back URL (http://apis.data.go.kr/1360000/AsosDalyInfoService/getWthrDataList)을 적어주어야 하는데 서비스 URL (http://apis.data.go.kr/1360000/AsosDalyInfoService)을 적어주어서 생기는 문제였다.

+) 2023-01-05 업데이트
Open API 활용 가이드에 요청 메시지 예시도 적혀 있었다.. 제대로 읽고 프로그래밍하자
