13. WeatherApp - ViewModel
01.
01.1
프로그램은, 데이터와 로직으로 이루어집니다.
C언어에서 단수 자료형과, 간단한 로직으로 프로그램을 만들었습니다.
Model은 자료형입니다. ViewModel은 로직입니다.
복잡한 로직,
프로그램 외부와 데이터(DB, TCP/IP, Serial 등)를 주고받는 로직
모두 ViewModel에서 처리됩니다.
02. ViewModel 폴더 생성
![](https://blog.kakaocdn.net/dn/cqbvaj/btsKWo82buT/BuaZA4vKbub41ZEGddfFCK/img.png)
학습 과정에서 ViewModel을 확실하게 구분하기 위해 ViewModel 폴더를 만듭니다.
ViewModel 폴더와 ViewModel.Helpers 폴더를 만듭니다.
03. ViewModel.Helpers
![](https://blog.kakaocdn.net/dn/bQwXvt/btsKVIz0N7S/8ex0dKiHRVZltXY8jKDzi0/img.png)
ViewModel.Helpers 폴더의 AccuWeatherHelpers.cs 에서는,
외부 API 데이터를 Request 하거나, DB 로직을 구현합니다.
04. AutoComplete API
![](https://blog.kakaocdn.net/dn/b6eCsS/btsKWI7hqXe/JDe1Oh3F52A2p60ERHnewk/img.png)
❶ API Reference 에서, ❷ Location API 메뉴를 찾습니다.
이 메뉴에서 AccuWeather 에서 "지역명"을 검색시, 해당 지역 코드를 찾을 수 있습니다.
![](https://blog.kakaocdn.net/dn/cwc4dR/btsKWo82PJX/yolUt58tbOGQ9ySbK0gw61/img.png)
Location API > ❸ AutoComplete > ❹ AutoComplete search 로 이동합니다.
![](https://blog.kakaocdn.net/dn/ch6fuI/btsKV1e7Gfc/xPaLYkOkNVnprxAYXSOMPk/img.png)
❺ 개인 API Key, 지역명, 언어 를 차례로 입력하고, ❻ Request 요청을 보내면,
❼ 하단에 cURL 을 확인 할 수 있습니다.
WPF 프로젝트의 ViewModel 에서 API Request(요청)할 때 사용 할 URL 입니다.
해당 URL을 Request 하면, Json 형태의 결과물을 Response로 돌려받습니다.
해당 요청은 '도시 이름'을 전달하고, AccuWeather API의 도시 코드 및 관련 데이터를 찾는데 사용됩니다.
cURL을 복사해서 메모장에 저장해놓습니다.
05. Current Conditions API
![](https://blog.kakaocdn.net/dn/lgFwJ/btsKVdgBji1/gFTNQvjpNHCqmQ6BZkuFjk/img.png)
❶ API Reference 에서, ❷ Current Conditions API 메뉴를 찾습니다.
이 메뉴에서, AccuWeather 에서 "상세 날씨"를 정보를 확인할 수 있습니다.
![](https://blog.kakaocdn.net/dn/6uhKa/btsKWaDd7uy/M6gaoRBTOl6vHAv2o0D7kk/img.png)
❸ Current Conditions > ❹ Current Conditions 로 이동합니다.
![](https://blog.kakaocdn.net/dn/biYZo0/btsKW9Kkvlq/GcrjLXaL3tZjsxxjebqwS0/img.png)
❺ 이전 단계에서 찾은 지역코드와,
❻ 개인 API Key, 언어 를 차례로 입력하고,
❼ Request 요청을 보내면,
❽ 하단에 cURL 을 확인 할 수 있습니다.
WPF 프로젝트의 ViewModel 에서 API Request(요청)할 때 사용 할 URL 입니다.
❾ 해당 URL을 Request 하면, Response로 요청한 도시의 "날씨 상세 정보"를 Json 형태의 결과물을 돌려받습니다.
cURL을 복사해서 메모장에 저장해놓습니다.
06. URL
![](https://blog.kakaocdn.net/dn/BXPD7/btsKXXDHCZa/u22rpn3zNnbRWNjQjqmxs0/img.png)
❶ AUTOCOMPLETE
apikey=
&q=
&language=
❷ CURRENTCODITIONS
apikey=
&language=
API_KEY, Query(요청), Language(언어) 순으로 조합되어 있는것을 확인 할 수 있습니다.
public const string API_KEY = "개인API_KEY입력";
public const string BASE_URL = "http://dataservice.accuweather.com/";
public const string LANGUAGE = "ko-kr";
public const string AUTOCOMPLETE_ENDPOINT =
"locations/v1/cities/autocomplete?apikey={0}&q={1}&language={2}";
public const string CURRENT_CONDITIONS_ENDPOINT =
"currentconditions/v1/{0}?apikey={1}&language={2}";
07. API Request & Response 구현
07.1 Json 사용을 위한 외부 라이브러리 설치
![](https://blog.kakaocdn.net/dn/UJqO1/btsKXz9S7RN/kYubEPYp0DSx1kQZXA57C0/img.png)
![](https://blog.kakaocdn.net/dn/bwTS2g/btsKUD7ywBK/RNRd9t2msKmUeP0YWReSKK/img.png)
07.2 API 도시 코드를 가져오는 VM 로직 구현
![](https://blog.kakaocdn.net/dn/blSRk5/btsKV1TSu4T/kpZbNon2KlYytck905qpKk/img.png)
public static async Task<List<City>> GetCities(string query)
{
// API Json 결과에서 City 객체 타입 데이터를 List에 담습니다.
List<City> cities = new List<City>();
// API 요청 URL 을 설정합니다.
string url = BASE_URL + string.Format(AUTOCOMPLETE_ENDPOINT, API_KEY, query, LANGUAGE);
// HttpClient 에서
using (HttpClient clnt = new HttpClient())
{
// url로 API 요청을 request 하고, reponse 값을 cities 리스트에 할당합니다.
var res = await clnt.GetAsync(url);
string json = await res.Content.ReadAsStringAsync();
cities = JsonConvert.DeserializeObject<List<City>>(json);
}
return cities;
}
07.3 API 도시 코드를 가져오는, 전달 구조
![](https://blog.kakaocdn.net/dn/bxJdkj/btsKWNHzKzi/RiKpruWLB72vt0kS9yrne1/img.png)
07.4 API 날씨 상세 정보를 가져오는 VM 로직 구현
![](https://blog.kakaocdn.net/dn/eyW6Wg/btsKXBGDrHS/6a0I6lgevHxxqKKeOD0Ap0/img.png)
public static async Task<CurrentConditions> GetCurrentConditions(string citikey)
{
// API Json 결과에서 CurrentConditions 객체 타입 데이터를 List에 담습니다.
CurrentConditions currentConditions = new CurrentConditions();
// API 요청 URL 을 설정합니다.
string url = BASE_URL + string.Format(CURRENT_CONDITIONS_ENDPOINT, citikey, API_KEY, LANGUAGE);
// HttpClient 에서
using (HttpClient clnt = new HttpClient())
{
// url로 API 요청을 request 하고, reponse 값을 CurrentConditions 리스트에 할당합니다.
var res = await clnt.GetAsync(url);
string json = await res.Content.ReadAsStringAsync();
currentConditions = JsonConvert.DeserializeObject<List<CurrentConditions>>(json).FirstOrDefault();
}
return currentConditions;
}
07.5 API 날씨 상세 정보를 가져오는, 전달 구조
![](https://blog.kakaocdn.net/dn/NFyf7/btsKVK6QgMD/7aZAuiiSjCpqUbI3fcMhp1/img.png)
08.