Susanna Huhtanen
ihmis.suski@gmail.com 2012
조성호
shcho@gnome.org 2017-2019.

# 로컬 라이브러리 geoName

        안내서의 이 부분에서는 비동기 호출을 활용하여 로컬 라이브러리 geoNames를 만듭니다. 이 예제의 날씨 정보는 geonames.org에서 가져오며, 프로그램에서 날씨 정보를 요청할 때 ICAO codes를 활용합니다. 모든 코드 예제를 여러분 스스로 작성하고 실행하라면 코드를 작성해넣을 편집기, 터미널, 그놈 3 이상을 컴퓨터에 설치해야 합니다. 이 안내서에서는 다음 내용을 진행합니다:

          날씨 정보를 가져올 자체 라이브러리
          geoNames용 함수 만들기
          geoNames용 메서드
          geonames.js

# 날씨 정보를 가져오는 자체 라이브러리

이 동작을 처리할 때 로컬 라이브러리로 쓸 새 파일이 필요합니다.

const Soup = imports.gi.Soup; const _httpSession = new Soup.SessionAsync(); Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());

첫번째 줄에는 로컬 라이브러리에서 필요한 라이브러리를 가져오고 초기화 합니다. Soup는 모든 http 요청을 처리합니다.

# GeoNames 함수 만들기

function GeoNames(station) { this.station = station; }

GeoNames.prototype = {

}

날씨를 가져올 때 처리할 GeoNames 함수를 만들었습니다. JavaScript에서는 일단 안에 넣고 나중에 확장할 함수를 만들 수 있습니다. GeoNames.prototyle 중괄호 안에 넣으면 됩니다.

# GeoNames용 메서드

getWeather: function(callback) { var request = Soup.Message.new('GET', 'http://api.geonames.org/weatherIcaoJSON?ICAO=' + this.station + '&username=demo'); _httpSession.queue_message(request, function(_httpSession, message) { if (message.status_code !== 200) { callback(message.status_code, null); return; } var weatherJSON = request.response_body.data; var weather = JSON.parse(weatherJSON); callback(null, weather); }); },

getIcon: function(weather){ switch (weather.weatherObservation.weatherCondition){ case "drizzle": case "light showers rain": case "light rain": return "weather-showers-scattered.svg"; case "rain": return "weather-showers.svg"; case "light snow": case "snow grains": return "weather-snow.svg"; } switch (weather.weatherObservation.clouds){ case "few clouds": case "scattered clouds": return "weather-few-clouds.svg"; case "clear sky": return "weather-clear.svg" case "broken clouds": case "overcast": return "weather-overcast.svg"; } return "weather-fog.svg"; }

GeoNames의 첫 메서드는 getWeather와 getIcon입니다. getWeather에서 Soup로 http 요청, 오류를 처리하며, 요청의 응답으로 온 정보를 우리가 사용할 수 있는 모양새로 해석합니다. getIcon에서는 getWeather에서 가져온 결과를 비교하여 현재 날씨와 일치하는 아이콘 결과를 가져옵니다. 이제 준비한 로컬 라이브러리가 있으니 쓸 수 있게 만들 시간입니다.

# geonames.js

로컬 라이브러리 전체 코드입니다. 주 프로그램 파일에서는 비동기 방식으로 호출합니다.

const Soup = imports.gi.Soup; const _httpSession = new Soup.SessionAsync(); Soup.Session.prototype.add_feature.call(_httpSession, new Soup.ProxyResolverDefault());

function GeoNames(station) { this.station = station; }

GeoNames.prototype = { getWeather: function(callback) { var request = Soup.Message.new('GET', 'http://api.geonames.org/weatherIcaoJSON?ICAO=' + this.station + '&username=demo'); _httpSession.queue_message(request, function(_httpSession, message) { if (message.status_code !== 200) { callback(message.status_code, null); return; } var weatherJSON = request.response_body.data; var weather = JSON.parse(weatherJSON); callback(null, weather); }); },

getIcon: function(weather){ switch (weather.weatherObservation.weatherCondition){ case "drizzle": case "light showers rain": case "light rain": return "weather-showers-scattered.svg"; case "rain": return "weather-showers.svg"; case "light snow": case "snow grains": return "weather-snow.svg"; } switch (weather.weatherObservation.clouds){ case "few clouds": case "scattered clouds": return "weather-few-clouds.svg"; case "clear sky": return "weather-clear.svg" case "broken clouds": case "overcast": return "weather-overcast.svg"; } return "weather-fog.svg"; } } }